带类的父主题中REMOVE_FILTER的语法

时间:2015-12-09 作者:Bob Diego

我正在尝试删除register\\u url挂钩上添加的父主题的过滤器,它似乎有一个我无法理解的类命名法。

通常,此挂钩的过滤器很容易添加,如下所示:

    add_filter( \'register_url\', \'custom_register_url\' );
    function custom_register_url( $register_url )
    {
        $register_url = "YOUR_PAGE_URL";
        return $register_url;
    }
但是,父主题已将其自己的筛选器添加到此挂钩,并且由于加载顺序,我的子主题无法覆盖该筛选器(此问题已讨论here 并演示了here 以及详细信息here).

这个过程相对简单,但我所从事的父主题将这个过滤器和函数放在了面向对象编程中,这让我头疼。WordPressCodex 表示

如果过滤器是从类中添加的,例如通过插件添加的,则删除它将需要访问类变量。

   global $my_class;
   remove_filter( \'the_content\', array($my_class, \'class_filter_function\') );
但我无法找出访问此函数的正确名称。以下是父主题的片段:

    class APP_Registration extends APP_Login_Base {

        private static $_template;

        private $error;

        function get_action() {
            return \'register\';
        }

        function __construct( $template ) {
            self::$_template = $template;
            parent::__construct( $template, __( \'Register\', APP_TD ) );

            add_action( \'appthemes_after_registration\', \'wp_new_user_notification\', 10, 2 );
            add_filter( \'register_url\', array( $this, \'_change_register_url\' ), 10, 1 );
        }

        function _change_register_url( $url ) {
            return self::get_url( \'raw\' );
        }

    . . .
尝试删除仅列出函数(\\u change\\u register\\u url)的筛选器不起作用:

    function custom_register_url( $register_url )
    {
        $register_url = "YOUR_PAGE_URL";
        return $register_url;
    }
    add_filter( \'register_url\', \'custom_register_url\' );

    function remove_parent_filters() {
        remove_filter( \'register_url\', \'_change_register_url\' );
        add_filter( \'register_url\', \'custom_register_url\' );
    }
    add_action( \'after_setup_theme\', \'remove_parent_filters\' );
因为我假设,我需要指出它所连接的函数的正确类名。

有人能帮我找出这行的正确删除过滤器语法吗?

        remove_filter( \'register_url\', \'_change_register_url\' );

2 个回复
最合适的回答,由SO网友:birgire 整理而成

插件似乎不希望您访问APP_Registration 实例,因此您可以尝试以下操作:

add_filter( \'register_url\', function( $url )
{
    // Adjust this to your needs
    $url = site_url( \'wp-login.php?action=register\', \'login\' );

    return $url;
}, 11 );
覆盖插件的修改,我们使用优先级10。

SO网友:Mark Kaplun

过滤器和操作应始终是静态方法,以便于移除。如果它们不是静态的,并且对象不是单体(在您的情况下似乎是这样),那么除了删除该操作/过滤器的所有挂钩并添加您的挂钩之外,没有其他选择(@birgre的答案是此主题的变体)。如果你为自己做儿童主题,并因此提前知道有哪些插件以及它们使用的挂钩,这可能会很不优雅。

remove\\u过滤器在非单例对象的情况下不起作用的原因是,必须与中使用的(对象,方法)对精确匹配add_actionremove_action 如果你不知道物体的价值,你就注定要失败。

相关推荐

Separate First Post Loop

我正在尝试使用<?php rewind_posts(); ?> 在我的主页模板上使用两个循环的功能。有人知道如何停止最新帖子后的第一个循环吗?这是我的代码:<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h1><a href=\"<?php the_permalink(); ?>\"><