如何对 WordPress 标配小工具做客户化定制

customize-widget

我们知道 WordPress 内置很多标配的小工具(Widget),比如 “近期文章” 、“文章归档” 、“近期评论”、“目录” 等,这些小工具功能丰富, 使用起来非常方便、快捷,可以对我们的网站提供一些基础的服务。有些时候我们在充分利用这些小工具所提供的功能的同时,也希望可以对小工具做一些客户化的定制,从而满足某些方面的特定需求。其实 WordPress 系统提供了这样的机制使得客户化小工具成为可能,本篇教程就介绍相关的方法。

在详细介绍小工具客户化的实现方法之前,需要明确一点的是,WordPress 小工具都是按照标准的代码框架开发的,在这篇文章中已经做过介绍,详细的内容可以去看一下。通过那篇文章我们可以看到,所有小工具类都是从基础类 WP_Widget 派生出来的,进一步分析小工具代码知道不同的小工具都是通过重载 WP_Widget 的 widge() 、update() 、form()三个函数来实现所对应的功能。那么如果要客户化小工具的功能,一般想到的做法就是修改要客户化的小工具的三个函数相关的代码,这的确也是一种实现方法。但本篇文章要介绍一种看似更合理的方法,就是不修改小工具原有的代码,而是利用 WordPress 系统所提供的小工具 “钩链” 的方法来 “置换” 原有的功能代码从而实现我们所需要的功能。

WordPress 系统就是利用 “钩链” 来方便对核心系统功能进行扩展的。拿小工具来说,就是当系统初始化完小工具后,在调用小工具的三个函数来完成相应的功能之前,还可以使用小工具钩链动态注入客户化代码,从而实现改造或者替换原有功能的目的。

WordPress 系统针对小工具的三个函数 widge() 、update() 、form() 分别提供了对应的调用客户化代码的函数 display_callback、update_callback、form_callback,它们都是在基础类 WP_Widget 中定义并实现的,因此只要按照小工具钩链的规则编写好客户化代码,系统在访问到小工具的时候就会自动地调用并注入客户化代码。

下面以小工具的显示功能来介绍如何注入客户化的显示代码。通过分析 WP_Widget display_callback 代码,可以看到系统在调用小工具的 widge() 函数显示内容之前,先调用了小工具钩链所注入的代码,代码片段如下(来自 WordPress 代码参考):

$instance = apply_filters( ‘widget_display_callback’, $instance, $this, $args );

这就是我们定义小工具钩链注入客户化代码所使用的规则,代码如下:

function custom_widget_code($instance, $widget, $args) {} add_filter(‘widget_display_callback’,’custom_widget_code’,10,3);

按照上面的例子定义好客户化代码后,当系统调用小工具显示部分的代码时,就会先调用到我们编写的代码,就是函数 custom_widget_code 中的代码。这里有个问题就是小工具有很多,那调用的是哪个小工具的代码呢。下面就用 “近期文章” 小工具来介绍客户化函数的代码框架,先放出代码如下:

function custom_recent_post($instance, $widget, $args) {
	if($widget->option_name && $widget->option_name == "widget_recent-posts") {
		$was_cache_addition_suspended = wp_suspend_cache_addition();
		if ( $widget->is_preview() && ! $was_cache_addition_suspended ) {
			wp_suspend_cache_addition( true );
		}
		show_custom_recent_posts($args, $instance, $widget);
		if ( $widget->is_preview() ) {
			wp_suspend_cache_addition( $was_cache_addition_suspended );
		}
		return false;
	}
	return $instance;
}
function show_custom_recent_posts($args, $instance, $widget) {
	/* 客户化代码 ... */;
}
add_filter('widget_display_callback','custom_recent_post',10,3);

从上面的代码可以看到,在调用 “近期文章” 小工具显示相关的客户化代码之前,要先判断一下当前系统正在调用的是 “近期文章” 小工具的代码,这是通过系统传入的参数 $widget 来进行判断的,该参数代表系统当前正在访问的小工具,这样只要判断当前小工具的名称是 “widget_recent-posts” 就可以确定是 “近期文章” 小工具了,接下来就可以执行对应的客户化显示代码了(show_custom_recent_posts)。

以上就是客户化 WordPress 标配小工具的基本方法,本篇教程是用小工具显示功能作为例子说明的,其它的比如小工具的配置、参数管理等功能的客户化方法也是一样的,只是用到的钩链不同。

《如何对 WordPress 标配小工具做客户化定制》有7个想法

  1. Long time supporter, and thought I’d drop a comment.

    Your wordpress site is very sleek – hope you don’t mind me asking what theme you’re using?
    (and don’t mind if I steal it? :P)

    I just launched my site –also built in wordpress like yours– but the
    theme slows (!) the site down quite a bit.

    In case you have a minute, you can find it by searching for “royal cbd” on Google (would appreciate
    any feedback) – it’s still in the works.

    Keep up the good work– and hope you all take care of yourself during the coronavirus scare!

    1. Hi, thanks for your comments, the website theme is based on twenty sixteen of WordPress, but I rebuild and develop something like widget, menu, page header, layout, color, etc. And I write some related articles to describe the method in detail, so you can find it.
      Yes, you can use something if you like it, hope that would help you.
      Have a nice day.

  2. I was wondering if you ever considered changing
    the structure of your site? Its very well written;
    I love what youve got to say. But maybe you
    could a little more in the way of content so people could connect with it better.
    Youve got an awful lot of text for only having one or 2
    pictures. Maybe you could space it out better?

  3. I’m truly enjoying the design and layout of your
    site. It’s a very easy on the eyes which makes it much more
    pleasant for me to come here and visit more often. Did you hire out a developer
    to create your theme? Fantastic work!

    1. Hi, the theme is based on twenty sixteen with WordPress, I do some customization like layout, style, menu, widget, plugin, etc.

  4. Hello, I enjoy reading all of your article post. I wanted to write a little comment to support you.|

发表评论

邮箱地址不会被公开。 必填项已用*标注