Проект стандартного сообщения от ACF Data picker

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

У меня есть пользовательское поле с названием “fecha_borrado”. Дата выбирается с помощью выбора даты из Advanced Custom Field.

У меня есть этот код, но он не работает. Может быть, я что-то сделал неправильно?

Я также добавил define(‘ALTERNATE_WP_CRON’, true); в мой файл wp-config

// истечение публикаций предложений по полю даты.
if (!wp_next_scheduled('expire_posts')){
  wp_schedule_event(time(), 'hourly', 'expire_posts'); // это может быть каждый час, дважды в день или ежедневно
}

add_action('expire_posts', 'expire_posts_function');

function expire_posts_function() {
    $today = date('Ymd');
    $args = array(
        'post_type' => array('post'), // типы публикаций, которые вы хотите проверить
        'posts_per_page' => -1 
    );
    $posts = get_posts($args);
    foreach($posts as $p){
        $expiredate = get_field('fecha_borrado', $p->ID, false, false); // получить исходную дату из базы данных
        if ($expiredate) {
            if($expiredate < $today){
                $postdata = array(
                    'ID' => $p->ID,
                    'post_status' => 'draft'
                );
                wp_update_post($postdata);
            }
        }
    }
}

Может быть, с этим будет лучше?

function delete_expired_posts() {
$args = array(
    'post_type' => 'post',
    'meta_query' => array(
        array(
            'key' => 'fecha_borrado', 
            'compare' => 'EXISTS',
        ),
    ),
    'posts_per_page' => -1, 
);

$query = new WP_Query($args);

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        $post_id = get_the_ID();

        $acf_date = get_field('fecha_borrado', $post_id); 
        $acf_timestamp = strtotime($acf_date);
        $current_timestamp = time();

        if ($acf_timestamp && $acf_timestamp < $current_timestamp) {
            wp_delete_post($post_id, true); // Удалить пост навсегда
        }
    }
}

wp_reset_postdata();
}

if (!wp_next_scheduled('delete_expired_posts_daily')) {
wp_schedule_event(time(), 'hourly', 'delete_expired_posts_daily');
}
add_action('delete_expired_posts_daily', 'delete_expired_posts');

Ответ или решение

Создание стандартного поста с помощью ACF Data Picker

Введение

Использование пользовательских полей в WordPress, таких как "fecha_borrado" из плагина Advanced Custom Fields (ACF), позволяет вам управлять содержимым сайта более эффективно. Поставленная задача — автоматизировать процесс удаления или изменения статуса постов на основе даты, указанной в этом поле. В данной статье мы рассмотрим оптимизацию вашего кода и решение проблем, с которыми вы столкнулись.

Проблема

Ваш исходный код имеет несколько недостатков, которые могут препятствовать его корректной работе. Вы хотите, чтобы посты автоматически меняли статус на ‘черновик’ или удалялись в зависимости от даты, установленной в пользовательском поле. Существующие функции, такие как wp_schedule_event, также нуждаются в оптимизации и корректировке.

Решение

Ниже приведён оптимизированный код, который выполнит вашу задачу. Мы разберём каждую часть подробней.

Шаг 1: Запланировать задачу

Мы сначала убедимся, что задача по проверке постов запланирована на выполнение. Напоминаем, что для этого необходимо добавить в файл wp-config.php строку define('ALTERNATE_WP_CRON', true);.

if (!wp_next_scheduled('check_expired_posts')) {
    wp_schedule_event(time(), 'hourly', 'check_expired_posts'); // Запускать каждый час
}

Шаг 2: Обработка события

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

add_action('check_expired_posts', 'expire_posts_function');

function expire_posts_function() {
    $args = array(
        'post_type' => 'post', // Проверяемые типы постов
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => 'fecha_borrado',
                'compare' => 'EXISTS',
            ),
        ),
    );

    $today = current_time('Y-m-d'); // Получаем текущую дату
    $posts = get_posts($args);

    foreach ($posts as $post) {
        $expire_date = get_field('fecha_borrado', $post->ID);
        $expire_timestamp = strtotime($expire_date);

        // Проверяем, если дата истекла
        if ($expire_timestamp && $expire_timestamp < strtotime($today)) {
            // Изменяем статус поста на 'черновик'
            $post_update = array(
                'ID' => $post->ID,
                'post_status' => 'draft',
            );
            wp_update_post($post_update);
        }
    }
}

Шаг 3: Завершение

Этот код будет регулярно проверять все посты на наличие пользовательского поля "fecha_borrado" и изменять их статус на ‘черновик’, если указанная дата истекла. Для полного удаления постов вы можете создать аналогичную функцию, но с использованием wp_delete_post, как вы это делали в вашем втором блоке кода.

Заключение

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

SEO-оптимизация

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

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

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

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