Example #1
0
/**
 * Display list of the available widgets, either all or matching search.
 *
 * The search parameter are search terms separated by spaces.
 *
 * @since unknown
 *
 * @param string $show Optional, default is all. What to display, can be 'all', 'unused', or 'used'.
 * @param string $_search Optional. Search for widgets. Should be unsanitized.
 */
function wp_list_widgets()
{
    global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
    $sort = $wp_registered_widgets;
    usort($sort, create_function('$a, $b', 'return strnatcasecmp( $a["name"], $b["name"] );'));
    $done = array();
    foreach ($sort as $widget) {
        if (in_array($widget['callback'], $done, true)) {
            // We already showed this multi-widget
            continue;
        }
        $sidebar = is_active_widget($widget['callback'], $widget['id'], false, false);
        $done[] = $widget['callback'];
        if (!isset($widget['params'][0])) {
            $widget['params'][0] = array();
        }
        $args = array('widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template');
        if (isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number'])) {
            $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
            $args['_temp_id'] = "{$id_base}-__i__";
            $args['_multi_num'] = next_widget_id_number($id_base);
            $args['_add'] = 'multi';
        } else {
            $args['_add'] = 'single';
            if ($sidebar) {
                $args['_hide'] = '1';
            }
        }
        $args = wp_list_widget_controls_dynamic_sidebar(array(0 => $args, 1 => $widget['params'][0]));
        call_user_func_array('wp_widget_control', $args);
    }
}
 public function render_content()
 {
     global $wp_registered_widgets;
     require_once ABSPATH . '/wp-admin/includes/widgets.php';
     $widget = $wp_registered_widgets[$this->widget_id];
     if (!isset($widget['params'][0])) {
         $widget['params'][0] = array();
     }
     $args = array('widget_id' => $widget['id'], 'widget_name' => $widget['name']);
     $args = wp_list_widget_controls_dynamic_sidebar(array(0 => $args, 1 => $widget['params'][0]));
     $control = Widget_Customizer::get_widget_control($args);
     echo $control;
     // xss ok
 }
 /**
  * Gather control params for exporting to JavaScript.
  *
  * @global array $wp_registered_widgets
  */
 public function to_json()
 {
     global $wp_registered_widgets;
     parent::to_json();
     $exported_properties = array('widget_id', 'widget_id_base', 'sidebar_id', 'width', 'height', 'is_wide');
     foreach ($exported_properties as $key) {
         $this->json[$key] = $this->{$key};
     }
     // Get the widget_control and widget_content.
     require_once ABSPATH . '/wp-admin/includes/widgets.php';
     $widget = $wp_registered_widgets[$this->widget_id];
     if (!isset($widget['params'][0])) {
         $widget['params'][0] = array();
     }
     $args = array('widget_id' => $widget['id'], 'widget_name' => $widget['name']);
     $args = wp_list_widget_controls_dynamic_sidebar(array(0 => $args, 1 => $widget['params'][0]));
     $widget_control_parts = $this->manager->widgets->get_widget_control_parts($args);
     $this->json['widget_control'] = $widget_control_parts['control'];
     $this->json['widget_content'] = $widget_control_parts['content'];
 }
Example #4
0
/**
 * Display list of widgets, either all or matching search.
 *
 * The search parameter are search terms separated by spaces.
 *
 * @since unknown
 *
 * @param string $show Optional, default is all. What to display, can be 'all', 'unused', or 'used'.
 * @param string $_search Optional. Search for widgets. Should be unsanitized.
 */
