/** * Class for the widget importer used in the AF Companion plugin. * * Code is mostly from the Widget Importer & Exporter plugin. * * @see https://wordpress.org/plugins/widget-importer-exporter/ * @package aftc */ class AFTC_Widget_Importer { /** * Imports widgets from a json file. * * @param string $data_file path to json file with WordPress widget export data. */ public function import_widgets( $data_file ) { // Get widgets data from file. $data = $this->process_import_file( $data_file ); // Return from this function if there was an error. if ( is_wp_error( $data ) ) { return $data; } // Import the widget data and save the results. return $this->import_data( $data ); } /** * Process import file - this parses the widget data and returns it. * * @param string $file path to json file. * @return object $data decoded JSON string */ private function process_import_file( $file ) { // File exists? if ( ! file_exists( $file ) ) { return new WP_Error( 'widget_import_file_not_found', __( 'Widget import file could not be found.', 'af-companion' ) ); } // Get file contents and decode. $data = AFTC_Helpers::data_from_file( $file ); // Return from this function if there was an error. if ( is_wp_error( $data ) ) { return $data; } return json_decode( $data ); } /** * Import widget JSON data * * @global array $wp_registered_sidebars * @param object $data JSON widget data. * @return array $results */ private function import_data( $data ) { global $wp_registered_sidebars; // Have valid data? If no data or could not decode. if ( empty( $data ) || ! is_object( $data ) ) { return new WP_Error( 'corrupted_widget_import_data', __( 'Widget import data could not be read. Please try a different file.', 'af-companion' ) ); } // Hook before import. do_action( 'af-companion/widget_importer_before_widgets_import' ); $data = apply_filters( 'af-companion/before_widgets_import_data', $data ); // Get all available widgets site supports. $available_widgets = $this->available_widgets(); // Get all existing widget instances. $widget_instances = array(); foreach ( $available_widgets as $widget_data ) { $widget_instances[ $widget_data['id_base'] ] = get_option( 'widget_' . $widget_data['id_base'] ); } // Begin results. $results = array(); // Loop import data's sidebars. foreach ( $data as $sidebar_id => $widgets ) { // Skip inactive widgets (should not be in export file). if ( 'wp_inactive_widgets' == $sidebar_id ) { continue; } // Check if sidebar is available on this site. Otherwise add widgets to inactive, and say so. if ( isset( $wp_registered_sidebars[ $sidebar_id ] ) ) { $sidebar_available = true; $use_sidebar_id = $sidebar_id; $sidebar_message_type = 'success'; $sidebar_message = ''; } else { $sidebar_available = false; $use_sidebar_id = 'wp_inactive_widgets'; // Add to inactive if sidebar does not exist in theme. $sidebar_message_type = 'error'; $sidebar_message = __( 'Sidebar does not exist in theme (moving widget to Inactive)', 'af-companion' ); } // Result for sidebar. $results[ $sidebar_id ]['name'] = ! empty( $wp_registered_sidebars[ $sidebar_id ]['name'] ) ? $wp_registered_sidebars[ $sidebar_id ]['name'] : $sidebar_id; // Sidebar name if theme supports it; otherwise ID. $results[ $sidebar_id ]['message_type'] = $sidebar_message_type; $results[ $sidebar_id ]['message'] = $sidebar_message; $results[ $sidebar_id ]['widgets'] = array(); // Loop widgets. foreach ( $widgets as $widget_instance_id => $widget ) { $fail = false; // Get id_base (remove -# from end) and instance ID number. $id_base = preg_replace( '/-[0-9]+$/', '', $widget_instance_id ); $instance_id_number = str_replace( $id_base . '-', '', $widget_instance_id ); // Does site support this widget? if ( ! $fail && ! isset( $available_widgets[ $id_base ] ) ) { $fail = true; $widget_message_type = 'error'; $widget_message = __( 'Site does not support widget', 'af-companion' ); // Explain why widget not imported. } // Filter to modify settings object before conversion to array and import. // Leave this filter here for backwards compatibility with manipulating objects (before conversion to array below). // Ideally the newer wie_widget_settings_array below will be used instead of this. $widget = apply_filters( 'af-companion/widget_settings', $widget ); // Object. // Convert multidimensional objects to multidimensional arrays. // Some plugins like Jetpack Widget Visibility store settings as multidimensional arrays. // Without this, they are imported as objects and cause fatal error on Widgets page. // If this creates problems for plugins that do actually intend settings in objects then may need to consider other approach: https://wordpress.org/support/topic/problem-with-array-of-arrays. // It is probably much more likely that arrays are used than objects, however. $widget = json_decode( json_encode( $widget ), true ); // Filter to modify settings array. // This is preferred over the older wie_widget_settings filter above. // Do before identical check because changes may make it identical to end result (such as URL replacements). $widget = apply_filters( 'af-companion/widget_settings_array', $widget ); // Does widget with identical settings already exist in same sidebar? if ( ! $fail && isset( $widget_instances[ $id_base ] ) ) { // Get existing widgets in this sidebar. $sidebars_widgets = get_option( 'sidebars_widgets' ); $sidebar_widgets = isset( $sidebars_widgets[ $use_sidebar_id ] ) ? $sidebars_widgets[ $use_sidebar_id ] : array(); // Check Inactive if that's where will go. // Loop widgets with ID base. $single_widget_instances = ! empty( $widget_instances[ $id_base ] ) ? $widget_instances[ $id_base ] : array(); foreach ( $single_widget_instances as $check_id => $check_widget ) { // Is widget in same sidebar and has identical settings? if ( in_array( "$id_base-$check_id", $sidebar_widgets ) && (array) $widget == $check_widget ) { $fail = true; $widget_message_type = 'warning'; $widget_message = __( 'Widget already exists', 'af-companion' ); // Explain why widget not imported. break; } } } // No failure. if ( ! $fail ) { // Add widget instance. $single_widget_instances = get_option( 'widget_' . $id_base ); // All instances for that widget ID base, get fresh every time. $single_widget_instances = ! empty( $single_widget_instances ) ? $single_widget_instances : array( '_multiwidget' => 1 ); // Start fresh if have to. $single_widget_instances[] = $widget; // Add it. // Get the key it was given. end( $single_widget_instances ); $new_instance_id_number = key( $single_widget_instances ); // If key is 0, make it 1. // When 0, an issue can occur where adding a widget causes data from other widget to load, and the widget doesn't stick (reload wipes it). if ( '0' === strval( $new_instance_id_number ) ) { $new_instance_id_number = 1; $single_widget_instances[ $new_instance_id_number ] = $single_widget_instances[0]; unset( $single_widget_instances[0] ); } // Move _multiwidget to end of array for uniformity. if ( isset( $single_widget_instances['_multiwidget'] ) ) { $multiwidget = $single_widget_instances['_multiwidget']; unset( $single_widget_instances['_multiwidget'] ); $single_widget_instances['_multiwidget'] = $multiwidget; } // Update option with new widget. update_option( 'widget_' . $id_base, $single_widget_instances ); // Assign widget instance to sidebar. $sidebars_widgets = get_option( 'sidebars_widgets' ); // Which sidebars have which widgets, get fresh every time. $new_instance_id = $id_base . '-' . $new_instance_id_number; // Use ID number from new widget instance. $sidebars_widgets[ $use_sidebar_id ][] = $new_instance_id; // Add new instance to sidebar. update_option( 'sidebars_widgets', $sidebars_widgets ); // Save the amended data. // After widget import action. $after_widget_import = array( 'sidebar' => $use_sidebar_id, 'sidebar_old' => $sidebar_id, 'widget' => $widget, 'widget_type' => $id_base, 'widget_id' => $new_instance_id, 'widget_id_old' => $widget_instance_id, 'widget_id_num' => $new_instance_id_number, 'widget_id_num_old' => $instance_id_number, ); do_action( 'af-companion/widget_importer_after_single_widget_import', $after_widget_import ); // Success message. if ( $sidebar_available ) { $widget_message_type = 'success'; $widget_message = __( 'Imported', 'af-companion' ); } else { $widget_message_type = 'warning'; $widget_message = __( 'Imported to Inactive', 'af-companion' ); } } // Result for widget instance. $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['name'] = isset( $available_widgets[ $id_base ]['name'] ) ? $available_widgets[ $id_base ]['name'] : $id_base; // Widget name or ID if name not available (not supported by site). $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['title'] = ! empty( $widget['title'] ) ? $widget['title'] : __( 'No Title', 'af-companion' ); // Show "No Title" if widget instance is untitled. $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['message_type'] = $widget_message_type; $results[ $sidebar_id ]['widgets'][ $widget_instance_id ]['message'] = $widget_message; } } // Hook after import. do_action( 'af-companion/widget_importer_after_widgets_import' ); // Return results. return apply_filters( 'af-companion/widget_import_results', $results ); } /** * Available widgets. * * Gather site's widgets into array with ID base, name, etc. * * @global array $wp_registered_widget_controls * @return array $available_widgets, Widget information */ private function available_widgets() { global $wp_registered_widget_controls; $widget_controls = $wp_registered_widget_controls; $available_widgets = array(); foreach ( $widget_controls as $widget ) { if ( ! empty( $widget['id_base'] ) && ! isset( $available_widgets[ $widget['id_base'] ] ) ) { $available_widgets[ $widget['id_base'] ]['id_base'] = $widget['id_base']; $available_widgets[ $widget['id_base'] ]['name'] = $widget['name']; } } return apply_filters( 'af-companion/available_widgets', $available_widgets ); } /** * Format results for log file * * @param array $results widget import results. */ public function format_results_for_log( $results ) { if ( empty( $results ) ) { esc_html_e( 'No results for widget import!', 'af-companion' ); } // Loop sidebars. foreach ( $results as $sidebar ) { echo esc_html( $sidebar['name'] ) . ' : ' . esc_html( $sidebar['message'] ) . PHP_EOL . PHP_EOL; // Loop widgets. foreach ( $sidebar['widgets'] as $widget ) { echo esc_html( $widget['name'] ) . ' - ' . esc_html( $widget['title'] ) . ' - ' . esc_html( $widget['message'] ) . PHP_EOL; } echo PHP_EOL; } } } celebrity news Archives - http://gmnewshub.com/tag/celebrity-news/ Get the latest news updates Sat, 04 Mar 2023 11:17:30 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://gmnewshub.com/wp-content/uploads/2022/02/cropped-107830453_108406640950530_5935519915960436361_n-32x32.png celebrity news Archives - http://gmnewshub.com/tag/celebrity-news/ 32 32 “Legendary Actor Tom Sizemore Passes Away at 61, Leaving Fans Heartbroken” https://gmnewshub.com/2023/03/04/legendary-actor-tom-sizemore-passes-away-at-61-leaving-fans-heartbroken/ https://gmnewshub.com/2023/03/04/legendary-actor-tom-sizemore-passes-away-at-61-leaving-fans-heartbroken/#respond Sat, 04 Mar 2023 11:09:01 +0000 https://gmnewshub.com/?p=81 It is with great sadness that we learned of the passing of Tom Sizemore, the renowned American actor who starred in several films and television shows. Sizemore, best known for his role as Sergeant Horvath in the critically acclaimed movie “Saving Private Ryan,” died at the age of 61. Throughout his career, Sizemore delivered several […]

The post “Legendary Actor Tom Sizemore Passes Away at 61, Leaving Fans Heartbroken” appeared first on .

]]>
It is with great sadness that we learned of the passing of Tom Sizemore, the renowned American actor who starred in several films and television shows. Sizemore, best known for his role as Sergeant Horvath in the critically acclaimed movie “Saving Private Ryan,” died at the age of 61.

