Как создать автoобновляемый отпуск для постов в WordPress

В некоторых проектах на WordPress возникает необходимость временно скрывать или приостанавливать публикацию постов. Например, если вы ведёте блог с анонсами мероприятий или акций, которые действуют только в определённые даты, полезно иметь возможность автоматически ставить посты в «отпуск» — временно скрывать их на сайте и автоматически возвращать после окончания периода отсутствия. В этой статье мы рассмотрим, как реализовать такую функциональность с помощью кода и плагинов, а также разберём примеры расширения админки для удобного управления.

Почему полезен функционал автoобновляемого отпуска для постов

В WordPress по умолчанию нет возможности задавать периоды активности для постов, кроме даты публикации и статуса. Если вы хотите, к примеру, автоматически скрывать посты на время отпуска автора, временной акции или акции с ограниченным сроком, то придётся либо вручную менять статус публикации, либо использовать дополнительный функционал.

Автоматизация такого процесса существенно экономит время и снижает вероятность ошибок. Это особенно актуально при большом объёме контента, когда вручную следить за сроками и переключать статусы неудобно и легко что-то пропустить.

Реализация функционала автoобновляемого отпуска позволит вам:

  • Задавать дату начала и окончания «отпуска» для каждого поста;
  • Автоматически переключать статус поста на черновик или скрытый по окончании периода;
  • Использовать удобный интерфейс в админке для управления периодами;
  • Гибко настраивать логику вывода постов на фронтенде в зависимости от текущей даты.

Как реализовать автoобновляемый отпуск для постов в WordPress: пошаговое руководство

Создаём метаполя для задания периода отпуска

Для начала нам нужно добавить два новых поля в редактор поста — Дата начала отпуска и Дата окончания отпуска. Это можно сделать через добавление метабокса с помощью хука add_meta_box.

