WP_UPDATE_POST:无限循环,即使使用REMOVE_ACTION解决方案,OOP

时间:2014-02-19 作者:Petr Cibulka

我有一个非常复杂的PHP类,负责创建和打印meta\\u框,生成和保存meta字段。。。

每个meta\\u框(类的对象)都有自己的保存函数,用于更新post的元数据(字段是另一个类的实例)及其post_excerptpost_content. 是的,这可能有点复杂,但由于我只是从OOP开始,到目前为止我对它很满意。

TL;DR, THE PROBLEM: 具有wp_update_post() 已调用save_post 胡克,我得到一个无限循环。该问题记录在WP codex中,也在WPSE中提及:How to avoid infinite loop in save_post callback.

如果调用包含save\\u post挂钩的wp\\u update\\u post等函数,那么挂钩函数将创建一个无限循环。为了避免这种情况,请在调用所需函数之前先取消钩住函数,然后再重新钩住它。

资料来源:Codex

这是我正在使用的代码的一个非常简化的版本:

class MetaBox {

    public function __construct() {
        // a lot of stuff, hooks and other function initiations
        add_action(\'save_post\',array($this,\'save_box\'), 20);
    }

    // more stuff

    function save_box() {
        // verify nonces, bail out on autosave, ajax, cron, ...

        switch ($this->id) {
            case \'editor\':
            case \'postexcerpt\':

                // remove action
                remove_action(\'save_post\', array($this,\'save_box\'));
                // bail out on post_revision
                if (!wp_is_post_revision($post_id) ){

                    $post = array(
                        // post id
                        \'id\'    => $post_id,
                        // tosave: either post_content or post_excerpt
                        // value: pulled from static associative multi-array inside MetaBox
                        $tosave => self::$meta[$this->id][$this->id]
                    );
                    wp_update_post($post);          
                }

                // add action back  
                add_action(\'save_post\', array($this, \'save_box\'));

            break;
            default:
                // some saving functionality for meta values, that WORKS just fine
            break;
        }
    }
}
我收到一个带有PHP的无限循环错误通知:Undefined index: ID in XXX/web/wp-includes/post.php on line 2987

是否删除/添加保存挂钩错误?它与非静态地使用save函数有什么共同之处吗?

如果这种结构没有明显的问题,我当然很乐意提供其余的相关代码。

编辑

无限循环问题消失了-正如@TheDeadMedic提到的,问题在于优先级不匹配。

要删除挂钩,添加挂钩时,$function\\u To\\u remove和$priority参数必须匹配。这适用于过滤器和操作。移除失败时不会发出警告。

法典:http://codex.wordpress.org/Function_Reference/remove_action

编辑2,因为PHP是区分大小写的语言,Undefined index ID 注意我的$post数组中存在问题(参数wp_update_meta). ID键必须指定为大写。

$post = array(
    \'ID\' => $post_id    // ID must be uppercase
)
/////

由于我的问题被证明是非常本地化的,请随意删除它。再次感谢你帮助我!

提前感谢!

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

您需要匹配$priority 你过去常挂接动作:

remove_action( \'save_post\', array( $this, \'save_box\' ), 20 /* Same as add_action call */ );

http://codex.wordpress.org/Function_Reference/remove_action

确保您$post_id 您的save_box 方法也是:

function save_box( $post_id ) {
    ...
}

结束

相关推荐

Multiple loops in Genesis

所以我想在我的主页上创建两个循环。一个可以显示页面自身内容的页面,然后在其正下方有一个网格循环,用于从“新闻”类别中获取两篇最新帖子。我真的找不到一种方法来做这件事,所以我四处黑客攻击,直到我让它工作起来,但我不确定这是正确的做法,有人能告诉我我可以/应该对这段代码做些什么改进吗?以下是我的截图:http://s18.postimg.org/knrq6sert/2013_11_13_22_55_58.png主题:MetroTemplate:主页。php//* Add support for Genesis