花了一整天都没搞懂的事情,突然晚上用了大概半个小时就开窍了。当然,其实功劳不在那30分钟,而是在前面的一直摸索积累。郁闷得要死要活,当然要总结一下经验,免得老是掉坑里。
上回说到自定义小工具时灵时不灵。通常,当我把网上的自定义小工具脚本(1,2)贴到functions.php,然后在小工具那里把相应的东西拖放到合适的位置,刷新前端就能看到。当我在functions.php修改代码,修改到一定程度的时候仍然可以看到,但改着改着,前端就没了。当我把改到最后还能显示的版本再贴回去,依然没反应。这到底是什么问题呢?后来我意识到不会是某些默认参数缺失导致。我不知道为什么在小工具的后台预览就没有这种缺失问题,但前端显示就有。非常有可能刚好碰上5.9前端和后台默认参数不完全一致。当我把所有之前空着,理论上应该自动带入默认参数的函数都补充为默认写法之后,奇迹发生了!所以折腾了一大轮非常有可能是5.9删掉了某些前端的默认参数,因为他们从这个版本开始可以使用区块进行全站模板编辑,既然所有东西都源于区块,所有东西都不是从自定义代码开始,在区块那里写入默认参数自然就不会有小工具默认参数缺失的问题。但是,他们万万没想到我这个从WordPress大概2.*版本就开始用的老土鬼依然在用很久很久很久很久很久以前的自定义小工具写法,而当时,当自定义小工具参数缺失时估计有默认参数补全……
要创建一个自定义小工具,可以在模板functions.php文件里通过代码方式实现。下面讲的只是创建小工具本身,有些模板没有自带容纳小工具的箱子,导致创建好的小工具后无法让其在前端显示,这里就不继续探讨了。
写一个自定义小工具主要有3步,其中第1步里有4个步骤需要完成:
1 创建小工具
1.1 设定小工具基本参数
1.2 设定小工具前端输出
1.3 设定小工具后台更新参数
1.4 设定小工具后台输出
2 注册小工具
3 激活小工具
转化为代码大概是这个样子:
class widget-ID extends WP_Widget //创建widget,widget-ID必须唯一,必须小写
{
public function __construct() //widget基本参数设定
{
parent::__construct(
'widget-ID',
__('widget name'), //后台widget标题
array('description' => __('widget description'),) //后台widget描述
);
}
public function widget($args, $instance) //widget前端输出
{
echo $args['before_widget'];
********** //要输出的全部放这里
echo $args['after_widget'];
}
public function update( $new_instance, $old_instance ) //widget后台更新设定
{
return $new_instance; //public function form里更新了这里就更新,因为form没有内容,照抄默认写法
}
public function form( $instance ) //widget后台输出
{
echo '<p class="no-options-widget">' . __( 'There are no options for this widget.' ) . '</p>';
return 'noform'; //因为是自定义小工具,参数都已就位,照抄默认写法
}
}
function mi_register_widget() //注册自定义widget,mi_register_widget函数名随意
{
register_widget('widget-ID1'); //多个自定义widget在这里全部列出
register_widget('widget-ID2');
register_widget('widget-ID3');
}
add_action('widgets_init', 'mi_register_widget'); //激活已注册的全部widget |
class widget-ID extends WP_Widget //创建widget,widget-ID必须唯一,必须小写
{
public function __construct() //widget基本参数设定
{
parent::__construct(
'widget-ID',
__('widget name'), //后台widget标题
array('description' => __('widget description'),) //后台widget描述
);
}
public function widget($args, $instance) //widget前端输出
{
echo $args['before_widget'];
********** //要输出的全部放这里
echo $args['after_widget'];
}
public function update( $new_instance, $old_instance ) //widget后台更新设定
{
return $new_instance; //public function form里更新了这里就更新,因为form没有内容,照抄默认写法
}
public function form( $instance ) //widget后台输出
{
echo '<p class="no-options-widget">' . __( 'There are no options for this widget.' ) . '</p>';
return 'noform'; //因为是自定义小工具,参数都已就位,照抄默认写法
}
}
function mi_register_widget() //注册自定义widget,mi_register_widget函数名随意
{
register_widget('widget-ID1'); //多个自定义widget在这里全部列出
register_widget('widget-ID2');
register_widget('widget-ID3');
}
add_action('widgets_init', 'mi_register_widget'); //激活已注册的全部widget
之前我遇到的时灵时不灵根本原因在于public function update( $new_instance, $old_instance ){}和public function form( $instance ){}虽然我的确不需要表达什么,所以{}直接留空,于是就撞板了…… 所以这两个组后台参数设定可能对自定义的各位来说的确没啥用,但默认写法还是得继续保留,不能留空。
如果有人像我那样在WordPress 5.9之前自定义小工具好好的,但5.9后就前端不显示了,按照上面步骤对照修改后,还需要在后台小工具页面把之前失效的小工具从箱子里删除,然后重新拖放小工具归位。相信我,这个步骤非常重要!!!虽然看上去还是那个模样,但实际上拖放一圈的确就能解决修改代码后,前端无论如何仍然刷新不出来的问题。
撞板是痛苦的,但摸爬滚打后重新站起来的感觉非常好!