我有一个非常复杂的PHP类,负责创建和打印meta\\u框,生成和保存meta字段。。。
每个meta\\u框(类的对象)都有自己的保存函数,用于更新post的元数据(字段是另一个类的实例)及其post_excerpt
和post_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
)
/////
由于我的问题被证明是非常本地化的,请随意删除它。再次感谢你帮助我!
提前感谢!