在 WordPress 子主题中覆盖父主题函数功能有两种方法,分别为:

  • 可插拔函数
  • 函数优先级

下面本文就详细介绍一下这两种方法以及应用场景,您可以根据实际情况选择一种使用。

可插拔函数

可插拔函数(Pluggable Functions)是您在父主题中编写的代码,因此,这种方法适用于您可以操作父主题,比如如果您正在编写自己的父主题,或者作为将来项目的起点,或者正在创建自己的主题框架。如果您无法修改父主题那么这种方法并不适用。

要编写可插拔函数,只需在父主题中将其封装在条件标记中,以检查具有该名称的函数是否已运行:

<?php
if ( ! function_exists ( 'my_function' ) ) {
    function my_function() {
        // Contents of your function here.
    }
}
?>

然后,当您要在子主题中编写要覆盖父主题中的功能的函数时,只需为其命名与父主题中的名称相同即可:

<?php
function my_function() {
    // Contents for your function override here.
}
?>

WordPress 将首先在子主题中运行该函数,当涉及到父主题中的函数时,它将检查它是否已经存在,并且因为它已经存在,所以不会运行它。

函数优先

如果您的父主题不可控,比如您没有使用自己的父主题,或者正在使用没有可插拔函数的第三方主题,则需要使用函数优先级。

在编写函数时,可以为它们分配优先级,告诉WordPress何时运行它们。将函数添加到动作或过滤器挂钩时,可以执行此操作。WordPress将按照优先级的升序运行附加到给定钩子上的函数,因此优先级数字更大的那些将最后运行

让我们想象一下父主题中的函数不可插拔,并且看起来像这样:

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function' );
?>

此函数已附加到init钩子上,尚未获得优先级。默认情况下,WordPress会为尚未添加优先级的功能分配优先级为10 ,因此要在该函数运行后执行新函数,请使用大于 10 的数字。我倾向于使用 15 ,以便在以后要在两者之间添加另一个函数的情况下留出一些可用的空间。

这意味着您的子主题中的函数将如下所示:

<?php
function child_function() {
    // Contents for your function here.
}
add_action( 'init', 'child_function', 15 );
?>

或者,您父主题中的函数可能已分配了优先级:

<?php
function parent_function() {
    // Contents for your function here.
}
add_action( 'init', 'parent_function', 20 );
?>

因此,您只需要确保在子主题中赋予该函数更高的的优先级:

<?php
function child_function() {
    // Contents for your function here.
}
add_action( 'init', 'child_function', 25 );
?>