Вопрос или проблема
Я пытаюсь добавить код, который будет выполнен при обновлении поста. Чтобы начать, я добавил следующий код в мой 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.
Рекомендации по устранению ошибки
-
Использование методов дебаггинга: Замените
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 );
-
Проверка условий срабатывания хука: Убедитесь, что обновление записи действительно приводит к вызову этого хука. Это можно сделать, временно изменив хук на более общий, например
save_post
, чтобы понять, вызывается ли вообще функция при сохранении поста любого типа и состояния. -
Убедитесь, что изменения сохраняются: В клапе
functions.php
изменения могут не применяться, если не сохранены. В WordPress, если делается редактирование внутри админской части, необходимо убедиться, что обновления были сохранены. -
Правильная точка и порядок подключения: Убедитесь, что
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));
Использование всех этих подходов позволит вам глубже понимать события, происходящие при обновлении постов, и наладить необходимое для вас функционирование системы.