【问题标题】:Override metaboxes from parent theme in child theme in WordPress在 WordPress 的子主题中覆盖父主题中的元框
【发布时间】:2015-09-24 21:24:27
【问题描述】:

我在 WordPress 中有一个父主题,它在 WordPress 中添加了许多功能和特性,包括几个元框。

在我的子主题中,我在 WordPress 中添加了一些新的自定义帖子类型,因此我正在尝试修改元框以将它们包含在新的自定义帖子类型中。

这里是父主题functions.php文件:http://pastebin.com/G1CVM6U2

我的想法是,我只需要在我的子主题中添加代码,从添加元框的父主题中删除操作,然后将元框文件复制到我的子主题中,根据需要修改它们,然后然后使用 add_action 拉入一个调用这些元框文件的新函数。

但是,我什至能够从父主题中删除操作,这让我感到非常难过。

我在我的子主题functions.php中尝试了以下几种变体:

remove_action('init', 'add_metaboxes');
remove_action('add_meta_box', 'add_metaboxes');

它不会删除元框,因为当我检查页面/帖子编辑器时,它们仍然可见。

如果不运行 remove_action,我就无法执行新的“add_action”来调用修改后的元框文件。当我尝试这样做时,我得到一个白屏死机,因为我猜是重新声明了相同的功能。

我怀疑由于父主题中的动作被作为类的一部分调用,在子主题中覆盖它的过程可能会有所不同?

希望能对此提供一些帮助。

【问题讨论】:

    标签: php wordpress class


    【解决方案1】:

    示例 1:删除一个普通的命名添加操作

    add_action('after_setup_theme', 'remove_meta_boxes');
    
    function remove_meta_boxes(){
         remove_action('add_meta_box', 'add_metaboxes', 10);
    }
    

    示例 2:删除通过引用传递的函数

    add_action 看起来像这样:

    class ab{
        
        function __construct(){
            add_action('init', array( &$this, 'add_metaboxes' ));
        }
        
        
     }
     
     $x=new ab;
    

    这里的问题是 wordpress 会在函数名称前附加一个随机标识字符串,例如(a3898orj34930add_metaboxes),每次都是随机的,所以我们需要做的是使用strpos 来查找密钥中的名称。我为此创建了一个自定义函数。

    function remove_anon_filters( $name, $functionname, $priority){
        global $wp_filter;
        
        foreach ( $wp_filter[$name][$priority] as $key => $data) {
                
            if( stripos($key, $functionname )  ){
                remove_action( $name, $key, $priority  );
            }
            
         } 
        
     }
    

    然后我们在主题设置后挂钩以删除父主题操作。

     add_action('after_setup_theme', 'remove_parent_meta_boxes');
     
     function remove_parent_meta_boxes(){
        remove_anon_filters ( 'init', 'add_metaboxes', 10);
     }
    

    【讨论】:

    • 这也是我的想法,也是我尝试过的众多事情之一。出于某种原因,用于添加元框的操作是“init”。我在我的 OP 中包含了父主题 functions.php 文件,因此您可以自己查看。但是,当我将您的代码添加到子主题功能时(相信我之前也尝试过),元框不会被删除。我不知道为什么。
    • 说这让我发疯是轻描淡写。我已经尝试这样做至少 2 小时了 :(
    • 其余的钩子是通过引用添加的,所以我假设 add meta_boxes 是相同的(您实际上缺少您提供的代码中的操作),add_meta_box 中包含的文件中有什么功能?如果我猜对了,那里还有更多添加操作。
    • 太棒了!结果比我预期的要复杂得多,我非常感谢您在这方面的专业知识。此外,现在我可以看到你是如何做到的,所涉及的代码也很有意义,所以我学到了一些更宝贵的东西!
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 2019-02-28
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2018-04-07
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多