Как составлять посты после публикации с интервалом в x дней

Вопрос или проблема

Я хотел бы превратить любые из моих опубликованных постов в черновики через 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' );
}

Документация:

Документация используемых функций:

только два небольших комментария к коду Каса Деккерса.

  1. В
        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);
  1. Можно задать пользовательское время, используя фильтры:
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 по следующим ссылкам:

Заключение

Используя приведенные выше инструкции, вы сможете автоматически переводить опубликованные посты в черновики через установленный период времени без использования плагинов. Это поможет вам поддерживать порядок на вашем сайте и управлять контентом более эффективно. Если у вас возникнут вопросы или дополнительные потребности, не стесняйтесь оставлять комментарии!

Оцените материал
Добавить комментарий

Капча загружается...