当我开始回答这个问题时,它应该只是一个小纸条。嗯,我失败了。很抱歉和我在一起,有一个美好的东西隐藏在内心深处…
WordPress小部件的存储方式小部件列表存储在名为\'sidebars_widgets\'
. A.var_export()
可能给出如下内容:
array (
\'wp_inactive_widgets\' =>
array (
),
\'top-widget\' =>
array (
),
\'bottom-widget\' =>
array (
),
\'array_version\' => 3,
)
忽略
\'wp_inactive_widgets\'
和
\'array_version\'
. 我们不必关心这些
其他键是已注册侧栏的标识符。在这种情况下,侧栏可能已注册此代码:
// Register two sidebars.
$sidebars = array ( \'a\' => \'top-widget\', \'b\' => \'bottom-widget\' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
\'name\' => $sidebar,
\'id\' => $sidebar,
\'before_widget\' => \'\',
\'after_widget\' => \'\'
)
);
}
默认情况下,侧栏在注册后为空<当然可以
对于每个已注册的小部件类,将创建一个单独的选项,其中包含所有必要的选项。该选项以字符串作为前缀widget_
. 要获取所有活动RSS小部件的选项,我们必须查看…
get_option( \'widget_rss\' );
可能的输出:
array (
2 =>
array (
\'title\' => \'WordPress Stack Exchange\',
\'url\' => \'http://wordpress.stackexchange.com/feeds\',
\'link\' => \'http://wordpress.stackexchange.com/questions\',
\'items\' => 5,
\'show_summary\' => 1,
\'show_author\' => 0,
\'show_date\' => 0,
),
)
记下编号
2. 多个实例的参数都存储在这个按数字排序的选项中。
要查看WordPress已经知道哪些小部件类,请转到wp-admin/options.php
向下滚动,直到看到如下内容:
是,序列化数据。不,你不能在这里读这些。别担心,你不必担心。
演示小部件为了更好地说明内部工作原理,我编写了一个非常简单的演示小部件:
/**
* Super simple widget.
*/
class T5_Demo_Widget extends WP_Widget
{
public function __construct()
{ // id_base , visible name
parent::__construct( \'t5_demo_widget\', \'T5 Demo Widget\' );
}
public function widget( $args, $instance )
{
echo $args[\'before_widget\'], wpautop( $instance[\'text\'] ), $args[\'after_widget\'];
}
public function form( $instance )
{
$text = isset ( $instance[\'text\'] )
? esc_textarea( $instance[\'text\'] ) : \'\';
printf(
\'<textarea class="widefat" rows="7" cols="20" id="%1$s" name="%2$s">%3$s</textarea>\',
$this->get_field_id( \'text\' ),
$this->get_field_name( \'text\' ),
$text
);
}
}
注意构造器:
\'t5_demo_widget\'
是
$id_base
, 此小部件的标识符。正如您在屏幕截图中看到的,其参数存储在选项中
widget_t5_demo_widget
. 您的所有自定义小部件都将这样处理。你不必猜名字。既然您已经编写了小部件(可能),您就知道了类中的所有参数
$instance
参数。
主题基础
首先,您必须注册一些侧栏和自定义小部件。正确的操作很容易记住:
\'widgets_init\'
. 将所有内容放入一个容器中—一个类或一个函数。为了简单起见,我将使用一个名为
t5_default_widget_demo()
.
以下所有代码都进入functions.php
. 班级T5_Demo_Widget
应已加载。我只是把它放在同一个文件里…
add_action( \'widgets_init\', \'t5_default_widget_demo\' );
function t5_default_widget_demo()
{
// Register our own widget.
register_widget( \'T5_Demo_Widget\' );
// Register two sidebars.
$sidebars = array ( \'a\' => \'top-widget\', \'b\' => \'bottom-widget\' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
\'name\' => $sidebar,
\'id\' => $sidebar,
\'before_widget\' => \'\',
\'after_widget\' => \'\'
)
);
}
到目前为止,一切都很简单。我们的主题现在是widget ready,演示widget是已知的。现在是乐趣所在。
$active_widgets = get_option( \'sidebars_widgets\' );
if ( ! empty ( $active_widgets[ $sidebars[\'a\'] ] )
or ! empty ( $active_widgets[ $sidebars[\'b\'] ] )
)
{ // Okay, no fun anymore. There is already some content.
return;
}
您确实不想破坏用户设置。如果侧边栏中已经有一些内容,则代码不应在其上运行。这就是为什么我们在这个案件中停止。
好吧,假设边栏是空的……我们需要一个计数器:
$counter = 1;
小部件已编号。这些数字是WordPress的第二个标识符。
让我们让数组更改它:
$active_widgets = get_option( \'sidebars_widgets\' );
我们也需要一个计数器(稍后将详细介绍):
$counter = 1;
下面是我们如何使用计数器、边栏名称和小部件参数(好吧,我们只有一个参数:
text
).
// Add a \'demo\' widget to the top sidebar …
$active_widgets[ $sidebars[\'a\'] ][0] = \'t5_demo_widget-\' . $counter;
// … and write some text into it:
$demo_widget_content[ $counter ] = array ( \'text\' => "This works!\\n\\nAmazing!" );
$counter++;
注意小部件标识符是如何创建的:
id_base
, a负号
-
还有柜台。这个
content 小部件的
$demo_widget_content
. 这是柜台
key 小部件参数存储在一个数组中。
为了避免碰撞,我们将计数器增加1。
这很容易。现在是RSS小部件。更多领域,更多乐趣!
$active_widgets[ $sidebars[\'a\'] ][] = \'rss-\' . $counter;
// The latest 15 questions from WordPress Stack Exchange.
$rss_content[ $counter ] = array (
\'title\' => \'WordPress Stack Exchange\',
\'url\' => \'http://wordpress.stackexchange.com/feeds\',
\'link\' => \'http://wordpress.stackexchange.com/questions\',
\'items\' => 15,
\'show_summary\' => 0,
\'show_author\' => 1,
\'show_date\' => 1,
);
update_option( \'widget_rss\', $rss_content );
$counter++;
这里有一些新东西:
update_option()
这将在单独的选项中存储RSS小部件参数。WordPress稍后会自动找到这些
我们没有保存演示小部件参数,因为我们现在在第二个侧边栏中添加了第二个实例…
// Okay, now to our second sidebar. We make it short.
$active_widgets[ $sidebars[\'b\'] ][] = \'t5_demo_widget-\' . $counter;
#$demo_widget_content = get_option( \'widget_t5_demo_widget\', array() );
$demo_widget_content[ $counter ] = array ( \'text\' => \'The second instance of our amazing demo widget.\' );
update_option( \'widget_t5_demo_widget\', $demo_widget_content );
…并保存
t5_demo_widget
一下子。无需更新同一选项两次。
好了,今天有足够的小部件了,让我们保存sidebars_widgets
也是:
update_option( \'sidebars_widgets\', $active_widgets );
现在WordPress将知道有一些已注册的小部件以及每个小部件的参数存储在哪里。A.
var_export()
在侧边栏上,小部件将如下所示:
array (
\'wp_inactive_widgets\' =>
array (
),
\'top-widget\' =>
array (
0 => \'t5_demo_widget-1\',
1 => \'rss-2\',
),
\'bottom-widget\' =>
array (
0 => \'t5_demo_widget-3\',
),
\'array_version\' => 3,
)
The
complete code 再次强调:
add_action( \'widgets_init\', \'t5_default_widget_demo\' );
function t5_default_widget_demo()
{
// Register our own widget.
register_widget( \'T5_Demo_Widget\' );
// Register two sidebars.
$sidebars = array ( \'a\' => \'top-widget\', \'b\' => \'bottom-widget\' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
\'name\' => $sidebar,
\'id\' => $sidebar,
\'before_widget\' => \'\',
\'after_widget\' => \'\'
)
);
}
// Okay, now the funny part.
// We don\'t want to undo user changes, so we look for changes first.
$active_widgets = get_option( \'sidebars_widgets\' );
if ( ! empty ( $active_widgets[ $sidebars[\'a\'] ] )
or ! empty ( $active_widgets[ $sidebars[\'b\'] ] )
)
{ // Okay, no fun anymore. There is already some content.
return;
}
// The sidebars are empty, let\'s put something into them.
// How about a RSS widget and two instances of our demo widget?
// Note that widgets are numbered. We need a counter:
$counter = 1;
// Add a \'demo\' widget to the top sidebar …
$active_widgets[ $sidebars[\'a\'] ][0] = \'t5_demo_widget-\' . $counter;
// … and write some text into it:
$demo_widget_content[ $counter ] = array ( \'text\' => "This works!\\n\\nAmazing!" );
#update_option( \'widget_t5_demo_widget\', $demo_widget_content );
$counter++;
// That was easy. Now a RSS widget. More fields, more fun!
$active_widgets[ $sidebars[\'a\'] ][] = \'rss-\' . $counter;
// The latest 15 questions from WordPress Stack Exchange.
$rss_content[ $counter ] = array (
\'title\' => \'WordPress Stack Exchange\',
\'url\' => \'http://wordpress.stackexchange.com/feeds\',
\'link\' => \'http://wordpress.stackexchange.com/questions\',
\'items\' => 15,
\'show_summary\' => 0,
\'show_author\' => 1,
\'show_date\' => 1,
);
update_option( \'widget_rss\', $rss_content );
$counter++;
// Okay, now to our second sidebar. We make it short.
$active_widgets[ $sidebars[\'b\'] ][] = \'t5_demo_widget-\' . $counter;
#$demo_widget_content = get_option( \'widget_t5_demo_widget\', array() );
$demo_widget_content[ $counter ] = array ( \'text\' => \'The second instance of our amazing demo widget.\' );
update_option( \'widget_t5_demo_widget\', $demo_widget_content );
// Now save the $active_widgets array.
update_option( \'sidebars_widgets\', $active_widgets );
}
如果你去
wp-admin/widgets.php
现在,您将看到三个预设小部件:
就这样。使用…
dynamic_sidebar( \'top-widget\' );
dynamic_sidebar( \'bottom-widget\' );
…打印小部件。
有一个小问题:您必须为初始注册加载前端两次<如果有人能帮忙,我将非常感激