lubuntu.me/plugins/so-widgets-bundle/so-widgets-bundle.php
2018-01-26 15:50:15 +01:00

796 lines
24 KiB
PHP

<?php
/*
Plugin Name: SiteOrigin Widgets Bundle
Description: A collection of all widgets, neatly bundled into a single plugin. It's also a framework to code your own widgets on top of.
Version: 1.11.3
Text Domain: so-widgets-bundle
Domain Path: /lang
Author: SiteOrigin
Author URI: https://siteorigin.com
Plugin URI: https://siteorigin.com/widgets-bundle/
License: GPL3
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
*/
define('SOW_BUNDLE_VERSION', '1.11.3');
define('SOW_BUNDLE_BASE_FILE', __FILE__);
// Allow JS suffix to be pre-set
if( !defined( 'SOW_BUNDLE_JS_SUFFIX' ) ) {
define('SOW_BUNDLE_JS_SUFFIX', '.min');
}
if( !function_exists('siteorigin_widget_get_plugin_path') ) {
include plugin_dir_path(__FILE__).'base/base.php';
include plugin_dir_path(__FILE__).'icons/icons.php';
}
if( ! class_exists('SiteOrigin_Widgets_Bundle_Compatibility') ) {
include_once plugin_dir_path( __FILE__ ) . 'compat/compat.php';
}
class SiteOrigin_Widgets_Bundle {
private $widget_folders;
/**
* @var array The array of default widgets.
*/
static $default_active_widgets = array(
'button' => true,
'google-map' => true,
'image' => true,
'slider' => true,
'post-carousel' => true,
'editor' => true,
);
function __construct(){
add_action('admin_init', array($this, 'admin_activate_widget') );
add_action('admin_menu', array($this, 'admin_menu_init') );
add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts') );
// All the ajax actions
add_action('wp_ajax_so_widgets_bundle_manage', array($this, 'admin_ajax_manage_handler') );
add_action('wp_ajax_sow_get_javascript_variables', array($this, 'admin_ajax_get_javascript_variables') );
add_action('wp_ajax_so_widgets_setting_form', array($this, 'admin_ajax_settings_form') );
add_action('wp_ajax_so_widgets_setting_save', array($this, 'admin_ajax_settings_save') );
// Initialize the widgets, but do it fairly late
add_action( 'plugins_loaded', array($this, 'set_plugin_textdomain'), 1 );
add_action( 'after_setup_theme', array($this, 'get_widget_folders'), 11 );
add_action( 'after_setup_theme', array($this, 'load_widget_plugins'), 11 );
// Add the plugin_action_links links.
add_action( 'plugin_action_links_' . plugin_basename(__FILE__), array($this, 'plugin_action_links') );
add_action( 'admin_init', array($this, 'plugin_version_check') );
add_action( 'siteorigin_widgets_version_update', array( $this, 'handle_update' ), 10, 2 );
add_action( 'admin_notices', array( $this, 'display_admin_notices') );
// Actions for clearing widget cache
add_action( 'switch_theme', array($this, 'clear_widget_cache') );
add_action( 'activated_plugin', array($this, 'clear_widget_cache') );
add_action( 'upgrader_process_complete', array($this, 'clear_widget_cache') );
// These filters are used to activate any widgets that are missing.
add_filter( 'siteorigin_panels_data', array($this, 'load_missing_widgets') );
add_filter( 'siteorigin_panels_prebuilt_layout', array($this, 'load_missing_widgets') );
add_filter( 'siteorigin_panels_widget_object', array($this, 'load_missing_widget'), 10, 2 );
add_filter( 'wp_enqueue_scripts', array($this, 'register_general_scripts') );
add_filter( 'wp_enqueue_scripts', array($this, 'enqueue_active_widgets_scripts') );
// This is a temporary filter to disable the new Jetpack Grunion contact form editor.
add_filter( 'tmp_grunion_allow_editor_view', '__return_false' );
}
/**
* Get the single of this plugin
*
* @return SiteOrigin_Widgets_Bundle
*/
static function single() {
static $single;
if( empty($single) ) {
$single = new SiteOrigin_Widgets_Bundle();
}
return $single;
}
/**
* Set the text domain for the plugin
*
* @action plugins_loaded
*/
function set_plugin_textdomain(){
load_plugin_textdomain('so-widgets-bundle', false, dirname( plugin_basename( __FILE__ ) ). '/lang/');
}
/**
* This clears the file cache.
*
* @action admin_init
*/
function plugin_version_check(){
$active_version = get_option( 'siteorigin_widget_bundle_version' );
$is_new = empty($active_version) || version_compare( $active_version, SOW_BUNDLE_VERSION, '<' );
$is_new = apply_filters( 'siteorigin_widgets_is_new_version', $is_new );
if( $is_new ) {
update_option( 'siteorigin_widget_bundle_version', SOW_BUNDLE_VERSION );
// If this is a new version, then trigger an action to let widgets handle the updates.
do_action( 'siteorigin_widgets_version_update', SOW_BUNDLE_VERSION, $active_version );
$this->clear_widget_cache();
}
}
/**
* This should call any necessary functions when the plugin has been updated.
*
* @action siteorigin_widgets_version_update
*/
function handle_update($old_version, $new_version) {
//Always check for new widgets.
$this->check_for_new_widgets();
}
/**
* Deletes any CSS generated by/for the widgets.
* Called on 'upgrader_process_complete', 'switch_theme', and 'activated_plugin' actions.
* Can also be called directly on the `SiteOrigin_Widgets_Bundle` singleton class.
*
* @action upgrader_process_complete Occurs after any theme, plugin or the WordPress core is updated to a new version.
* @action switch_theme Occurs after switching to a different theme.
* @action activated_plugin Occurs after a plugin has been activated.
*
*/
function clear_widget_cache() {
// Remove all cached CSS for SiteOrigin Widgets
if( function_exists('WP_Filesystem') && WP_Filesystem() ) {
global $wp_filesystem;
$upload_dir = wp_upload_dir();
// Remove any old widget cache files, if they exist.
$list = $wp_filesystem->dirlist( $upload_dir['basedir'] . '/siteorigin-widgets/' );
if( !empty($list) ) {
foreach($list as $file) {
// Delete the file
$wp_filesystem->delete( $upload_dir['basedir'] . '/siteorigin-widgets/' . $file['name'] );
}
}
}
}
/**
* Setup and return the widget folders
*/
function check_for_new_widgets() {
// get list of available widgets
$widgets = array_keys( $this->get_widgets_list() );
// get option for previously installed widgets
$old_widgets = get_option( 'siteorigin_widgets_old_widgets' );
// if this has never been set before, it's probably a new installation so we don't want to notify for all the widgets
if ( empty( $old_widgets ) ) {
update_option( 'siteorigin_widgets_old_widgets', implode( ',', $widgets ) );
return;
}
$old_widgets = explode( ',', $old_widgets );
$new_widgets = array_diff( $widgets, $old_widgets );
if ( ! empty( $new_widgets ) ) {
update_option( 'siteorigin_widgets_new_widgets', $new_widgets );
update_option( 'siteorigin_widgets_old_widgets', implode( ',', $widgets ) );
}
}
function display_admin_notices() {
$new_widgets = get_option( 'siteorigin_widgets_new_widgets' );
if ( empty( $new_widgets ) ) {
return;
}
?>
<div class="updated">
<p><?php echo __( 'New widgets available in the ') . '<a href="' . admin_url('plugins.php?page=so-widgets-plugins') . '">' . __('SiteOrigin Widgets Bundle', 'so-widgets-bundle' ) . '</a>!'; ?></p>
<?php
$default_headers = array(
'Name' => 'Widget Name',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI',
'WidgetURI' => 'Widget URI',
'VideoURI' => 'Video URI',
);
foreach ( $new_widgets as $widget_file_path ) {
preg_match( '/.*[\/\\\\](.*).php/', $widget_file_path, $match );
$widget = get_file_data( $widget_file_path, $default_headers, 'siteorigin-widget' );
$name = empty( $widget['Name'] ) ? $match[1] : $widget['Name'];
$description = empty( $widget['Description'] ) ? __( 'A new widget!', 'so-widgets-bundle' ) : $widget['Description'];
?>
<p><b><?php echo esc_html( $name . ' - ' . $description) ?></b></p>
<?php
}
?>
</div>
<?php
update_option( 'siteorigin_widgets_new_widgets', array() );
}
/**
* Setup and return the widget folders
*/
function get_widget_folders(){
if( empty($this->widget_folders) ) {
// We can use this filter to add more folders to use for widgets
$this->widget_folders = apply_filters('siteorigin_widgets_widget_folders', array(
plugin_dir_path(__FILE__) . 'widgets/'
) );
}
return $this->widget_folders;
}
/**
* Load all the widgets if their plugins are not already active.
*
* @action plugins_loaded
*/
function load_widget_plugins(){
// Load all the widget we currently have active and filter them
$active_widgets = $this->get_active_widgets();
$widget_folders = $this->get_widget_folders();
foreach( $active_widgets as $widget_id => $active ) {
if( empty($active) ) continue;
foreach( $widget_folders as $folder ) {
if ( !file_exists($folder . $widget_id.'/'.$widget_id.'.php') ) continue;
// Include this widget file
include_once $folder . $widget_id.'/'.$widget_id.'.php';
}
}
}
/**
* Get a list of currently active widgets.
*
* @param bool $filter
*
* @return mixed|void
*/
function get_active_widgets( $filter = true ){
// Basic caching of the current active widgets
$active_widgets = wp_cache_get( 'active_widgets', 'siteorigin_widgets' );
if( empty($active_widgets) ) {
$active_widgets = get_option( 'siteorigin_widgets_active', array() );
$active_widgets = wp_parse_args( $active_widgets, apply_filters( 'siteorigin_widgets_default_active', self::$default_active_widgets ) );
// Migrate any old names
foreach ( $active_widgets as $widget_name => $is_active ) {
if ( substr( $widget_name, 0, 3 ) !== 'so-' ) {
continue;
}
if ( preg_match( '/so-([a-z\-]+)-widget/', $widget_name, $matches ) && ! isset( $active_widgets[ $matches[1] ] ) ) {
unset( $active_widgets[ $widget_name ] );
$active_widgets[ $matches[1] ] = $is_active;
}
}
if ( $filter ) {
$active_widgets = apply_filters( 'siteorigin_widgets_active_widgets', $active_widgets );
}
wp_cache_add( 'active_widgets', $active_widgets, 'siteorigin_widgets' );
}
return $active_widgets;
}
/**
* Enqueue the admin page stuff.
*/
function admin_enqueue_scripts($prefix) {
if( $prefix != 'plugins_page_so-widgets-plugins' ) return;
wp_enqueue_style( 'siteorigin-widgets-manage-admin', plugin_dir_url( __FILE__ ) . 'admin/admin.css', array(), SOW_BUNDLE_VERSION );
wp_enqueue_script( 'siteorigin-widgets-trianglify', plugin_dir_url( __FILE__ ) . 'admin/trianglify' . SOW_BUNDLE_JS_SUFFIX . '.js', array(), SOW_BUNDLE_VERSION );
wp_enqueue_script( 'siteorigin-widgets-manage-admin', plugin_dir_url( __FILE__ ) . 'admin/admin' . SOW_BUNDLE_JS_SUFFIX . '.js', array(), SOW_BUNDLE_VERSION );
wp_localize_script( 'siteorigin-widgets-manage-admin', 'soWidgetsAdmin', array(
'toggleUrl' => wp_nonce_url( admin_url('admin-ajax.php?action=so_widgets_bundle_manage'), 'manage_so_widget' )
) );
}
/**
* The fallback (from ajax) URL handler for activating or deactivating a widget
*/
function admin_activate_widget() {
if(
current_user_can( apply_filters( 'siteorigin_widgets_admin_menu_capability', 'manage_options' ) )
&& !empty($_GET['page'])
&& $_GET['page'] == 'so-widgets-plugins'
&& !empty( $_GET['widget_action'] ) && !empty( $_GET['widget'] )
&& isset($_GET['_wpnonce'])
&& wp_verify_nonce($_GET['_wpnonce'], 'siteorigin_widget_action')
) {
switch($_GET['widget_action']) {
case 'activate':
$this->activate_widget( $_GET['widget'] );
break;
case 'deactivate':
$this->deactivate_widget( $_GET['widget'] );
break;
}
// Redirect and clear all the args
wp_redirect( add_query_arg( array(
'_wpnonce' => false,
'widget_action_done' => 'true',
) ) );
}
}
/**
* Handler for activating and deactivating widgets.
*
* @action wp_ajax_so_widgets_bundle_manage
*/
function admin_ajax_manage_handler(){
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'manage_so_widget' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 403 );
}
if ( ! current_user_can( apply_filters( 'siteorigin_widgets_admin_menu_capability', 'manage_options' ) ) ) {
wp_die( __( 'Insufficient permissions.', 'so-widgets-bundle' ), 403 );
}
if ( empty( $_POST['widget'] ) ) {
wp_die( __( 'Invalid post.', 'so-widgets-bundle' ), 400 );
}
if( !empty($_POST['active']) ) $this->activate_widget($_POST['widget']);
else $this->deactivate_widget( $_POST['widget'] );
// Send a kind of dummy response.
wp_send_json( array( 'done' => true ) );
}
/**
* Handler for displaying the Widget settings form.
*
* @action wp_ajax_so_widgets_setting_form
*/
function admin_ajax_settings_form(){
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'display-widget-form' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 403 );
}
if ( ! current_user_can( apply_filters( 'siteorigin_widgets_admin_menu_capability', 'manage_options' ) ) ) {
wp_die( __( 'Insufficient permissions.', 'so-widgets-bundle' ), 403 );
}
$widget_objects = $this->get_widget_objects();
$widget_path = empty( $_GET['id'] ) ? false : wp_normalize_path( WP_CONTENT_DIR ) . $_GET['id'];
$widget_object = empty( $widget_objects[ $widget_path ] ) ? false : $widget_objects[ $widget_path ];
if ( empty( $widget_object ) || ! $widget_object->has_form( 'settings' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 400 );
}
unset( $widget_object->widget_options['has_preview'] );
$action_url = admin_url( 'admin-ajax.php' );
$action_url = add_query_arg( array(
'id' => $_GET['id'],
'action' => 'so_widgets_setting_save',
), $action_url );
$action_url = wp_nonce_url( $action_url, 'save-widget-settings' );
$value = $widget_object->get_global_settings();
?>
<form method="post" action="<?php echo esc_url( $action_url ) ?>" target="so-widget-settings-save">
<?php $widget_object->form( $value, 'settings' ) ?>
</form>
<?php
wp_die();
}
/**
* Handler for saving the widget settings.
*
* @action wp_ajax_so_widgets_setting_save
*/
function admin_ajax_settings_save(){
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'save-widget-settings' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 403 );
}
if ( ! current_user_can( apply_filters( 'siteorigin_widgets_admin_menu_capability', 'manage_options' ) ) ) {
wp_die( __( 'Insufficient permissions.', 'so-widgets-bundle' ), 403 );
}
$widget_objects = $this->get_widget_objects();
$widget_path = empty( $_GET['id'] ) ? false : wp_normalize_path( WP_CONTENT_DIR ) . $_GET['id'];
$widget_object = empty( $widget_objects[ $widget_path ] ) ? false : $widget_objects[ $widget_path ];
if ( empty( $widget_object ) || ! $widget_object->has_form( 'settings' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 400 );
}
$form_values = array_shift( array_shift( array_values( $_POST ) ) );
$widget_object->save_global_settings( $form_values );
wp_send_json_success();
}
/**
* Add the admin menu page.
*
* @action admin_menu
*/
function admin_menu_init(){
add_plugins_page(
__('SiteOrigin Widgets', 'so-widgets-bundle'),
__('SiteOrigin Widgets', 'so-widgets-bundle'),
apply_filters('siteorigin_widgets_admin_menu_capability', 'manage_options'),
'so-widgets-plugins',
array($this, 'admin_page')
);
}
/**
* Display the admin page.
*/
function admin_page(){
$widgets = $this->get_widgets_list();
$widget_objects = $this->get_widget_objects();
if(
isset($_GET['widget_action_done'])
&& !empty($_GET['widget_action'])
&& !empty($_GET['widget'])
&& !empty( $widgets[ $_GET['widget'].'/'.$_GET['widget'].'.php' ] )
) {
?>
<div class="updated">
<p>
<?php
printf(
__('%s was %s', 'so-widgets-bundle'),
$widgets[ $_GET['widget'].'/'.$_GET['widget'].'.php' ]['Name'],
$_GET['widget_action'] == 'activate' ? __('Activated', 'so-widgets-bundle') : __('Deactivated', 'so-widgets-bundle')
)
?>
</p>
</div>
<?php
}
// Enqueue all the admin page scripts
foreach( $widget_objects as $widget ) {
$widget->enqueue_scripts( 'settings' );
}
include plugin_dir_path(__FILE__).'admin/tpl/admin.php';
}
/**
* Get javascript variables for admin.
*/
function admin_ajax_get_javascript_variables() {
if ( empty( $_REQUEST['_widgets_nonce'] ) ||
! wp_verify_nonce( $_REQUEST['_widgets_nonce'], 'widgets_action' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 403 );
}
$widget_class = $_POST['widget'];
global $wp_widget_factory;
if ( empty( $wp_widget_factory->widgets[ $widget_class ] ) ) {
wp_die( __( 'Invalid post.', 'so-widgets-bundle' ), 400 );
}
$widget = $wp_widget_factory->widgets[ $widget_class ];
if ( ! method_exists( $widget, 'get_javascript_variables' ) ) {
wp_die( __( 'Invalid request.', 'so-widgets-bundle' ), 400 );
}
$result = $widget->get_javascript_variables();
wp_send_json( $result );
}
/**
* Activate a widget
*
* @param string $widget_id The ID of the widget that we're activating.
* @param bool $include Should we include the widget, to make it available in the current request.
*
* @return bool
*/
function activate_widget( $widget_id, $include = true ){
$exists = false;
foreach( $this->widget_folders as $folder ) {
if( !file_exists($folder . $widget_id . '/' . $widget_id . '.php') ) continue;
$exists = true;
}
if( !$exists ) return false;
// There are times when we activate several widgets at once, so clear the cache.
wp_cache_delete( 'siteorigin_widgets_active', 'options' );
$active_widgets = $this->get_active_widgets();
$active_widgets[$widget_id] = true;
update_option( 'siteorigin_widgets_active', $active_widgets );
wp_cache_delete( 'active_widgets', 'siteorigin_widgets' );
// If we don't want to include the widget files, then our job here is done.
if( !$include ) return;
// Now, lets actually include the files
include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
foreach( $this->widget_folders as $folder ) {
if( !file_exists($folder . $widget_id . '/' . $widget_id . '.php') ) continue;
include_once $folder . $widget_id . '/' . $widget_id . '.php';
if( has_action('widgets_init') ) {
SiteOrigin_Widgets_Widget_Manager::single()->widgets_init();
}
}
return true;
}
/**
* Include a widget that might not have been registered.
*
* @param $widget_id
*
* @return bool
*/
function include_widget( $widget_id ) {
$folders = $this->get_widget_folders();
foreach( $folders as $folder ) {
if( !file_exists($folder . $widget_id . '/' . $widget_id . '.php') ) continue;
include_once $folder . $widget_id . '/' . $widget_id . '.php';
return true;
}
return false;
}
/**
* Deactivate a widget
*
* @param $id
*/
function deactivate_widget($id){
$active_widgets = $this->get_active_widgets();
$active_widgets[$id] = false;
update_option( 'siteorigin_widgets_active', $active_widgets );
wp_cache_delete( 'active_widgets', 'siteorigin_widgets' );
}
/**
* Gets a list of all available widgets
*/
function get_widgets_list(){
$active = $this->get_active_widgets();
$folders = $this->get_widget_folders();
$default_headers = array(
'Name' => 'Widget Name',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI',
'WidgetURI' => 'Widget URI',
'VideoURI' => 'Video URI',
);
$widgets = array();
foreach( $folders as $folder ) {
$files = glob( $folder . '*/*.php' );
foreach($files as $file) {
$widget = get_file_data( $file, $default_headers, 'siteorigin-widget' );
//skip the file if it's missing a name
if ( empty( $widget['Name'] ) ) {
continue;
}
$f = pathinfo($file);
$id = $f['filename'];
$widget['ID'] = $id;
$widget['Active'] = !empty( $active[ $id ] );
$widget['File'] = $file;
$widgets[ $file ] = $widget;
}
}
// Sort the widgets alphabetically
uasort( $widgets, array($this, 'widget_uasort') );
return $widgets;
}
/**
* Get instances of all the widgets. Even ones that are not active.
*/
private function get_widget_objects(){
$folders = $this->get_widget_folders();
$widgets = array();
$manager = SiteOrigin_Widgets_Widget_Manager::single();
foreach( $folders as $folder ) {
$files = glob( wp_normalize_path( $folder ) . '*/*.php' );
foreach ($files as $file) {
$file = wp_normalize_path( $file );
include_once $file;
$widget_class = $manager->get_class_from_path( $file );
if( $widget_class && class_exists( $widget_class ) ) {
$widgets[ $file ] = new $widget_class();
}
}
}
return $widgets;
}
/**
* Sorting function to sort widgets by name
*
* @param $widget_a
* @param $widget_b
*
* @return int
*/
function widget_uasort($widget_a, $widget_b) {
return $widget_a['Name'] > $widget_b['Name'] ? 1 : -1;
}
/**
* Look in Page Builder data for any missing widgets.
*
* @param $data
*
* @return mixed
*
* @action siteorigin_panels_data
*/
function load_missing_widgets( $data ){
if(empty($data['widgets'])) return $data;
global $wp_widget_factory;
foreach($data['widgets'] as $widget) {
if( empty( $widget['panels_info']['class'] ) ) continue;
if( !empty( $wp_widget_factory->widgets[ $widget['panels_info']['class'] ] ) ) continue;
$this->load_missing_widget( false, $widget['panels_info']['class'] );
}
return $data;
}
/**
* Attempt to load a single missing widget.
*
* @param $the_widget
* @param $class
*
* @return
*/
function load_missing_widget( $the_widget, $class ){
// We only want to worry about missing widgets
if( ! empty( $the_widget ) ) return $the_widget;
if( preg_match('/SiteOrigin_Widgets?_([A-Za-z]+)_Widget/', $class, $matches) ) {
$name = $matches[1];
$id = strtolower( implode( '-', array_filter( preg_split( '/(?=[A-Z])/', $name ) ) ) );
if( $id == 'contact-form' ) {
// Handle the special case of the contact form widget, which is incorrectly named
$id = 'contact';
}
$this->activate_widget($id, true);
global $wp_widget_factory;
if( !empty($wp_widget_factory->widgets[$class]) ) return $wp_widget_factory->widgets[$class];
}
return $the_widget;
}
/**
* Add action links.
*/
function plugin_action_links($links){
unset( $links['edit'] );
$links['manage'] = '<a href="' . admin_url('plugins.php?page=so-widgets-plugins') . '">'.__('Manage Widgets', 'so-widgets-bundle').'</a>';
$links['support'] = '<a href="https://siteorigin.com/thread/" target="_blank" rel="noopener noreferrer">'.__('Support', 'so-widgets-bundle').'</a>';
return $links;
}
function register_general_scripts() {
wp_register_script( 'sow-fittext',
plugin_dir_url( SOW_BUNDLE_BASE_FILE ) . 'js/sow.jquery.fittext' . SOW_BUNDLE_JS_SUFFIX . '.js',
array( 'jquery' ),
'1.2',
true
);
wp_register_script(
'dessandro-imagesLoaded',
plugin_dir_url( SOW_BUNDLE_BASE_FILE ) . 'js/lib/imagesloaded.pkgd' . SOW_BUNDLE_JS_SUFFIX . '.js',
array( 'jquery' ),
'3.2.0',
true
);
wp_register_script(
'dessandro-packery',
plugin_dir_url( SOW_BUNDLE_BASE_FILE ) . 'js/lib/packery.pkgd' . SOW_BUNDLE_JS_SUFFIX . '.js',
array( 'jquery' ),
'1.4.3',
true
);
wp_register_script(
'sow-google-map',
plugin_dir_url( SOW_BUNDLE_BASE_FILE ) . 'js/sow.google.map' . SOW_BUNDLE_JS_SUFFIX . '.js',
array( 'jquery' ),
SOW_BUNDLE_VERSION
);
}
/**
* Ensure active widgets' scripts are enqueued at the right time.
*/
function enqueue_active_widgets_scripts() {
global $wp_registered_widgets;
$sidebars_widgets = wp_get_sidebars_widgets();
if( empty($sidebars_widgets) ) return;
foreach( $sidebars_widgets as $sidebar => $widgets ) {
if ( ! empty( $widgets ) && $sidebar !== "wp_inactive_widgets") {
foreach ( $widgets as $i => $id ) {
if ( ! empty( $wp_registered_widgets[$id] ) ) {
$widget = $wp_registered_widgets[$id]['callback'][0];
if ( !empty($widget) && is_object($widget) && is_subclass_of($widget, 'SiteOrigin_Widget') && is_active_widget( false, false, $widget->id_base ) ) {
/* @var $widget SiteOrigin_Widget */
$opt_wid = get_option( 'widget_' . $widget->id_base );
preg_match( '/-([0-9]+$)/', $id, $num_match );
$widget_instance = $opt_wid[ $num_match[1] ];
$widget->enqueue_frontend_scripts( $widget_instance);
$widget->generate_and_enqueue_instance_styles( $widget_instance );
}
}
}
}
}
}
}
// create the initial single
SiteOrigin_Widgets_Bundle::single();
// Initialize the Meta Box Manager
global $sow_meta_box_manager;
$sow_meta_box_manager = SiteOrigin_Widget_Meta_Box_Manager::single();