- Вопрос или проблема
- Ответ или решение
- Установка срока действия поста и удаление поста по истечении срока
- Шаг 1: Определение и добавление поля с датой истечения
- Шаг 2: Настройка функции для разметки постов
- Шаг 3: Регистрация Крон-задачи
- Шаг 4: Оптимизация для производительности
- Шаг 5: Тестирование и отладка
- Заключение
Вопрос или проблема
Я пытаюсь создать функцию, которая позволит мне удалить статью, когда дата дня равна или больше даты, указанной в пользовательском поле ACF.
Я написал функцию ниже, которую поместил в свой single.php, чтобы протестировать ее. Она работает, за исключением того, что необходимо читать статью, чтобы эта функция сработала (на самом деле довольно логично).
Что я хочу, так это чтобы эта функция работала сама по себе для всех статей, автоматически, без необходимости заходить в статьи. Вот здесь мне сложно, я часто использую плагины для выполнения таких задач.
Не могли бы вы показать мне несколько способов достижения желаемого результата? Я действительно хочу улучшить свои навыки разработки на стороне сервера, используя WordPress, так что я не прошу вас о готовом решении, а о способах, чтобы направить мою работу.
Вот функция:
/**
* Черновик после истечения срока
*/
function draft_the_post(){
$expire_date = get_field( "field_5cef86384e5f2" );
$actual_date = date("d-m-Y");
$postid = $post->ID;
if ($expire_date <= $actual_date) {
wp_update_post(array(
'ID' => $postid,
'post_status' => 'draft'
));
} else {
echo "Дата не совпадает или меньше сегодняшней";
};
}
О, и извините за мой английский, я француз 🙂
Заранее спасибо,
willwoody.
Правильный способ — использовать WordPress Cron и запланировать ваше событие. Также следует рассмотреть возможность добавления реальной задачи cron, как указано здесь для большей точности.
1.) Я изменил вашу функцию draft_the_post
, чтобы она поддерживала параметр. Теперь мы можем указать, какая статья, и я также обновил часть, которая проверяет время.
2.) dg_cron_schedule_delete_posts
будет запланировать хуку, если она не запланирована, когда срабатывает инициализационный хук. Я установил это на ежечасно
для большей точности, но вы также можете установить это на ежедневно
. Примечание: если вы делаете это с плагином, лучше использовать хук активации и запланировать его здесь.
3.) dg_delete_posts_handler
— это то место, где обрабатывается удаление. Оно проходит через все статьи и вызывает функцию maybe_draft_the_post
для каждой. Примечание: это запрашивает все статьи, поэтому в зависимости от того, насколько велика ваша база данных, это может вызвать проблемы с производительностью. Я предлагаю реализовать некий тип очереди, но это должно быть хорошей отправной точкой.
/**
* Функция, которая будет черновиком конкретной статьи при определенных условиях
*
* @param \WP_Post $_post
*/
function maybe_draft_the_post( $_post ) {
$expire_date = get_field( "your_field_name" );
// Выход, если дата истечения не установлена.
if ( ! $expire_date ) {
return;
}
$expire_date = strtotime( $expire_date );
$actual_date = time();
if ( $expire_date <= $actual_date ) {
wp_update_post( array(
'ID' => $_post->ID,
'post_status' => 'draft'
) );
}
}
/**
* Регистрация события cron в действии инициализации
*/
function dg_cron_schedule_delete_posts() {
$timestamp = wp_next_scheduled( 'dg_delete_posts' );
if ( $timestamp == false ) {
wp_schedule_event( time(), 'hourly', 'dg_delete_posts' );
}
}
add_action( 'init', 'dg_cron_schedule_delete_posts' );
/**
* Обработка удаления статей периодически.
* - Проходить через статьи и вызывать функцию draft_the_post.
*/
function dg_delete_posts_handler() {
$posts = get_posts( array(
'posts_per_page' => - 1,
'post_type' => 'post',
'post_status' => 'publish',
) );
foreach ( $posts as $_post ) {
maybe_draft_the_post( $_post );
}
}
add_action( 'dg_delete_posts', 'dg_delete_posts_handler' );
Добавьте следующий код в ваш файл functions.php
темы
Проверяет, имеет ли статья дату истечения, и если да, то планирует событие для удаления статьи после указанной даты истечения.
Функция delete_expired_post
подключена к действию delete_expired_post_event
, и она удаляет статью, когда запланированное событие срабатывает
// Запланировать событие при публикации или обновлении статьи
function schedule_post_expiration_event($ID, $post) {
$expiration_date = get_post_meta($ID, 'expiration_date', true);
// Проверка, имеет ли статья дату истечения
if ($expiration_date) {
// Конвертировать дату истечения в метку времени
$timestamp = strtotime($expiration_date);
// Запланировать событие для удаления статьи после даты истечения
wp_schedule_single_event($timestamp, 'delete_expired_post_event', array($ID));
}
}
add_action('publish_post', 'schedule_post_expiration_event', 10, 2);
add_action('save_post', 'schedule_post_expiration_event', 10, 2);
// Удалить статью, когда запланированное событие сработает
function delete_expired_post($post_id) {
wp_delete_post($post_id, true);
}
add_action('delete_expired_post_event', 'delete_expired_post');
Ответ или решение
Установка срока действия поста и удаление поста по истечении срока
Вопрос о том, как автоматизировать процесс удаления постов на WordPress по истечении установленного срока, является актуальным для многих разработчиков и владельцев сайтов. В данной статье мы рассматриваем методы, позволяющие добиться желаемого результата, используя WordPress Cron и встроенные функциональные возможности системы.
Шаг 1: Определение и добавление поля с датой истечения
Первым шагом является создание пользовательского поля, где будет храниться дата истечения поста. Вы можете использовать плагин Advanced Custom Fields (ACF) для этого. Для примера, используем поле с именем expiration_date
.
Шаг 2: Настройка функции для разметки постов
Создадим функцию, которая будет проверять статус и дату истечения постов. Пример кода, который вы можете добавить в файл functions.php
вашей темы:
/**
* Функция для проверки и изменения статуса поста
*
* @param \WP_Post $_post
*/
function maybe_draft_the_post($_post) {
$expiration_date = get_post_meta($_post->ID, 'expiration_date', true); // Получаем дату истечения
if (!$expiration_date) {
return; // Если дата отсутствует, выходим из функции
}
$expiration_timestamp = strtotime($expiration_date);
$current_timestamp = time();
if ($expiration_timestamp <= $current_timestamp) {
// Изменяем статус поста на 'draft', если истек срок
wp_update_post(array(
'ID' => $_post->ID,
'post_status' => 'draft'
));
}
}
Шаг 3: Регистрация Крон-задачи
Теперь создадим расписание для работы вышеуказанной функции. Это можно сделать с помощью функции, которая будет запускаться регулярно (например, раз в час):
/**
* Регистрация Крон-задачи
*/
function dg_cron_schedule_delete_posts() {
if (!wp_next_scheduled('dg_delete_posts')) {
wp_schedule_event(time(), 'hourly', 'dg_delete_posts'); // Устанавливаем расписание
}
}
add_action('init', 'dg_cron_schedule_delete_posts');
/**
* Обработка удаления постов
*/
function dg_delete_posts_handler() {
$posts = get_posts(array(
'posts_per_page' => -1,
'post_type' => 'post',
'post_status' => 'publish'
));
foreach ($posts as $_post) {
maybe_draft_the_post($_post);
}
}
add_action('dg_delete_posts', 'dg_delete_posts_handler');
Шаг 4: Оптимизация для производительности
Учитывая, что метод выше опрашивает все посты на сайте, с увеличением их количества может возникнуть проблема производительности. Рассмотрите возможность реализации очереди обработки постов или использование мета-записей, чтобы избежать повторного опроса уже обработанных постов.
Шаг 5: Тестирование и отладка
Не забудьте протестировать ваше решение в безопасной среде перед развертыванием на живом сайте. Проверьте, что посты действительно переходят в статус draft
после истечения срока действия и что механизм Крон работает корректно.
Заключение
Использование WordPress Cron в сочетании с пользовательскими полями дает гибкость для управления сроками действия постов. Следуйте приведенным шагам, и вы сможете реализовать автоматическое обновление статуса ваших постов без необходимости вмешательства. Это улучшит управление контентом на вашем сайте и повысит эффективность работы административной панели.
Эти рекомендации помогли вам разобраться, как можно автоматизировать процесс удаления устаревшего контента. Продолжайте изучение возможностей WordPress и развивайте свои навыки!