Хук delete_post
срабатывает сразу перед тем, как пост будет удален из базы данных. Он позволяет выполнить действия, которые должны быть выполнены после удаления комментариев и метаданных поста, но до того, как сама запись будет окончательно удалена. Это полезно для синхронизации данных, ведения логов, или очистки сторонних таблиц базы данных, связанных с постом.
do_action( ‘delete_post’, int $post_id, WP_Post $post )
Когда этот хук срабатывает, комментарии и метаданные поста уже удалены, но сам пост еще не был удален из базы данных. Если вам нужно взаимодействовать с метаданными или комментариями, используйте хук before_delete_post
, который срабатывает до удаления этих данных. Хук delete_post
полезен, когда необходимо обработать события, связанные с удалением поста, но после удаления его метаданных и комментариев.
Параметры
- $post_id (int): ID поста, который будет удален.
- $post (WP_Post): Объект записи, которую собираются удалить. Это объект типа
WP_Post
, который содержит все данные о посте, такие как заголовок, содержимое и другие атрибуты.
Когда срабатывает хук
- Перед удалением поста: Хук срабатывает перед тем, как сама запись будет удалена из базы данных.
- После удаления метаданных и комментариев: Комментарии и метаданные записи уже были удалены, когда срабатывает этот хук.
Когда хук не срабатывает
- При перемещении поста в корзину: Для этого используется хук
wp_trash_post
. - При удалении вложений (attachments): Если нужно выполнять действия перед удалением вложений, используйте хук
delete_attachment
.
Пример 1: Синхронизация данных в сторонней таблице
Предположим, у нас есть плагин, который хранит метаданные постов в отдельной таблице базы данных, например, в таблице codex_postmeta
. Мы хотим синхронизировать удаление этих данных с удалением основного поста.
add_action('admin_init', 'wpdocs_codex_init');
function wpdocs_codex_init() {
add_action('delete_post', 'wpdocs_codex_sync', 10);
}
function wpdocs_codex_sync($pid) {
global $wpdb;
// Удаляем данные из сторонней таблицы при удалении поста
$sql = $wpdb->prepare('DELETE FROM codex_postmeta WHERE post_id = %d', $pid);
$wpdb->query($sql);
}
В этом примере при удалении поста, данные, связанные с этим постом, удаляются и из сторонней таблицы codex_postmeta
. Мы использовали хук delete_post
, чтобы выполнить эту операцию.
Пример 2: Логирование удаления поста
Если необходимо логировать процесс удаления поста, можно использовать следующий код. Это поможет отслеживать, когда и какие посты были удалены:
add_action('delete_post', 'log_post_deletion', 10, 2);
function log_post_deletion($post_id, $post) {
// Записываем информацию о посте в лог
$log_message = sprintf('Пост с ID %d и заголовком "%s" был удален.', $post_id, $post->post_title);
error_log($log_message);
}
Этот код записывает в лог файл информацию о посте (его ID и заголовок), который был удален, что позволяет отслеживать операции с контентом на сайте.
Пример 3: Обработка удаления постов с определенными метками
Предположим, нам нужно выполнить определенные действия только для постов с определенной меткой, например, delete_me
, перед их удалением. Мы можем добавить проверку на наличие этой метки в хуке delete_post
.
add_action('delete_post', 'handle_deletion_for_specific_tag', 10, 2);
function handle_deletion_for_specific_tag($post_id, $post) {
// Проверяем, есть ли у поста метка "delete_me"
if (has_term('delete_me', 'post_tag', $post)) {
// Ваш код для обработки удаления поста с этой меткой
error_log('Пост с меткой "delete_me" был удален: ' . $post->post_title);
}
}
В этом примере мы проверяем, имеет ли пост метку delete_me
. Если да, то выполняем дополнительные действия, например, записываем лог.
Заключение
Хук delete_post
предоставляет возможности для обработки событий, связанных с удалением постов в WordPress. Он полезен для синхронизации данных, ведения логов или выполнения других действий, связанных с удалением записей. Однако стоит помнить, что он срабатывает после удаления метаданных и комментариев, так что для работы с этими данными лучше использовать хук before_delete_post
.