Вопрос или проблема
Я хотел бы превратить любые из моих опубликованных постов в черновики через X дней. Я пробовал делать это с помощью нескольких плагинов WordPress, но они не помогли. Может ли кто-то помочь мне сделать это? Спасибо
Я бы предложил вам использовать wp_schedule_event()
и создать пользовательский хук, который вы будете вызывать ежедневно. Этот хук может затем вызывать пользовательскую функцию, в которой вы запрашиваете посты с нужной датой публикации и меняете их статус.
Например, создайте новый плагин и добавьте (заметьте: я не тестировал это):
// Запланировать автоматическое создание черновиков постов при активации плагина.
register_activation_hook( __FILE__, 'schedule_auto_draft_posts' );
add_action( 'auto_draft_posts', 'draft_posts' );
function schedule_auto_draft_posts() {
wp_schedule_event( time(), 'daily', 'auto_draft_posts' );
}
// Превратить опубликованные посты в черновики на основе даты публикации поста.
function draft_posts() {
$old_status="publish";
$new_status="draft";
// Пример: получить опубликованные посты, сделанные до прошлой недели.
$posts = get_posts(
array(
'date_query' => array(
array(
'column' => 'post_date_gmt',
'before' => '1 week ago',
),
),
'fields' => 'all',
'numberposts' => -1,
'post_status' => $old_status,
)
);
foreach ($posts as $post) {
// Обновить статус поста.
wp_update_post(
'ID' => $post->ID,
'status' => $new_status,
);
// Запустить действия, связанные с изменением статуса поста.
wp_transition_post_status( $new_status, $old_status, $post );
}
}
// Очистить планировщик при деактивации плагина.
register_deactivation_hook( __FILE__, 'unschedule_auto_draft_posts' );
function unschedule_auto_draft_posts() {
wp_clear_scheduled_hook( 'auto_draft_posts' );
}
Документация:
- Понимание планирования WP-Cron
- Если вы хотите получить посты с помощью собственного запроса по дате, вы можете использовать относительные форматы даты PHP.
Документация используемых функций:
только два небольших комментария к коду Каса Деккерса.
- В
wp_update_post(
'ID' => $post->ID,
'post_status' => $new_status,
);
это должно быть массивом:
wp_update_post(array(
'ID' => $post->ID,
'post_status' => $new_status,
);
);
или
$my_post = array(
'ID' => $post->ID,
'post_status' => $new_status,
);
wp_update_post($my_post);
- Можно задать пользовательское время, используя фильтры:
add_filter( 'cron_schedules', 'my_own_time_schedule' );
function my_own_time_schedule( $schedules ) {
$schedules['one_minut'] = array(
'interval' => 60, //секунды
'display' => __( 'Раз в минуту' )
);
$schedules['ten_minutes'] = array(
'interval' => 600,
'display' => __( 'Каждые десять минут' )
);
return $schedules;
}
Ответ или решение
Как переводить опубликованные посты в черновики через X дней в WordPress
Если вы хотите автоматически переводить свои опубликованные посты в черновики после определенного периода времени (например, после X дней), это можно сделать с помощью кода в вашем WordPress. Вы уже пробовали несколько плагинов, но они не сработали, и это вполне распространенная ситуация. В этой статье мы рассмотрим, как можно создать простой плагин для решения вашей задачи с использованием функции wp_schedule_event()
и кастомного хука.
Шаги для реализации
1. Создайте новый плагин
Для начала, создайте новый файл в директории wp-content/plugins/
. Назовите его, например, auto-draft-posts.php
. Внутри этого файла добавьте следующий код:
<?php
/*
Plugin Name: Auto Draft Posts
Description: Автоматически переводит опубликованные посты в черновики через установленное количество дней.
Version: 1.0
Author: Ваше Имя
*/
// Запланируем событие при активации плагина.
register_activation_hook( __FILE__, 'schedule_auto_draft_posts' );
// Хук, который будет срабатывать каждый день.
add_action( 'auto_draft_posts', 'draft_posts' );
function schedule_auto_draft_posts() {
if ( ! wp_next_scheduled( 'auto_draft_posts' ) ) {
wp_schedule_event( time(), 'daily', 'auto_draft_posts' );
}
}
// Функция для перевода постов в черновики.
function draft_posts() {
$old_status = "publish";
$new_status = "draft";
$days_to_check = 7; // Укажите количество дней (например, 7 дней)
$date_query = date('Y-m-d H:i:s', strtotime('-' . $days_to_check . ' days'));
$posts = get_posts( array(
'date_query' => array(
array(
'column' => 'post_date_gmt',
'before' => $date_query,
),
),
'fields' => 'all',
'numberposts' => -1,
'post_status' => $old_status,
));
foreach ($posts as $post) {
// Обновляем статус поста.
wp_update_post( array(
'ID' => $post->ID,
'post_status' => $new_status,
));
// Сигнализируем о смене статуса поста.
wp_transition_post_status( $new_status, $old_status, $post );
}
}
// Очищаем запланированные задачи при деактивации плагина.
register_deactivation_hook( __FILE__, 'unschedule_auto_draft_posts' );
function unschedule_auto_draft_posts() {
wp_clear_scheduled_hook( 'auto_draft_posts' );
}
?>
2. Пояснения к коду
-
Активация плагина: Когда вы активируете плагин, он автоматически запланирует ежедневное событие, которое будет вызывать функцию
draft_posts
. -
Функция
draft_posts
: Эта функция ищет все опубликованные посты, которые были созданы более чемX
дней назад, и меняет их статус на «черновик». Вы можете изменить значение$days_to_check
, чтобы указать нужное вам количество дней.
3. Дополнительные возможности
Вы можете добавить фильтры для частоты запуска задачи. Например, если вы хотите, чтобы задача выполнялась каждые 10 минут, добавьте следующий код в файл вашего плагина:
add_filter( 'cron_schedules', 'my_own_time_schedule' );
function my_own_time_schedule( $schedules ) {
$schedules['ten_minutes'] = array(
'interval' => 600, // Время в секундах
'display' => __( 'Каждые 10 минут' )
);
return $schedules;
}
4. Библиотеки и ресурсы
Для получения дополнительной информации вы можете ознакомиться с документацией WordPress по следующим ссылкам:
Заключение
Используя приведенные выше инструкции, вы сможете автоматически переводить опубликованные посты в черновики через установленный период времени без использования плагинов. Это поможет вам поддерживать порядок на вашем сайте и управлять контентом более эффективно. Если у вас возникнут вопросы или дополнительные потребности, не стесняйтесь оставлять комментарии!