Throughout his career, Sizemore delivered several memorable performances that earned him numerous accolades and a dedicated fan base. He was a versatile actor who effortlessly transitioned between dramatic and comedic roles, showcasing his incredible range and talent.

Despite his undeniable success, Sizemore struggled with substance abuse and legal troubles throughout his career. However, he remained a beloved figure in the entertainment industry, and his legacy will live on through his unforgettable performances.

Sizemore’s passing serves as a reminder of the fragility of life and the importance of cherishing every moment. As fans, we can honor his memory by celebrating his contributions to the world of film and television and remembering the joy he brought to so many through his work.

Rest in peace, Tom Sizemore. You will be deeply missed, but never forgotten.

The post “Legendary Actor Tom Sizemore Passes Away at 61, Leaving Fans Heartbroken” appeared first on .

]]>
https://gmnewshub.com/2023/03/04/legendary-actor-tom-sizemore-passes-away-at-61-leaving-fans-heartbroken/feed/ 0
“Breaking News: Jon Hamm of Mad Men Fame Set to Tie the Knot with Anna Osceola!” https://gmnewshub.com/2023/03/01/breaking-news-jon-hamm-of-mad-men-fame-set-to-tie-the-knot-with-anna-osceola/ https://gmnewshub.com/2023/03/01/breaking-news-jon-hamm-of-mad-men-fame-set-to-tie-the-knot-with-anna-osceola/#respond Wed, 01 Mar 2023 05:06:59 +0000 https://gmnewshub.com/?p=39 In exciting news for Mad Men fans and celebrity gossip enthusiasts, Jon Hamm and Anna Osceola are reportedly engaged! The couple, who met on the set of Mad Men in 2015, have been dating for several years. Hamm, who played the iconic character of Don Draper on the hit AMC series, has been relatively private […]

