Apply a filter only once

时间:2017-09-15 作者:Iurie

我想自动删除主页菜单项,but only once, 更准确地说at the first run of Wordpress or at the first child theme activation/loading. 现在我在函数中有了一个函数。我的孩子主题的php,用于检查主菜单项是否存在,并将其从菜单中删除。当然,每当Wordpress加载时,此函数都会运行。How to make it to run only once? 我试过了add_filter_once() 函数,但我只有PHP Fatal error: Call to undefined function add_filter_once().

function filter_wp_nav_menu_objects( $sorted_menu_items, $args ) { 

    foreach( $sorted_menu_items as $data ) {
        if ( in_array( "menu-item-home", $data->classes ) ) {
            wp_delete_post( $data->ID );
        }
    }

    return $sorted_menu_items;
} 

add_filter( \'wp_nav_menu_objects\', \'filter_wp_nav_menu_objects\', 10, 2 );

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

没有调用本机WordPress挂钩add_filter_once(). 这是一个自定义解决方案,它将帮助您只运行一次挂钩。

例如,如果在一个循环内或您面临的任何情况下。然而,基本的想法是检查何时需要停止使用钩子remove_hook 在WordPress中,完成所有操作后,您需要再次注册它。

示例代码:

function add_filter_once( $hook, $callback, $priority = 10, $args = 1 ) {
    $singular = function () use ( $hook, $callback, $priority, $args, &$singular ) {
        call_user_func_array( $callback, func_get_args() );
        remove_filter( $hook, $singular, $priority );
    };

    return add_filter( $hook, $singular, $priority, $args );
}
了解我试图解释的内容的最佳方式是访问此link

SO网友:David Wolf

实现这一目标的一个丑陋但有效的方法是global 数组,并在过滤器回调中,检查数组是否已经包含过滤器的挂钩名称,您只想应用一次。如果结果表明该值已经设置,回调将立即返回输入。

从技术上讲,您的过滤器每次都会运行,但不会每次都应用该逻辑,因为它会在第二次执行及以上时跳过。

这种技术也适用于基于类的过滤器,WordPress对这些过滤器的处理方式不尽相同,例如,删除基于类的过滤器是一种混乱。

    // … inside a class

    public function addMyFilter()
    {
        add_filter(\'some_filter\', [$this, \'someMethod\']);
    }

    public function someMethod($val)
    {
        global $myFiltersThatWhereExecAlready;

        if (empty($myFiltersThatWhereExecAlready)) {
            $myFiltersThatWhereExecAlready = [];
        }

        if (in_array(__METHOD__, $myFiltersThatWhereExecAlready)) {
            return $val;
        }

        $myFiltersThatWhereExecAlready[] = __METHOD__;

        // … doing your filtering
    }

结束

相关推荐

Apply_Filters(‘the_content’)-是否使其忽略快捷代码?

我正在使用apply_filters(\'the_content) 因此,我可以在后端的wp编辑器中看到格式正确的内容。但是,这也会呈现内容中的短代码。我希望它忽略短代码,对其余内容进行过滤,基本上与发帖时一样。如果您在后端查看帖子内容,您将看到短代码,但如果您在网站的页面内查看它,您将看到呈现的短代码(其结果)。这可能吗?