/** * 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']; }
/** * 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 : ' '; ?> </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; }
/** * 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; }
/** * @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); } }