function wpcodex_add_vacation_meta_box() {
    add_meta_box(
        'wpcodex_vacation_period',
        'Период отпуска поста',
        'wpcodex_vacation_meta_box_callback',
        'post',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpcodex_add_vacation_meta_box');

function wpcodex_vacation_meta_box_callback($post) {
    wp_nonce_field('wpcodex_save_vacation_data', 'wpcodex_vacation_nonce');
    $start = get_post_meta($post->ID, '_wpcodex_vacation_start', true);
    $end = get_post_meta($post->ID, '_wpcodex_vacation_end', true);
    ?>
    <p>
        <label for="wpcodex_vacation_start">Дата начала:</label><br>
        <input type="date" id="wpcodex_vacation_start" name="wpcodex_vacation_start" value="<?php echo esc_attr($start); ?>" />
    </p>
    <p>
        <label for="wpcodex_vacation_end">Дата окончания:</label><br>
        <input type="date" id="wpcodex_vacation_end" name="wpcodex_vacation_end" value="<?php echo esc_attr($end); ?>" />
    </p>
    <?php
}

Этот код добавляет метабокс с двумя полями типа date для удобного выбора дат. Далее нужно сохранить эти значения при сохранении поста.

Сохраняем данные отпуска при сохранении поста

function wpcodex_save_vacation_data($post_id) {
    if (!isset($_POST['wpcodex_vacation_nonce']) || !wp_verify_nonce($_POST['wpcodex_vacation_nonce'], 'wpcodex_save_vacation_data')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wpcodex_vacation_start'])) {
        update_post_meta($post_id, '_wpcodex_vacation_start', sanitize_text_field($_POST['wpcodex_vacation_start']));
    } else {
        delete_post_meta($post_id, '_wpcodex_vacation_start');
    }
    if (isset($_POST['wpcodex_vacation_end'])) {
        update_post_meta($post_id, '_wpcodex_vacation_end', sanitize_text_field($_POST['wpcodex_vacation_end']));
    } else {
        delete_post_meta($post_id, '_wpcodex_vacation_end');
    }
}
add_action('save_post', 'wpcodex_save_vacation_data');

Теперь при сохранении поста в метаполях будут храниться даты отпуска.

Автоматическое изменение статуса поста в зависимости от отпуска

Нужно сделать так, чтобы посты, которые находятся в периоде отпуска, автоматически становились недоступными для показа. Самый простой способ — менять их статус на draft в период отпуска и возвращать в publish после окончания.

Для этого создадим функцию, которая будет запускаться по крону ежедневно и проверять все посты с установленными датами отпуска.

function wpcodex_update_vacation_posts_status() {
    $today = date('Y-m-d');

    $args = [
        'post_type' => 'post',
        'post_status' => ['publish', 'draft'],
        'meta_query' => [
            [
                'key' => '_wpcodex_vacation_start',
                'compare' => 'EXISTS'
            ],
            [
                'key' => '_wpcodex_vacation_end',
                'compare' => 'EXISTS'
            ]
        ],
        'posts_per_page' => -1
    ];
    $posts = get_posts($args);

    foreach ($posts as $post) {
        $start = get_post_meta($post->ID, '_wpcodex_vacation_start', true);
        $end = get_post_meta($post->ID, '_wpcodex_vacation_end', true);

        if ($start && $end) {
            if ($today >= $start && $today <= $end) {
                if ($post->post_status !== 'draft') {
                    wp_update_post([
                        'ID' => $post->ID,
                        'post_status' => 'draft'
                    ]);
                }
            } else {
                if ($post->post_status !== 'publish') {
                    wp_update_post([
                        'ID' => $post->ID,
                        'post_status' => 'publish'
                    ]);
                }
            }
        }
    }
}

if (!wp_next_scheduled('wpcodex_daily_vacation_check')) {
    wp_schedule_event(time(), 'daily', 'wpcodex_daily_vacation_check');
}
add_action('wpcodex_daily_vacation_check', 'wpcodex_update_vacation_posts_status');

Этот код создаёт ежедневное событие, которое проверяет посты и меняет их статус в зависимости от текущей даты и периода отпуска.

Дополнительные возможности и улучшения

Вывод уведомления в админке о текущем статусе отпуска

Для удобства администраторов можно добавить информер в списке постов, который покажет, что пост сейчас в отпуске и когда он закончится. Для этого используем фильтр manage_posts_columns и manage_posts_custom_column.

function wpcodex_add_vacation_column($columns) {
    $columns['wpcodex_vacation'] = 'Отпуск';
    return $columns;
}
add_filter('manage_posts_columns', 'wpcodex_add_vacation_column');

function wpcodex_show_vacation_column($column, $post_id) {
    if ($column === 'wpcodex_vacation') {
        $start = get_post_meta($post_id, '_wpcodex_vacation_start', true);
        $end = get_post_meta($post_id, '_wpcodex_vacation_end', true);
        $today = date('Y-m-d');

        if ($start && $end && $today >= $start && $today <= $end) {
            echo '– В отпуске до ' . esc_html($end);
        } else {
            echo '– Нет';
        }
    }
}
add_action('manage_posts_custom_column', 'wpcodex_show_vacation_column', 10, 2);

Плагины для расширения функционала управления публикациями

Если вы не хотите писать код, существуют плагины, которые частично решают задачу:

  • PublishPress Future — позволяет автоматически менять статус постов по расписанию, отменять публикацию и возвращать обратно.
  • Schedule Posts — расширяет стандартный функционал планирования публикаций с возможностью отложенного снятия с публикации.

Однако именно гибкая настройка отпуска с датами начала и окончания, как описано выше, обычно требует кастомного решения, адаптированного под конкретные задачи.

Как исключить посты в отпуске из вывода на сайте без изменения статуса

Иногда менять статус поста не хочется — это может повлиять на другие процессы. В таком случае можно исключить посты из запросов WordPress, если они в отпуске, используя фильтр pre_get_posts.

function wpcodex_exclude_vacation_posts($query) {
    if (!is_admin() && $query->is_main_query()) {
        $today = date('Y-m-d');

        $meta_query = [
            'relation' => 'OR',
            [
                'key' => '_wpcodex_vacation_start',
                'compare' => 'NOT EXISTS'
            ],
            [
                'key' => '_wpcodex_vacation_end',
                'compare' => 'NOT EXISTS'
            ],
            [
                'relation' => 'OR',
                [
                    'key' => '_wpcodex_vacation_start',
                    'value' => $today,
                    'compare' => '>',
                    'type' => 'DATE'
                ],
                [
                    'key' => '_wpcodex_vacation_end',
                    'value' => $today,
                    'compare' => '<',
                    'type' => 'DATE'
                ]
            ]
        ];
        $query->set('meta_query', $meta_query);
    }
}
add_action('pre_get_posts', 'wpcodex_exclude_vacation_posts');

Так посты, у которых период отпуска совпадает с текущей датой, просто не попадут в основной запрос на фронтенде.

Выводы

Функционал автoобновляемого отпуска для постов в WordPress — полезный инструмент для управления временной доступностью контента. Он помогает автоматизировать процессы, уменьшить ручную работу и избежать ошибок при публикации и скрытии материалов.

В статье мы рассмотрели, как добавить метаполя для задания периода отпуска, как автоматически менять статус поста по расписанию и как исключать такие посты из вывода без изменения статуса. Также показали, как сделать удобный интерфейс в админке и привели примеры плагинов, которые могут помочь.

Такой подход легко расширяется и может быть адаптирован под любые задачи, связанные с временной публикацией и скрытием контента в WordPress.

WooCommerce: как автоматически удалять товары из корзины после успешной оплаты
09.05.2026
WooCommerce: как избавиться от проблемы повторных заказов после успешной оплаты
26.04.2026
Автоматический импорт из Twitter в WordPress: пошаговое руководство
16.04.2026
Как создать автоматический импорт данных из Google Analytics в WordPress
11.03.2026
Автоматическое создание копий постов в WordPress
01.04.2026