Два варианта. Оба основаны на кроне wp_schedule_event ( ежечасном «hourly» , но это для проверки ). Лучше ( оптимальнее для ресурсов ) использовать ежедневный крон «daily»
Для изменения кол-ва дней в функции delete_old_posts нужно поменять $days
Первый вариант. Основан на прямой работе с БД
// Добавляем функцию к событию WordPress
function register_daily_cleanup_event() {
if ( ! wp_next_scheduled( 'daily_cleanup_old_posts' ) ) {
wp_schedule_event( time(), 'hourly', 'daily_cleanup_old_posts' );
}
}
add_action( 'wp', 'register_daily_cleanup_event' );
// Удаляем событие при деактивации темы или плагина
function deregister_daily_cleanup_event() {
$timestamp = wp_next_scheduled( 'daily_cleanup_old_posts' );
wp_unschedule_event( $timestamp, 'daily_cleanup_old_posts' );
}
register_deactivation_hook( __FILE__, 'deregister_daily_cleanup_event' );
// Функция для удаления записей старше $days дней
function delete_old_posts() {
global $wpdb;
$days = 10; // Указываем количество дней
$date_query = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Подготавливаем запрос для удаления
$query = $wpdb->prepare( "
DELETE FROM {$wpdb->posts}
WHERE post_type = 'post'
AND post_status = 'publish'
AND post_date < %s
", $date_query );
// Выполняем запрос
$wpdb->query( $query );
}
add_action( 'daily_cleanup_old_posts', 'delete_old_posts' );
Второй вариант. Основан на работе с функцией wp_delete_post
// Регистрация ежедневного события
function register_daily_cleanup_event() {
if ( ! wp_next_scheduled( 'daily_cleanup_old_posts' ) ) {
wp_schedule_event( time(), 'hourly', 'daily_cleanup_old_posts' );
}
}
add_action( 'wp', 'register_daily_cleanup_event' );
// Отмена события при деактивации
function deregister_daily_cleanup_event() {
$timestamp = wp_next_scheduled( 'daily_cleanup_old_posts' );
wp_unschedule_event( $timestamp, 'daily_cleanup_old_posts' );
}
register_deactivation_hook( __FILE__, 'deregister_daily_cleanup_event' );
// Удаление записей старше 10 дней
function delete_old_posts() {
$days = 10; // Количество дней
$date_query = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получение записей старше 10 дней
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date_query,
'inclusive' => true,
),
),
'fields' => 'ids', // Запрашиваем только ID записей
'posts_per_page' => -1, // Получить все записи, соответствующие условиям
);
$old_posts = get_posts( $args );
// Удаление каждой записи по её ID
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, false );
// true - для принудительного удаления без перемещения в корзину
// false- для перемещения в корзину
}
}
add_action( 'daily_cleanup_old_posts', 'delete_old_posts' );