Диагностика проблемы: зачем менять статус статей автоматически
В ряде проектов на WordPress возникает необходимость автоматически менять статус статей, например, переводить их в черновик или архив через определённое время после публикации. Это актуально для новостных сайтов, где устаревшая информация должна быть скрыта или обновлена. Без автоматизации приходится делать это вручную, что неудобно и ошибочно.
Что такое WP-Cron и как он помогает в задаче
WP-Cron — встроенный планировщик задач WordPress, который выполняет запланированные события при посещении сайта. Он позволяет запускать функции по расписанию, что идеально подходит для автоматической смены статуса постов.
Ограничения WP-Cron
- Запускается только при заходе на сайт, если нет внешних вызовов — задачи могут задерживаться.
- Для высокой точности рекомендуют настраивать системный cron на сервере для вызова wp-cron.php.
Пошаговое решение: код для автоматической смены статуса статей
Ниже пример кода, который раз в сутки переводит все статьи, опубликованные более 30 дней назад, в статус черновика.
// Регистрируем собственное событие при инициализации темы или плагина
add_action('wp', function() {
if (!wp_next_scheduled('auto_change_post_status')) {
wp_schedule_event(time(), 'daily', 'auto_change_post_status');
}
});
// Функция, которая меняет статус постов
add_action('auto_change_post_status', function() {
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_posts = get_posts($args);
foreach ($old_posts as $post_id) {
// Меняем статус на черновик
wp_update_post([
'ID' => $post_id,
'post_status' => 'draft',
]);
}
});
// При деактивации плагина или темы очистить запланированное событие
register_deactivation_hook(__FILE__, function() {
$timestamp = wp_next_scheduled('auto_change_post_status');
if ($timestamp) {
wp_unschedule_event($timestamp, 'auto_change_post_status');
}
});
Как проверить, что задача сработала
- В админке зайдите в «Записи» и отфильтруйте по статусу «Черновик» — появятся записи, которым больше 30 дней.
- Используйте плагин «WP Crontrol» для просмотра и управления расписанием WP-Cron, чтобы убедиться, что событие запланировано.
- Для отладки добавьте временный лог в функцию, например:
послеerror_log('Пост ID ' . $post_id . ' переведён в черновик');wp_update_post.
Частые ошибки и как их исправить
- Задача не запускается: проверьте, что на сайте есть посещения — WP-Cron запускается при загрузке страницы. Для стабильности настройте системный cron:
wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1с периодичностью в 15 минут. - Посты не меняют статус: убедитесь, что функция
wp_update_postвызывается корректно и у пользователя, под которым работает скрипт, есть права на редактирование постов. - Много ресурсов уходит на запросы: если постов очень много, разбивайте выборку на порции с пагинацией (например, по 100 постов за раз) и запускайте задачу чаще.
Практические советы по безопасности и производительности
- Для безопасности ограничьте возможность запуска функции только из WP-Cron, без прямого вызова по URL.
- Планируйте задачи в не пиковые часы, чтобы снизить нагрузку на сервер.
- Кешируйте результаты запросов, если используете подобные выборки часто.
- Регулярно очищайте старые запланированные задачи через
wp_unschedule_event, чтобы не накапливались дубликаты.
Сравнение вариантов реализации автоматической смены статуса
| Вариант | Плюсы | Минусы |
|---|---|---|
| WP-Cron + код в functions.php | Простота, гибкость, не требует плагинов | Зависит от посещаемости сайта, возможны задержки |
| Системный cron + вызов wp-cron.php | Точная периодичность, высокая надёжность | Требует доступа к серверу и настройки |
| Плагины для планирования задач (например, WP Crontrol) | Удобный интерфейс, визуальный контроль | Дополнительный плагин, возможный оверхед |