Вопрос или проблема
У меня есть выбор даты ACF, который в настоящее время изменяет статус публикации с “Опубликовано” на “Черновик”. Тем не менее, я также пытаюсь изменить категорию статьи. Если кто-то может указать мне правильное направление, я был бы очень признателен.
if ($expireTransient = get_transient($post->ID) === false) {
set_transient($post->ID, 'установить на 1 минуту', 1 * MINUTE_IN_SECONDS );
$today = date('Y-m-d H:i:s', current_time('timestamp', 0));
$args = array(
'post_type' => 'post',
'category_name' => '',
'posts_per_page' => 200,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'end_date_time', // Название поля ACF
'value' => $today,
'compare' => '<='
)
)
);
$posts = get_posts($args);
foreach( $posts as $post ) {
if(get_field('end_date_time', $post->ID)) {
$postdata = array(
'ID' => $post->ID,
'category_name' => 'premium', // Здесь изменить ярлык названия категории?
'post_status' => 'draft'
);
wp_update_post($postdata);
}
}
}
Похоже, я нашел проблему. Чтобы изменить категорию статьи, вы не можете использовать wp_update_post() для этого. Вместо этого я использовал wp_set_post_categories(); Также хочу отметить, что это категории, которые я создал в мета-в окне, которое отображается на странице редактирования записи.
if ($expireTransient = get_transient($post->ID) === false) {
set_transient($post->ID, 'установить на 1 минуту', 1 * MINUTE_IN_SECONDS );
$today = date('Y-m-d H:i:s', current_time('timestamp', 0));
$args = array(
// 'category_name' => '',
'post_type' => 'post',
'posts_per_page' => 200,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'end_date_time',
'value' => $today,
'compare' => '<='
)
)
);
$posts = get_posts($args);
foreach( $posts as $post ) {
if(get_field('end_date_time', $post->ID)) {
$postdata = array(
'ID' => $post->ID,
'post_status' => 'draft'
);
// Добавленный код
$post_id = $post->ID;
wp_set_post_categories( $post_id, array(13003), $append ); // id категории в массиве.
wp_update_post($postdata);
}
}
}
Ответ или решение
Чтобы изменить категорию поста на WordPress, используя ACF (Advanced Custom Fields) и дату, выбираемую через date picker, необходимо правильно настроить код для взаимодействия с системными функциями WordPress. Давайте рассмотрим подробные шаги для достижения этой цели, основываясь на вашем коде и комментариях.
Шаг 1: Установка временной метки
В начале кода проверяется, установлена ли временная метка для поста с использованием функции get_transient()
. Если она отсутствует, создаётся новая метка с использованием set_transient()
, что позволяет избежать повторного выполнения кода в течение некоторого времени, что может улучшить производительность.
Шаг 2: Определение текущей даты
Затем с помощью current_time()
мы получаем текущее время в формате ‘Y-m-d H:i:s’, чтобы использовать его для сравнения с пользовательским полем ‘end_date_time’, созданным при помощи ACF.
Шаг 3: Получение постов
Ваша функция get_posts()
ищет все опубликованные посты, у которых поле ‘end_date_time’ меньше или равно текущей дате. Это позволяет нам отобрать именно те посты, которые пора менять статус и категорию.
Шаг 4: Обновление статуса и категории поста
В цикле foreach
мы обходим все найденные посты и проверяем, установлено ли поле ‘end_date_time’. Если оно установлено, мы создаём массив $postdata
для обновления статуса поста на ‘draft’.
Важно: Для изменения категории поста используется функция wp_set_post_categories()
, которая требует передачи ID категории, которую мы хотим установить. В вашем примере вы передаёте ID категории в виде массива. Убедитесь, что ID указан правильно.
Пример исправленного кода
if ($expireTransient = get_transient($post->ID) === false) {
set_transient($post->ID, 'set for 1 minutes', 1 * MINUTE_IN_SECONDS);
$today = date('Y-m-d H:i:s', current_time('timestamp', 0));
$args = array(
'post_type' => 'post',
'posts_per_page' => 200,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'end_date_time',
'value' => $today,
'compare' => '<=',
),
),
);
$posts = get_posts($args);
foreach ($posts as $post) {
if (get_field('end_date_time', $post->ID)) {
// Обновление статуса поста
$postdata = array(
'ID' => $post->ID,
'post_status' => 'draft',
);
// Установка категории
wp_set_post_categories($post->ID, array(13003), false); // Замените 13003 на актуальный ID вашей категории
// Обновление поста
wp_update_post($postdata);
}
}
}
Заключение
Таким образом, обновление статуса и категории поста с помощью ACF date picker осуществляется довольно просто, если правильно использовать функции WordPress. Убедитесь, что ID категории правильные и соответствуют вашим внутренним настройкам. Также не забудьте оптимизировать код для более эффективной работы на больших объемах данных, чтобы избежать излишней нагрузки на систему.
Этот метод позволит вам динамически менять статус постов и их категории на основе выбранной даты, улучшая управление контентом на вашем сайте.