在可插拔函数上删除父主题操作不起作用

时间:2020-07-28 作者:Michelle

我试图删除父主题对可插入函数的add\\u操作调用,但无法通过调用remove_action() - 我必须重新声明函数并将其保留为空。这正常吗?我想我可以remove_action 永远不要调用函数。

以下是父主题代码:

add_action( \'tha_content_while_before\', \'fwp_archive_header\' );
if ( !function_exists(\'fwp_archive_header\') ) {
    function fwp_archive_header() {
      // do stuff
    }
}
在儿童主题中(不起作用):

add_action( \'init\', \'remove_parent_actions_filters\' );
function remove_parent_actions_filters() { 
  remove_action( \'tha_content_while_before\', \'fwp_archive_header\' );
}
我也试过换掉\'init\' 对于\'after_setup_theme\' 和\'wp_loaded\'; 我也尝试过降低和提高优先级,但都没有效果。唯一起作用的是:

在儿童主题(工作)中:

function fwp_archive_header() {
  // do nothing
}
这是对的吗?我必须重新声明函数才能删除它?

谢谢

2 个回复
SO网友:sbnc.eu

父主题的功能。php运行after 子主题的,因此为了删除父主题定义的操作remove_action 在父主题注册操作后,必须使用挂钩延迟调用。因此remove_action 纯粹在子函数内部调用。php无法工作。它必须连接到挂钩上。

然而,从问题中的代码摘录来看,不清楚家长是否add_action( \'tha_content_while_before\', \'fwp_archive_header\' ); line正好在函数中。php还是在一个动作中?如果它在动作中,则钩住remove_action 调用相同的操作,但优先级更高(因此它会在后面运行)。注意我说的是家长的行为add_action 电话在里面。类似这样:

add_action( \'some_hook\', \'some_parent_function\', 10 );
function some_parent_function() {
    /* ...some code... */
    add_action( \'tha_content_while_before\', \'fwp_archive_header\' );
    if ( !function_exists(\'fwp_archive_header\') ) {
        function fwp_archive_header() {
          // do stuff
        }
    }
    /* ...some code... */
}

删除操作如下所示:

add_action( \'some_hook\', \'remove_parent_actions_filters\', 11 );
function remove_parent_actions_filters() { 
  remove_action( \'tha_content_while_before\', \'fwp_archive_header\' );
}
另一个经验法则是将您的remove调用挂接到wp_loaded, e、 g.:add_action( \'wp_loaded\', \'remove_parent_actions_filters\', 1000 );. 应该仍然及时,以影响页面的呈现方式,但可能会晚到足以覆盖最常见的父主题挂钩。

另一方面,用名称声明一个空函数fwp_archive_header 几乎是同样好的解决方案。请注意,虽然它不是“重新声明”,因为PHP中没有这样的东西。它更像是父主题之前的“predeclare”,因此父主题不会用相同的名称声明自己的函数(有适当的检查)。

SO网友:Rick Hellewell

在remove\\u parent\\u actions\\u filters()函数中,添加一个测试以查看是否已加载父主题的函数。也许你打钩太早了。

add_action( \'init\', \'remove_parent_actions_filters\' );
function remove_parent_actions_filters() { 
   if (!function_exists(\'fwp_archive_header\')) {wp_die("fwp_archive_header function is not loaded");}
  remove_action( \'tha_content_while_before\', \'fwp_archive_header\' );
}

Added

尝试改用after\\u setup\\u主题挂钩。看见https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

相关推荐

OOP development and hooks

我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private