在折腾WordPress模版代码时经常见到两种触发function的方法,一种是用function_exists()来判断方法存不存在,如果存在则执行;另一种则是用add_action()add_filter()来执行写好的方法,统称hook(勾子)。如果用到子主题的话,在父模版中用function_exists()会更灵活,因为在子主题中可以用相同的方法名字直接覆盖父主题的方法。下面以在子主题中删除父主题指定的方法(function)代码为例,简单整理一下:

方法一

function_exists()

先查看父主题中的代码:

// 父主题中function.php的代码
if ( ! function_exists('print_something') ) {
function print_something() {
// 功能代码
 }
}

如果想要修改父主题中的方法,只需在子主题重新写一个相同名称的方法即可。

// 子主题中function.php的代码
 
function print_something() {
// 功能代码
}

实际项目运用:(父主题)

/**
 * 加载脚本样式(父主题)
 */
if ( ! function_exists('doocii_mobile_scripts') ) {
function doocii_mobile_scripts() {

    if ( is_home() ) { 
     wp_enqueue_style( 'home', get_template_directory_uri() . '/css/home.css', array(), '3.2' );
     wp_enqueue_script( 'home', get_template_directory_uri() . '/js/home.js', array(), '202141212', true );
    } 

}
}
add_action( 'wp_enqueue_scripts', 'doocii_mobile_scripts' );

方法一实际项目运用:(子主题)

if (!function_exists('doocii_mobile_scripts')) {
    function doocii_mobile_scripts() {
        //  做一些事情
    }
}

方法二

使用Hook,用add_action()或add_filter()调用方法

// 父主题中function.php的代码
function print_something() {
// 功能代码
}
add_action('wp_head', 'print_something');

从代码中可以看出有一个print_something()功能方法,然后用add_action()触发、执行该方法。其中add_action()中有两个参数,分别是“Hook位置(决定在哪里执行)”,“调用的方法”。有些代码也加上了第三个以数字为主的参数,那是指优先权。

如果我们要删除指定的父主题中的print_something()要怎么做呢?我的习惯是这样的三部曲:先写好你要用的新方法,然后再写一个方法用来删除父主题中指定的方法,最后再用add_action()或add_filter()调用他们。具体:

// 子主题中function.php的代码
function new_print_something() {
// 你要写的、新的功能代码
}
 
function remove_old_function() {
remove_action ('wp_head', 'print_something');
}
 
add_action('init', 'remove_old_function');
add_action('wp_head', 'new_print_something');

其中我们写了两个新的方法分别叫new_print_something()和remove_old_function(),一个是用来写新的功能的,另一个是用来删除父主题中指定方法的。最下面用add_action()调用并执行这两个方法。

细心的话你可能会问为什么要单独写一个remove_old_function()这样的方法来删除父主题的功能而不是直接用remove_action()来删除?因为WordPress会先执行子主题的代码,然后再执行父主题的代码,如果我们直接删除掉指定的方法,WordPress会因为父主题的代码还没有运行就执行了删除而找不到需要删除的方法,从而忽略掉这个行为。

以上即是制作子主题时常见的php文件功能修改的方法。