Обновить таблицу сообщений в действии save_post

Я создаю мини-плагин и пытаюсь обновить содержимое таблицы wp_post элемента записи.

Мой плагин добавляет поле ввода на страницу post edit.php и изменяет post_mime_type сообщения в базе данных.

но поскольку я делаю это в add_action('save_post', ..), я не могу использовать wp_update_post(), потому что он делает цикл.

соответствующий код находится здесь:

add_action( 'save_post', 'member_manager_save_extras' );
function member_manager_save_extras($post_id){
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return; 

    else if( !isset( $_POST['meta_box_nonce'] ) ||
            !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) 
        return; 

    else if( !current_user_can( 'edit_post' ) ) 
        return $post_id; 

    else{
        $post = get_post($id) ; 
        $post -> post_mime_type = "sss" ; 
        wp_update_post( (array) $post ) ;   
    }
}

так как я могу обновить post_mime_type по-другому?


person dede    schedule 29.10.2020    source источник


Ответы (1)


Самый простой способ добиться этого — удалить действие и снова добавить его до и после вызова wp_update_post соответственно:

add_action( 'save_post', 'member_manager_save_extras' );
function member_manager_save_extras($post_id){
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return; 

    else if( !isset( $_POST['meta_box_nonce'] ) ||
            !wp_verify_nonce( $_POST['meta_box_nonce'], 'my_meta_box_nonce' ) ) 
        return; 

    else if( !current_user_can( 'edit_post' ) ) 
        return $post_id; 

    else{
        $post = get_post($id) ; 
        $post -> post_mime_type = "sss" ;

        // Remove the action
        remove_action( 'save_post', 'member_manager_save_extras' );

        // Perform any update that uses the save_post hook
        wp_update_post( (array) $post ) ;

        // Add it back again
        add_action( 'save_post', 'member_manager_save_extras' ); 
    }
}
person George    schedule 29.10.2020
comment
спасибо, для изучения того, как работает это remove_action? - person dede; 29.10.2020
comment
Вы уже определили проблему в своем коде — из-за действия, которое вы добавляете к хуку save_post, вы входите в бесконечный цикл (save_post используется в wp_update_post). remove_action удаляет это действие из хука, поэтому member_manager_save_extras не будет вызываться save_post - person George; 29.10.2020
comment
проблема в том, что это прерывает регулярное обновление, например редактирование заголовка или текста. - person dede; 18.11.2020