The post “Breaking News: Jon Hamm of Mad Men Fame Set to Tie the Knot with Anna Osceola!” appeared first on .

]]>
In exciting news for Mad Men fans and celebrity gossip enthusiasts, Jon Hamm and Anna Osceola are reportedly engaged! The couple, who met on the set of Mad Men in 2015, have been dating for several years.

Hamm, who played the iconic character of Don Draper on the hit AMC series, has been relatively private about his personal life in the past. However, the news of his engagement to Osceola, an actress who had a small role on Mad Men, has quickly spread across social media and entertainment news outlets.

Fans of the show have expressed their delight at the news, with many taking to Twitter to share their congratulations and reminisce about Hamm’s performance as Draper. The couple has not yet made an official statement regarding their engagement, but sources close to them have confirmed the news to various media outlets.

As with any celebrity engagement, there has been speculation about the ring. While there are no official details yet, experts in the industry estimate that the ring is likely to be a stunning piece of jewelry, given Hamm’s reported net worth of $30 million.

Overall, the news of Jon Hamm and Anna Osceola’s engagement has caused quite a stir among fans of Mad Men and the wider public. It will be interesting to see what the future holds for the happy couple!

The post “Breaking News: Jon Hamm of Mad Men Fame Set to Tie the Knot with Anna Osceola!” appeared first on .

]]>
https://gmnewshub.com/2023/03/01/breaking-news-jon-hamm-of-mad-men-fame-set-to-tie-the-knot-with-anna-osceola/feed/ 0