function wp_list_widgets($show = 'all', $_search = false)
{
    global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
    if ($_search) {
        // sanitize
        $search = preg_replace('/[^\\w\\s]/', '', $_search);
        // array of terms
        $search_terms = preg_split('/[\\s]/', $search, -1, PREG_SPLIT_NO_EMPTY);
    } else {
        $search_terms = array();
    }
    if (!in_array($show, array('all', 'unused', 'used'))) {
        $show = 'all';
    }
    ?>

	<ul id='widget-list'>
		<?php 
    $no_widgets_shown = true;
    $already_shown = array();
    foreach ($wp_registered_widgets as $name => $widget) {
        if ('all' == $show && in_array($widget['callback'], $already_shown)) {
            // We already showed this multi-widget
            continue;
        }
        if ($search_terms) {
            $hit = false;
            // Simple case-insensitive search.  Boolean OR.
            $search_text = preg_replace('/[^\\w]/', '', $widget['name']);
            if (isset($widget['description'])) {
                $search_text .= preg_replace('/[^\\w]/', '', $widget['description']);
            }
            foreach ($search_terms as $search_term) {
                if (stristr($search_text, $search_term)) {
                    $hit = true;
                    break;
                }
            }
            if (!$hit) {
                continue;
            }
        }
        $sidebar = is_active_widget($widget['callback'], $widget['id']);
        if ('unused' == $show && $sidebar || 'used' == $show && !$sidebar) {
            continue;
        }
        if (!isset($widget['params'][0])) {
            $widget['params'][0] = array();
        }
        ob_start();
        $args = wp_list_widget_controls_dynamic_sidebar(array(0 => array('widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template', '_show' => $show), 1 => $widget['params'][0]));
        $sidebar_args = call_user_func_array('wp_widget_control', $args);
        $widget_control_template = ob_get_contents();
        ob_end_clean();
        $widget_id = $widget['id'];
        // save this for later in case we mess with $widget['id']
        $is_multi = false !== strpos($widget_control_template, '%i%');
        if (!$sidebar || $is_multi) {
            $add_query = array('sidebar' => $sidebar, 'key' => false, 'edit' => false);
            if ('all' == $show && $is_multi) {
                // it's a multi-widget.  We only need to show it in the list once.
                $already_shown[] = $widget['callback'];
                $num = (int) array_pop($ids = explode('-', $widget['id']));
                $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
                // so that we always add a new one when clicking "add"
                while (isset($wp_registered_widgets["{$id_base}-{$num}"])) {
                    $num++;
                }
                $widget['id'] = "{$id_base}-{$num}";
                $add_query['base'] = $id_base;
                $add_query['key'] = $num;
                $add_query['sidebar'] = $GLOBALS['sidebar'];
            }
            $add_query['add'] = $widget['id'];
            $action = 'add';
            $add_url = clean_url(wp_nonce_url(add_query_arg($add_query), "add-widget_{$widget['id']}"));
        } else {
            $action = 'edit';
            $edit_url = clean_url(add_query_arg(array('sidebar' => $sidebar, 'edit' => $widget['id'], 'key' => array_search($widget['id'], $sidebars_widgets[$sidebar]))));
            $widget_control_template = '<textarea rows="1" cols="1">' . htmlspecialchars($widget_control_template) . '</textarea>';
        }
        $widget_control_template = $sidebar_args['before_widget'] . $widget_control_template . $sidebar_args['after_widget'];
        $no_widgets_shown = false;
        if ('all' != $show && $sidebar_args['_widget_title']) {
            $widget_title = $sidebar_args['_widget_title'];
        } else {
            $widget_title = $widget['name'];
        }
        ?>

		<li id="widget-list-item-<?php 
        echo attribute_escape($widget['id']);
        ?>
" class="widget-list-item">
			<h4 class="widget-title widget-draggable">

				<span><?php 
        echo $widget_title;
        ?>
</span>

				<?php 
        if ('add' == $action) {
            ?>

				<a class="widget-action widget-control-add" href="<?php 
            echo $add_url;
            ?>
"><?php 
            _e('Add');
            ?>
</a>

				<?php 
        } elseif ('edit' == $action) {
            // We echo a hidden edit link for the sake of the JS.  Edit links are shown (needlessly?) after a widget is added.
            ?>

				<a class="widget-action widget-control-edit" href="<?php 
            echo $edit_url;
            ?>
" style="display: none;"><?php 
            _e('Edit');
            ?>
</a>

				<?php 
        }
        ?>

				<br class="clear" />

			</h4>


			<ul id="widget-control-info-<?php 
        echo $widget['id'];
        ?>
" class="widget-control-info">

				<?php 
        echo $widget_control_template;
        ?>

			</ul>

			<?php 
        if ('add' == $action) {
            ?>
			<?php 
        }
        ?>

			<div class="widget-description">
				<?php 
        echo ($widget_description = wp_widget_description($widget_id)) ? $widget_description : '&nbsp;';
        ?>
			</div>

			<br class="clear" />

		</li>

		<?php 
    }
    if ($no_widgets_shown) {
        ?>

		<li><?php 
        _e('No matching widgets');
        ?>
</li>

		<?php 
    }
    ?>

	</ul>
<?php 
}
 /**
  * Build up an index of all available widgets for use in Backbone models.
  *
  * @since 3.9.0
  * @access public
  *
  * @global array $wp_registered_widgets
  * @global array $wp_registered_widget_controls
  * @staticvar array $available_widgets
  *
  * @see wp_list_widgets()
  *
  * @return array List of available widgets.
  */
 public function get_available_widgets()
 {
     static $available_widgets = array();
     if (!empty($available_widgets)) {
         return $available_widgets;
     }
     global $wp_registered_widgets, $wp_registered_widget_controls;
     require_once ABSPATH . '/wp-admin/includes/widgets.php';
     // for next_widget_id_number()
     $sort = $wp_registered_widgets;
     usort($sort, array($this, '_sort_name_callback'));
     $done = array();
     foreach ($sort as $widget) {
         if (in_array($widget['callback'], $done, true)) {
             // We already showed this multi-widget
             continue;
         }
         $sidebar = is_active_widget($widget['callback'], $widget['id'], false, false);
         $done[] = $widget['callback'];
         if (!isset($widget['params'][0])) {
             $widget['params'][0] = array();
         }
         $available_widget = $widget;
         unset($available_widget['callback']);
         // not serializable to JSON
         $args = array('widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template');
         $is_disabled = false;
         $is_multi_widget = isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']);
         if ($is_multi_widget) {
             $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
             $args['_temp_id'] = "{$id_base}-__i__";
             $args['_multi_num'] = next_widget_id_number($id_base);
             $args['_add'] = 'multi';
         } else {
             $args['_add'] = 'single';
             if ($sidebar && 'wp_inactive_widgets' !== $sidebar) {
                 $is_disabled = true;
             }
             $id_base = $widget['id'];
         }
         $list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar(array(0 => $args, 1 => $widget['params'][0]));
         $control_tpl = $this->get_widget_control($list_widget_controls_args);
         // The properties here are mapped to the Backbone Widget model.
         $available_widget = array_merge($available_widget, array('temp_id' => isset($args['_temp_id']) ? $args['_temp_id'] : null, 'is_multi' => $is_multi_widget, 'control_tpl' => $control_tpl, 'multi_number' => $args['_add'] === 'multi' ? $args['_multi_num'] : false, 'is_disabled' => $is_disabled, 'id_base' => $id_base, 'transport' => 'refresh', 'width' => $wp_registered_widget_controls[$widget['id']]['width'], 'height' => $wp_registered_widget_controls[$widget['id']]['height'], 'is_wide' => $this->is_wide_widget($widget['id'])));
         $available_widgets[] = $available_widget;
     }
     return $available_widgets;
 }
