WordPressを読む 68-1 /blog/wp-includes/widgets.php 1
2015/04/24
目次
- 1 /blog/wp-includes/widgets.php1
- 2 WP_Widget::
- 3 WP_Widget::widget()
- 4 WP_Widget::update()
- 5 WP_Widget::form()
- 6 WP_Widget::__construct()
- 7 WP_Widget::WP_Widget()
- 8 WP_Widget::get_field_name()
- 9 WP_Widget::get_field_id()
- 10 WP_Widget::_register()
- 11 WP_Widget::_set()
- 12 WP_Widget::_get_display_callback()
- 13 WP_Widget::_get_update_callback()
- 14 WP_Widget::_get_form_callback()
- 15 WP_Widget::is_preview()
- 16 WP_Widget::display_callback()
- 17 WP_Widget::update_callback()
- 18 WP_Widget::form_callback()
- 19 WP_Widget::_register_one()
- 20 WP_Widget::save_settings()
- 21 WP_Widget::get_settings()
- 22 WP_Widget_Factory::
- 23 WP_Widget_Factory::WP_Widget_Factory()
- 24 WP_Widget_Factory::register()
- 25 WP_Widget_Factory::unregister()
- 26 WP_Widget_Factory::_register_widgets()
/blog/wp-includes/widgets.php1
WP_Widget::
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php /** * API for creating dynamic sidebar without hardcoding functionality into * themes. Includes both internal WordPress routines and theme use routines. * * This functionality was found in a plugin before WordPress 2.2 release which * included it in the core from that point on. * * @link http://codex.wordpress.org/Plugins/WordPress_Widgets WordPress Widgets * @link http://codex.wordpress.org/Plugins/WordPress_Widgets_Api Widgets API * * @package WordPress * @subpackage Widgets */ /** * This class must be extended for each widget and WP_Widget::widget(), WP_Widget::update() * and WP_Widget::form() need to be over-ridden. * * @package WordPress * @subpackage Widgets * @since 2.8.0 */ class WP_Widget { public $id_base; // Root id for all widgets of this type. public $name; // Name for this widget type. public $widget_options; // Option array passed to wp_register_sidebar_widget() public $control_options; // Option array passed to wp_register_widget_control() public $number = false; // Unique ID number of the current instance. public $id = false; // Unique ID string of the current instance (id_base-number) public $updated = false; // Set true when we update the data after a POST submit - makes sure we don't do it twice. |
WP_Widget::widget()
1 2 3 4 5 6 7 8 9 10 11 | // Member functions that you must over-ride. /** Echo the widget content. * * Subclasses should over-ride this function to generate their widget code. * * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget. * @param array $instance The settings for the particular instance of the widget */ public function widget($args, $instance) { die('function WP_Widget::widget() must be over-ridden in a sub-class.'); } |
WP_Widget::update()
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** Update a particular instance. * * This function should check that $new_instance is set correctly. * The newly calculated value of $instance should be returned. * If "false" is returned, the instance won't be saved/updated. * * @param array $new_instance New settings for this instance as input by the user via form() * @param array $old_instance Old settings for this instance * @return array Settings to save or bool false to cancel saving */ public function update($new_instance, $old_instance) { return $new_instance; } |
WP_Widget::form()
1 2 3 4 5 6 7 8 | /** Echo the settings update form * * @param array $instance Current settings */ public function form($instance) { echo '<p class="no-options-widget">' . __('There are no options for this widget.') . '</p>'; return 'noform'; } |
WP_Widget::__construct()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // Functions you'll need to call. /** * PHP5 constructor * * @param string $id_base Optional Base ID for the widget, lower case, * if left empty a portion of the widget's class name will be used. Has to be unique. * @param string $name Name for the widget displayed on the configuration page. * @param array $widget_options Optional Passed to wp_register_sidebar_widget() * - description: shown on the configuration page * - classname * @param array $control_options Optional Passed to wp_register_widget_control() * - width: required if more than 250px * - height: currently not used but may be needed in the future */ public function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) { $this->id_base = empty($id_base) ? preg_replace( '/(wp_)?widget_/', '', strtolower(get_class($this)) ) : strtolower($id_base); $this->name = $name; $this->option_name = 'widget_' . $this->id_base; $this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) ); $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) ); } |
WP_Widget::WP_Widget()
1 2 3 4 5 6 | /** * PHP4 constructor */ public function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) { WP_Widget::__construct( $id_base, $name, $widget_options, $control_options ); } |
WP_Widget::get_field_name()
1 2 3 4 5 6 7 8 9 10 11 | /** * Constructs name attributes for use in form() fields * * This function should be used in form() methods to create name attributes for fields to be saved by update() * * @param string $field_name Field name * @return string Name attribute for $field_name */ public function get_field_name($field_name) { return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']'; } |
WP_Widget::get_field_id()
1 2 3 4 5 6 7 8 9 10 11 | /** * Constructs id attributes for use in form() fields * * This function should be used in form() methods to create id attributes for fields to be saved by update() * * @param string $field_name Field name * @return string ID attribute for $field_name */ public function get_field_id($field_name) { return 'widget-' . $this->id_base . '-' . $this->number . '-' . $field_name; } |
WP_Widget::_register()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // Private Functions. Don't worry about these. public function _register() { $settings = $this->get_settings(); $empty = true; if ( is_array($settings) ) { foreach ( array_keys($settings) as $number ) { if ( is_numeric($number) ) { $this->_set($number); $this->_register_one($number); $empty = false; } } } if ( $empty ) { // If there are none, we register the widget's existence with a // generic template $this->_set(1); $this->_register_one(); } } |
WP_Widget::_set()
1 2 3 4 | public function _set($number) { $this->number = $number; $this->id = $this->id_base . '-' . $number; } |
WP_Widget::_get_display_callback()
1 2 3 | public function _get_display_callback() { return array($this, 'display_callback'); } |
WP_Widget::_get_update_callback()
1 2 3 | public function _get_update_callback() { return array($this, 'update_callback'); } |
WP_Widget::_get_form_callback()
1 2 3 | public function _get_form_callback() { return array($this, 'form_callback'); } |
WP_Widget::is_preview()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * Determine if we're in the Customizer; if true, then the object cache gets * suspended and widgets should check this to decide whether they should * store anything persistently to the object cache, to transients, or * anywhere else. * * @since 3.9.0 * * @return bool True if Customizer is on, false if not. */ public function is_preview() { global $wp_customize; return ( isset( $wp_customize ) && $wp_customize->is_preview() ) ; } |
WP_Widget::display_callback()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | /** Generate the actual widget content. * Just finds the instance and calls widget(). * Do NOT over-ride this function. */ public function display_callback( $args, $widget_args = 1 ) { if ( is_numeric($widget_args) ) $widget_args = array( 'number' => $widget_args ); $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); $this->_set( $widget_args['number'] ); $instance = $this->get_settings(); if ( array_key_exists( $this->number, $instance ) ) { $instance = $instance[$this->number]; /** * Filter the settings for a particular widget instance. * * Returning false will effectively short-circuit display of the widget. * * @since 2.8.0 * * @param array $instance The current widget instance's settings. * @param WP_Widget $this The current widget instance. * @param array $args An array of default widget arguments. */ $instance = apply_filters( 'widget_display_callback', $instance, $this, $args ); if ( false === $instance ) { return; } $was_cache_addition_suspended = wp_suspend_cache_addition(); if ( $this->is_preview() && ! $was_cache_addition_suspended ) { wp_suspend_cache_addition( true ); } $this->widget( $args, $instance ); if ( $this->is_preview() ) { wp_suspend_cache_addition( $was_cache_addition_suspended ); } } } |
WP_Widget::update_callback()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | /** * Deal with changed settings. * * Do NOT over-ride this function. * * @param mixed $deprecated Not used. */ public function update_callback( $deprecated = 1 ) { global $wp_registered_widgets; $all_instances = $this->get_settings(); // We need to update the data if ( $this->updated ) return; if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { // Delete the settings for this instance of the widget if ( isset($_POST['the-widget-id']) ) $del_id = $_POST['the-widget-id']; else return; if ( isset($wp_registered_widgets[$del_id]['params'][0]['number']) ) { $number = $wp_registered_widgets[$del_id]['params'][0]['number']; if ( $this->id_base . '-' . $number == $del_id ) unset($all_instances[$number]); } } else { if ( isset($_POST['widget-' . $this->id_base]) && is_array($_POST['widget-' . $this->id_base]) ) { $settings = $_POST['widget-' . $this->id_base]; } elseif ( isset($_POST['id_base']) && $_POST['id_base'] == $this->id_base ) { $num = $_POST['multi_number'] ? (int) $_POST['multi_number'] : (int) $_POST['widget_number']; $settings = array( $num => array() ); } else { return; } foreach ( $settings as $number => $new_instance ) { $new_instance = stripslashes_deep($new_instance); $this->_set($number); $old_instance = isset($all_instances[$number]) ? $all_instances[$number] : array(); $was_cache_addition_suspended = wp_suspend_cache_addition(); if ( $this->is_preview() && ! $was_cache_addition_suspended ) { wp_suspend_cache_addition( true ); } $instance = $this->update( $new_instance, $old_instance ); if ( $this->is_preview() ) { wp_suspend_cache_addition( $was_cache_addition_suspended ); } /** * Filter a widget's settings before saving. * * Returning false will effectively short-circuit the widget's ability * to update settings. * * @since 2.8.0 * * @param array $instance The current widget instance's settings. * @param array $new_instance Array of new widget settings. * @param array $old_instance Array of old widget settings. * @param WP_Widget $this The current widget instance. */ $instance = apply_filters( 'widget_update_callback', $instance, $new_instance, $old_instance, $this ); if ( false !== $instance ) { $all_instances[$number] = $instance; } break; // run only once } } $this->save_settings($all_instances); $this->updated = true; } |
WP_Widget::form_callback()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | /** * Generate the control form. * * Do NOT over-ride this function. */ public function form_callback( $widget_args = 1 ) { if ( is_numeric($widget_args) ) $widget_args = array( 'number' => $widget_args ); $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); $all_instances = $this->get_settings(); if ( -1 == $widget_args['number'] ) { // We echo out a form where 'number' can be set later $this->_set('__i__'); $instance = array(); } else { $this->_set($widget_args['number']); $instance = $all_instances[ $widget_args['number'] ]; } /** * Filter the widget instance's settings before displaying the control form. * * Returning false effectively short-circuits display of the control form. * * @since 2.8.0 * * @param array $instance The current widget instance's settings. * @param WP_Widget $this The current widget instance. */ $instance = apply_filters( 'widget_form_callback', $instance, $this ); $return = null; if ( false !== $instance ) { $return = $this->form($instance); /** * Fires at the end of the widget control form. * * Use this hook to add extra fields to the widget form. The hook * is only fired if the value passed to the 'widget_form_callback' * hook is not false. * * Note: If the widget has no form, the text echoed from the default * form method can be hidden using CSS. * * @since 2.8.0 * * @param WP_Widget $this The widget instance, passed by reference. * @param null $return Return null if new fields are added. * @param array $instance An array of the widget's settings. */ do_action_ref_array( 'in_widget_form', array( &$this, &$return, $instance ) ); } return $return; } |
WP_Widget::_register_one()
1 2 3 4 5 6 | /** Helper function: Registers a single instance. */ public function _register_one($number = -1) { wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) ); _register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) ); _register_widget_form_callback( $this->id, $this->name, $this->_get_form_callback(), $this->control_options, array( 'number' => $number ) ); } |
WP_Widget::save_settings()
1 2 3 4 | public function save_settings($settings) { $settings['_multiwidget'] = 1; update_option( $this->option_name, $settings ); } |
WP_Widget::get_settings()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public function get_settings() { $settings = get_option($this->option_name); if ( false === $settings && isset($this->alt_option_name) ) $settings = get_option($this->alt_option_name); if ( !is_array($settings) ) $settings = array(); if ( !empty($settings) && !array_key_exists('_multiwidget', $settings) ) { // old format, convert if single widget $settings = wp_convert_widget_settings($this->id_base, $this->option_name, $settings); } unset($settings['_multiwidget'], $settings['__i__']); return $settings; } } |
WP_Widget::クラス終了
WP_Widget_Factory::
1 2 3 4 5 6 7 8 9 | /** * Singleton that registers and instantiates WP_Widget classes. * * @package WordPress * @subpackage Widgets * @since 2.8.0 */ class WP_Widget_Factory { public $widgets = array(); |
WP_Widget_Factory::WP_Widget_Factory()
1 2 3 | public function WP_Widget_Factory() { add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); } |
WP_Widget_Factory::register()
1 2 3 | public function register($widget_class) { $this->widgets[$widget_class] = new $widget_class(); } |
WP_Widget_Factory::unregister()
1 2 3 4 | public function unregister($widget_class) { if ( isset($this->widgets[$widget_class]) ) unset($this->widgets[$widget_class]); } |
WP_Widget_Factory::_register_widgets()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public function _register_widgets() { global $wp_registered_widgets; $keys = array_keys($this->widgets); $registered = array_keys($wp_registered_widgets); $registered = array_map('_get_widget_id_base', $registered); foreach ( $keys as $key ) { // don't register new widget if old widget with the same id is already registered if ( in_array($this->widgets[$key]->id_base, $registered, true) ) { unset($this->widgets[$key]); continue; } $this->widgets[$key]->_register(); } } } |
WP_Widget_Factory::クラス定義終了