Сообщение об обновлении 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
)

/////

Поскольку мой вопрос оказался очень локализованным, не стесняйтесь удалять его. И еще раз спасибо за помощь мне!

Заранее спасибо!

Author: Community, 2014-02-19

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 ) {
    ...
}
 7
Author: TheDeadMedic, 2014-02-19 16:50:41