Вопрос или проблема
У меня есть пользовательское поле с названием “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-оптимизацию вашего сайта. Следите за тем, чтобы все изменения в статусах постов не влияли на индексируемость важного контента, и учитывайте использование метаданных для улучшения видимости вашего сайта в поисковых системах.
Таким образом, вы создаете не только качественный контент, но и удобную для пользователя архитектуру сайта, способствуя его развитию и оптимизации.