Tôi đang rút mã này ra khỏi plugin Total Widget Control của mình , vì vậy nó có thể gây ra một hoặc hai lỗi. Tôi không biết, chỉ cho tôi biết nếu nó làm. Về cơ bản, đây là mã widget mà tôi sử dụng cho mọi thứ mà tôi xây dựng.
if (!function_exists("register_multiwidget")):
/**
* Register a widget
*
* @param $widget
*/
function register_multiwidget( $widget = null )
{
static $widgets;
if (!isset($widgets))
{
$widgets = array();
}
if (is_null($widget)) return $widgets;
if (!is_array($widget)) return false;
$defaults = array(
'id' => '1',
'title' => 'Generic Widget',
'classname' => '',
'description' => '',
'width' => 200,
'height' => 200,
'fields' => array(),
);
$widgets[$widget['id']] = wp_parse_args($widget, $defaults);
return true;
}
/**
* Get the registered widgets
*
* @return array
*/
function get_registered_widgets()
{
return register_multiwidget();
}
/**
* Initialize the widgets
*
* @return boolean
*/
function init_registered_widgets()
{
//initialziing variables
global $wp_widget_factory;
$widgets = get_registered_widgets();
//reasons to fail
if (empty($widgets) || !is_array($widgets)) return false;
foreach ($widgets as $id => $widget)
{
$wp_widget_factory->widgets[$id] =& new Multiple_Widget_Master( $widget );
}
return false;
}
/**
* Multiple Widget Master Class
*
* This class allows us to easily create qidgets without having to deal with the
* mass of php code.
*
* @author byrd
* @since 1.3
*/
class Multiple_Widget_Master extends WP_Widget
{
/**
* Constructor.
*
* @param $widget
*/
function Multiple_Widget_Master( $widget )
{
$this->widget = apply_filters('twc_widget_setup', $widget);
$widget_ops = array(
'classname' => $this->widget['classname'],
'description' => $this->widget['description']
);
$this->WP_Widget($this->widget['id'], $this->widget['title'], $widget_ops);
}
/**
* Display the Widget View
*
* @example extract the args within the view template
extract($args[1]);
* @param $args
* @param $instance
*/
function widget($args, $instance)
{
//initializing variables
$widget = $this->widget;
$widget['number'] = $this->number;
$args = array(
'sidebar' => $args,
'widget' => $widget,
'params' => $instance,
);
$show_view = apply_filters('twc_widget_view', $this->widget['show_view'], $widget, $instance, $args);
ob_start();
require_once $show_view;
}
/**
* Update from within the admin
*
* @param $new_instance
* @param $old_instance
*/
function update($new_instance, $old_instance)
{
//initializing variables
$new_instance = array_map('strip_tags', $new_instance);
$instance = wp_parse_args($new_instance, $old_instance);
return $instance;
}
/**
* Display the options form
*
* @param $instance
*/
function form($instance)
{
//reasons to fail
if (empty($this->widget['fields'])) return false;
do_action('twc_widget_before');
$defaults = array(
'id' => '',
'name' => '',
'desc' => '',
'type' => '',
'options' => '',
'std' => '',
);
foreach ($this->widget['fields'] as $field)
{
$field = wp_parse_args($field, $defaults);
if (isset($field['id']) && array_key_exists($field['id'], $instance))
$meta = attribute_escape($instance[$field['id']]);
if ($field['type'] != 'custom' && $field['type'] != 'metabox')
{
echo '<p><label for="',$this->get_field_id($field['id']),'">';
}
if (isset($field['name']) && $field['name']) echo $field['name'],':';
switch ($field['type'])
{
case 'text':
echo '<input type="text" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '" value="', $meta ? $meta : $field['std'], '" class="twc_text" />',
'<br/><span class="description">', $field['desc'], '</span>';
break;
case 'textarea':
echo '<textarea class="twc_textarea" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '" cols="60" rows="4" style="width:97%">', $meta ? $meta : $field['std'], '</textarea>',
'<br/><span class="description">', $field['desc'], '</span>';
break;
case 'select':
echo '<select class="twc_select" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '">';
foreach ($field['options'] as $option)
{
echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
}
echo '</select>',
'<br/><span class="description">', $field['desc'], '</span>';
break;
case 'radio':
foreach ($field['options'] as $option)
{
echo '<input class="twc_radio" type="radio" name="', $this->get_field_name($field['id']), '" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' />',
$option['name'];
}
echo '<br/><span class="description">', $field['desc'], '</span>';
break;
case 'checkbox':
echo '<input type="hidden" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '" /> ',
'<input class="twc_checkbox" type="checkbox" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '"', $meta ? ' checked="checked"' : '', ' /> ',
'<br/><span class="description">', $field['desc'], '</span>';
break;
case 'custom':
echo $field['std'];
break;
case 'metabox':
if ((isset($_REQUEST['action']) && $_REQUEST['action'] == 'edit')
|| (isset($_REQUEST['action']) && $_REQUEST['action'] == 'add' && isset($_REQUEST['addnew'])))
echo '</div>
</div>
<div id="query_view_params" class="postbox">
<div class="handlediv" title="Click to toggle"><br></div>
<h3 class="hndle">
<span>Query View Parameters</span>
</h3>
<div class="inside">';
break;
}
if ($field['type'] != 'custom' && $field['type'] != 'metabox')
{
echo '</label></p>';
}
}
do_action('twc_widget_after');
return;
}
}// ends Master Widget Class
endif;
Bây giờ, khi bạn đã dán tệp này vào tệp tin.php. Bạn có thể bắt đầu khai báo các tiện ích mới sau vài giây. Đây là mã để khai báo một widget mới.
register_multiwidget(array(
'id' => 'first-custom-widget', // Must be slug compatible, and unique, it's used a lot
'title' => __('aaaFirst Widget'),
'description' => __('This is my description'),
'classname' => 'st-custom-wi',
'show_view' => 'path/to/my/widget_view_file.php',
'fields' => array(
array(
'name' => 'Text box',
'desc' => 'Enter something here',
'id' => 'text',
'type' => 'text',
'std' => 'Default value 1'
),
array(
'type' => 'custom',
'std' => '<hr/>'
),
array(
'name' => 'Textarea',
'desc' => 'Enter big text here',
'id' => 'textarea',
'type' => 'textarea',
'std' => 'Default value 2'
),
array(
'name' => 'Select box',
'id' => 'select',
'type' => 'select',
'options' => array('Option 1', 'Option 2', 'Option 3')
),
array(
'name' => 'Radio',
'id' => 'radio',
'type' => 'radio',
'options' => array(
array('name' => 'Name 1', 'value' => 'Value 1'),
array('name' => 'Name 2', 'value' => 'Value 2')
)
),
array(
'name' => 'Checkbox',
'id' => 'checkbox',
'type' => 'checkbox'
),
)
));
Khai báo bất cứ trường nào bạn muốn cho các tùy chọn widget của bạn với mảng ở trên và bạn đã hoàn tất.
Điều cuối cùng mà bạn cần làm là dán các widget html vào đường dẫn tệp mới / to / my / widget_view_file.php
Ở đầu tệp xem tiện ích con này thêm mã sau đây: <?php extract($args[1]); ?>
Điều này sẽ chia ra ba biến để bạn sử dụng:
- $ sidebar
- $ widget
- $ param