В некоторых проектах на 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.