使用子函数覆盖父函数

时间:2020-04-03 作者:DevSem

因此,我尝试了几种不同的方法来覆盖父主题内的方法,但我一点运气都没有。

结构如下:

主题/
-wp starter
--自定义\\u标题。php
-wp starter子级--custom\\u头。php

我在父custom\\u头中有一个方法。php如下所示:

function wp_bootstrap_starter_custom_header_setup() {
    add_theme_support( \'custom-header\', apply_filters( \'wp_bootstrap_starter_custom_header_args\', array(
        \'default-image\'          => \'\',
        \'default-text-color\'     => \'fff\',
        \'width\'                  => 1000,
        \'height\'                 => 250,
        \'flex-height\'            => true,
        \'wp-head-callback\'       => \'wp_bootstrap_starter_header_style\',
    ) ) );
}
add_action( \'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\' );
现在。。我希望能够在我的孩子体内调用该方法custom_header.php 并替代宽度和高度。

以下是一些尝试:

增加了行动优先级(不起作用):

function wp_bootstrap_starter_custom_header_setup() {
    add_theme_support( \'custom-header\', apply_filters( \'wp_bootstrap_starter_custom_header_args\', array(
        \'default-image\'          => \'\',
        \'default-text-color\'     => \'fff\',
        \'width\'                  => 1000,
        \'height\'                 => 500,
        \'flex-height\'            => true,
        \'wp-head-callback\'       => \'wp_bootstrap_starter_header_style\',
    ) ) );
}
add_action(\'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\', 20);
重命名了方法并添加了优先级(无效):

function wp_bootstrap_starter_custom_header_setup() {
    add_theme_support( \'custom-header\', apply_filters( \'wp_bootstrap_starter_custom_header_args\', array(
        \'default-image\'          => \'\',
        \'default-text-color\'     => \'fff\',
        \'width\'                  => 1000,
        \'height\'                 => 500,
        \'flex-height\'            => true,
        \'wp-head-callback\'       => \'wp_bootstrap_starter_header_style\',
    ) ) );
}
add_action(\'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\', 20);
添加了具有优先级的初始化操作调用(无效):

function wp_bootstrap_starter_custom_header_setup() {
    add_theme_support( \'custom-header\', apply_filters( \'wp_bootstrap_starter_custom_header_args\', array(
        \'default-image\'          => \'\',
        \'default-text-color\'     => \'fff\',
        \'width\'                  => 1000,
        \'height\'                 => 500,
        \'flex-height\'            => true,
        \'wp-head-callback\'       => \'wp_bootstrap_starter_header_style\',
    ) ) );
}
add_action(\'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\' );
add_action(\'init\', \'wp_bootstrap_starter_custom_header_setup\', 15);
所以我试着remove_action(\'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\'); 没有结果。

3 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

不能只是在子主题中重新声明函数或调用add_action 第二次。它并没有取代它,而是增加了第二个挂钩。因此,您没有覆盖它,而是复制了原始文件。子主题替代仅适用于模板。

此外,通过添加第二个定义wp_bootstrap_starter_custom_header_setup 您已经声明了两次该函数,这将生成一个PHP致命错误。不能有两个同名函数。

因此,首先,我们需要重命名您的函数,以便有有效的PHP:

function sams_custom_header_setup() {
下一个add_action 添加操作。它没有替换动作的概念。如果你打电话add_action 5次,该功能将运行5次。

因此,让我们为新设置添加操作:

add_action(\'after_setup_theme\', \'sams_custom_header_setup\' );
但是请记住,原来的函数也添加了,所以现在两者都将运行!因此,请删除原始文件:

remove_action( \'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\' );
TLDR:

您不能“覆盖”操作

似乎父主题中使用的函数apply_filters, 您可以在wp_bootstrap_starter_custom_header_args 过滤并修改阵列本身。您不需要在替换函数或调用add_theme_support

SO网友:Himad

数字越小优先级越高。默认优先级为10,因此如果希望在之前执行操作,请尝试使用9。

此外,您应该删除原始操作以防止任何不必要的副作用。

function override_wp_bootstrap_starter_custom_header_setup() {
    remove_action(\'after_setup_theme\', \'wp_bootstrap_starter_custom_header_setup\', 10);

    add_theme_support( \'custom-header\', apply_filters( \'wp_bootstrap_starter_custom_header_args\', array(
        \'default-image\'          => \'\',
        \'default-text-color\'     => \'fff\',
        \'width\'                  => 1000,
        \'height\'                 => 500,
        \'flex-height\'            => true,
        \'wp-head-callback\'       => \'wp_bootstrap_starter_header_style\',
    ) ) );
}

add_action(\'after_setup_theme\', \'override_wp_bootstrap_starter_custom_header_setup\', 9);

SO网友:Xebozone

我正在定制相同的主题。在我的子主题函数文件中,我执行了以下操作来覆盖高度:

/*
 * Customize the header image parameters
 * See parent theme /inc/custom-header.php for reference
 */
function custom_parameters_wp_bootstrap_starter_custom_header_setup() {
    add_theme_support( \'custom-header\', apply_filters( \'wp_bootstrap_starter_custom_header_args\', array(
        \'height\'                 => 500
    ) ) );
}
add_action( \'after_setup_theme\', \'custom_parameters_wp_bootstrap_starter_custom_header_setup\', 9 );
诀窍是添加一个较低的优先级,使更改在原始定义之后执行(默认优先级为10)。