Сообщение об обновлении Wp: Бесконечный цикл даже с решением для удаления действий, ООП
У меня есть довольно сложный класс PHP, отвечающий за создание и печать meta_boxes, создание и сохранение мета-полей, ...
Каждый meta_box (объект класса) имеет свою собственную функцию сохранения, которая обновляет метаданные post (поля для них являются экземплярами другого класса), а также его post_excerpt
и post_content
. Да, это, вероятно, немного сложно, но так как я только начинаю с ООП, я пока вполне доволен этим.
TL;DR, ПРОБЛЕМА: С wp_update_post()
вызванный на save_post
крючок, я получаю бесконечный цикл. Эта проблема задокументирована в кодексе WP, а также упомянута здесь, в WPSE: Как избежать бесконечного цикла в обратном вызове save_post.
Если вы вызываете функцию, такую как wp_update_post, которая включает в себя крючок save_post, ваша подключенная функция создаст бесконечный цикл. Чтобы избежать этого, отцепите свою функцию перед вызовом нужной вам функции, а затем снова подключите ее.
Источник: Кодекс
Это очень упрощенная версия кода, который я использую:
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
Я неправильно удаляю/добавляю крючок сохранения? Имеет ли это что-то общее с нестатическим использованием функции сохранения?
Я, конечно, с удовольствием предоставлю остальную часть соответствующего кода, если с этой структурой нет явных проблем.
РЕДАКТИРОВАТЬ
Проблема бесконечного цикла заключается в исчезло - как упоминал @TheDeadMedic, проблема заключалась в несоответствии приоритета.
Чтобы удалить крючок, аргументы $function_to_remove и $priority должны совпадать при добавлении крючка. Это относится как к фильтрам, так и к действиям. При сбое удаления предупреждение не выдается.
Кодекс: http://codex.wordpress.org/Function_Reference/remove_action
РЕДАКТИРОВАТЬ 2
Поскольку PHP является языком, чувствительным к регистру, Undefined index ID
обратите внимание, что проблема заключалась в моем массив $post (параметр wp_update_meta
). Идентификационный ключ должен быть указан в верхнем регистре.
$post = array(
'ID' => $post_id // ID must be uppercase
)
/////
Поскольку мой вопрос оказался очень локализованным, не стесняйтесь удалять его. И еще раз спасибо за помощь мне!
Заранее спасибо!
1 answers
Вам нужно соответствовать $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 ) {
...
}