Хук before_delete_post
срабатывает перед удалением записи в WordPress, сразу перед началом выполнения функции wp_delete_post()
. Этот хук предоставляет возможность выполнить дополнительные действия или проверки, прежде чем пост будет удален из базы данных. Он полезен для плагинов и тем, которым нужно вмешиваться в процесс удаления, например, для сохранения данных, логирования или запрета удаления.
do_action( ‘before_delete_post’, int $post_id, WP_Post $post )
Этот хук запускается до того, как будут удалены метаданные, связанные с постом, и до того, как сам пост будет удален из базы данных. Хук также вызывается перед тем, как будут выполнены другие действия, такие как изменение родительского элемента у вложений, если они связаны с удаляемым постом.
Важно, что хук не срабатывает, если пост просто перемещается в корзину. Он сработает только в том случае, если пост удаляется навсегда, безвозвратно, либо если корзина отключена.
Параметры
- $post_id (int): ID поста, который удаляется.
- $post (WP_Post): Объект поста, который удаляется. Это объект типа
WP_Post
, содержащий все данные о записи, такие как заголовок, содержимое и метаданные.
Когда срабатывает хук
- Перед удалением поста: Хук срабатывает перед тем, как пост будет удален, когда выполняется команда
wp_delete_post()
. - При удалении безвозвратно: Хук срабатывает при удалении поста навсегда, то есть когда он удаляется не в корзину, а окончательно.
- После удаления метаданных: После того как будут удалены метаданные поста, но до того как сам пост будет удален.
Когда хук не срабатывает
- При перемещении поста в корзину: Для этого используется хук
wp_trash_post
. - Для вложений (attachments): Если нужно выполнить действия при удалении вложений, используйте хук
delete_attachment
. - При возврате поста из корзины: Для восстановления используется хук
untrash_post
.
Пример 1: Выполнение действия при удалении конкретного типа поста
Предположим, что у нас есть пользовательский тип записи my_custom_post_type
, и мы хотим выполнить некоторое действие при его удалении:
add_action('before_delete_post', 'handle_custom_post_deletion', 10, 2);
function handle_custom_post_deletion($post_id, $post) {
// Проверяем, что это нужный тип поста
if ('my_custom_post_type' !== $post->post_type) {
return;
}
// Ваш код для выполнения действий перед удалением поста
// Например, можно сделать резервное копирование данных или записать лог
error_log('Пост с ID ' . $post_id . ' будет удален.');
}
В этом примере, перед удалением поста типа my_custom_post_type
, мы записываем в лог сообщение, чтобы отследить процесс удаления.
Пример 2: Запрет удаления постов для определенных пользователей
Допустим, мы хотим запретить удаление постов для некоторых пользователей. Для этого можно использовать хук before_delete_post
:
add_action('before_delete_post', 'restrict_deletion_for_certain_users', 10, 2);
function restrict_deletion_for_certain_users($post_id, $post) {
// Получаем ID текущего пользователя
$current_user_id = get_current_user_id();
// Список пользователей, которым запрещено удалять посты
$restricted_users = [2, 5, 8];
// Если текущий пользователь в списке запрещенных и пост - это определенный пост
if (in_array($current_user_id, $restricted_users) && $post->ID === 42) {
wp_die('У вас нет прав для удаления этого поста.');
}
}
В данном примере мы проверяем, если текущий пользователь находится в списке запрещенных и пытается удалить пост с ID 42
, то мы останавливаем процесс удаления и выводим ошибку.
Пример 3: Логирование удаления поста
Если нужно записать лог в файл при удалении поста, можно использовать следующий код:
add_action('before_delete_post', 'log_post_deletion', 10, 2);
function log_post_deletion($post_id, $post) {
// Записываем информацию о посте в лог
error_log('Пост с ID ' . $post_id . ' был удален: ' . $post->post_title);
}
Этот код записывает в лог информацию о заголовке поста и его ID перед удалением.
Заключение
Хук before_delete_post
— это мощный инструмент для вмешательства в процесс удаления постов в WordPress. Он предоставляет возможность выполнять различные действия до того, как пост будет окончательно удален, будь то сохранение данных, запрет удаления или другие кастомизации. Используйте его для управления процессом удаления, а также для добавления логики, специфичной для вашего сайта.