Example #6
0
 /**
  * Get the widget control args for tests.
  *
  * @return array
  */
 function get_test_widget_control_args()
 {
     global $wp_registered_widgets;
     require_once ABSPATH . '/wp-admin/includes/widgets.php';
     $widget_id = 'search-2';
     $widget = $wp_registered_widgets[$widget_id];
     $args = array('widget_id' => $widget['id'], 'widget_name' => $widget['name']);
     $args = wp_list_widget_controls_dynamic_sidebar(array(0 => $args, 1 => $widget['params'][0]));
     return $args;
 }
Example #7
0
 /**
  * @see wp_widget_control()
  */
 function test_wp_widget_control()
 {
     global $wp_registered_widgets;
     wp_widgets_init();
     require_once ABSPATH . '/wp-admin/includes/widgets.php';
     $widget_id = 'search-2';
     $widget = $wp_registered_widgets[$widget_id];
     $params = array('widget_id' => $widget['id'], 'widget_name' => $widget['name']);
     $args = wp_list_widget_controls_dynamic_sidebar(array(0 => $params, 1 => $widget['params'][0]));
     ob_start();
     call_user_func_array('wp_widget_control', $args);
     $control = ob_get_clean();
     $this->assertNotEmpty($control);
     $this->assertContains('<div class="widget-top">', $control);
     $this->assertContains('<div class="widget-title-action">', $control);
     $this->assertContains('<div class="widget-title">', $control);
     $this->assertContains('<form method="post">', $control);
     $this->assertContains('<div class="widget-content">', $control);
     $this->assertContains('<input class="widefat"', $control);
     $this->assertContains('<input type="hidden" name="id_base" class="id_base" value="search"', $control);
     $this->assertContains('<div class="widget-control-actions">', $control);
     $this->assertContains('<div class="alignleft">', $control);
     $this->assertContains('widget-control-remove', $control);
     $this->assertContains('widget-control-close', $control);
     $this->assertContains('<div class="alignright">', $control);
     $this->assertContains('<input type="submit" name="savewidget"', $control);
     $param_overrides = array('before_form' => '<!-- before_form -->', 'after_form' => '<!-- after_form -->', 'before_widget_content' => '<!-- before_widget_content -->', 'after_widget_content' => '<!-- after_widget_content -->');
     $params = array_merge($params, $param_overrides);
     $args = wp_list_widget_controls_dynamic_sidebar(array(0 => $params, 1 => $widget['params'][0]));
     ob_start();
     call_user_func_array('wp_widget_control', $args);
     $control = ob_get_clean();
     $this->assertNotEmpty($control);
     $this->assertNotContains('<form method="post">', $control);
     $this->assertNotContains('<div class="widget-content">', $control);
     foreach ($param_overrides as $contained) {
         $this->assertContains($contained, $control);
     }
 }