Не удается заставить работать хук post_updated

Вопрос или проблема

Я пытаюсь добавить код, который будет выполнен при обновлении поста. Чтобы начать, я добавил следующий код в мой functions.php:

function check_values($post_ID, $post_after, $post_before){
    echo 'Post ID:';
    var_dump($post_ID);

    echo 'Post Object AFTER update:';
    var_dump($post_after);

    echo 'Post Object BEFORE update:';
    var_dump($post_before);
}

add_action( 'post_updated', 'check_values', 10, 3 );

Однако, кажется, что это не работает. При обновлении поста ничего не изменилось – ничего не выводится и не отображается на экране.

Я что-то неправильно понял?

Если это не работает, вы можете попробовать использовать действие wp_insert_post:

function insert_post_hook($post_id, $post) {

    if ($post->post_date != $post->post_modified) {
        // Этот пост обновляется!
    }
    else {
        // Этот пост создается!
    }
}
add_action( 'wp_insert_post', 'insert_post_hook', 10, 2 );

Если вы хотите увидеть последнюю версию, вы можете включить ревизии:

define('WP_POST_REVISIONS', 3 ); 

Это сохранит максимум 3 ревизии.

После включения вы можете проверить следующее:

$latest_revision = array_shift(wp_get_post_revisions($post->ID));

Ответ или решение

Чтобы решить проблему с хуком post_updated, важно понять, как функционирует система хук-очередей в WordPress. На первый взгляд код, который вы используете, кажется правильным, однако есть несколько нюансов, которые могут влиять на его работу.

Анализ текущего кода

Вы используете хук post_updated, который должен срабатывать при обновлении записи. Код в functions.php действительно вызывает функцию check_values с тремя аргументами: $post_ID, $post_after, $post_before.

Однако основная проблема, по всей видимости, заключается в том, что функции echo и var_dump не подходят для отображения информации в контексте админки WordPress. Эти функции выводят данные в HTML поток, который может быть не видим на фронтенде или в интерфейсе администраторов WordPress.

Рекомендации по устранению ошибки

  1. Использование методов дебаггинга: Замените echo и var_dump на функции, такие как error_log, для записи отладочной информации в файл error_log вашего сервера.

    function check_values($post_ID, $post_after, $post_before){
       error_log('Post ID: ' . $post_ID);
       error_log('Post Object AFTER update: ' . print_r($post_after, true));
       error_log('Post Object BEFORE update: ' . print_r($post_before, true));
    }
    
    add_action( 'post_updated', 'check_values', 10, 3 );
  2. Проверка условий срабатывания хука: Убедитесь, что обновление записи действительно приводит к вызову этого хука. Это можно сделать, временно изменив хук на более общий, например save_post, чтобы понять, вызывается ли вообще функция при сохранении поста любого типа и состояния.

  3. Убедитесь, что изменения сохраняются: В клапе functions.php изменения могут не применяться, если не сохранены. В WordPress, если делается редактирование внутри админской части, необходимо убедиться, что обновления были сохранены.

  4. Правильная точка и порядок подключения: Убедитесь, что functions.php подключен в вашем активном теме и не происходит никаких конфликтов с другими функциями или плагинами.

Альтернативные пути решения

Вы упомянули хук wp_insert_post, который может быть аль ternативой, так как он срабатывает как для вставки, так и для обновления поста. Это может быть полезно в зависимости от ваших потребностей:

function insert_post_hook($post_id, $post) {
    if ($post->post_date != $post->post_modified) {
        error_log('This post is being updated!');
    } else {
        error_log('This post is being created!');
    }
}
add_action( 'wp_insert_post', 'insert_post_hook', 10, 2 );

Включение и использование версий постов

Если вам нужна история изменений, вы можете использовать систему ревизий WordPress, просто добавив определение количества сохраняемых версий:

define('WP_POST_REVISIONS', 3);

После включения, можно использовать следующий код для проверки последней версии:

$latest_revision = array_shift(wp_get_post_revisions($post->ID));

Использование всех этих подходов позволит вам глубже понимать события, происходящие при обновлении постов, и наладить необходимое для вас функционирование системы.

Оцените материал
Добавить комментарий

Капча загружается...