Intereting Posts
Как заставить пользовательский тип сообщения использовать конкретный шаблон? Я хочу, чтобы запрос отображал теги Превращение разбитых URL-адресов в условия поиска? Домашняя страница WordPress не работает, но другие страницы. Как исправить? Перенаправление всех страниц, кроме одного на главную, через .htaccess Как я могу повторно активировать предупреждение об отключении редактирования файлов? dirname (__FILE__), возвращающий неправильный каталог внутри плагина Фильтрация виджета Любой плагин приводит к отказу от использования мобильных устройств Список сообщений пользовательских типов сообщений, упорядоченных по условиям пользовательской таксономии? Использование пользовательских таксономий для отображения иерархических URL-адресов? Отфильтруйте второй раскрывающийся список, когда значение выбрано в первом Скрыть div, когда пользовательское поле пуст Ничего не найдено из запроса $ wpdb-> get_results () при попытке присоединиться к более чем одному запросу мета-ключа проблема с установкой плагинов (довольно новичок)

Манипулировать категорию должности после времени

Прочитав несколько сообщений о манипуляциях с почтовыми категориями с заданным временем, я хотел создать плагин, который будет манипулировать сообщениями после даты. Моя первоначальная ссылка для справки – шесть лет назад: « Плагин для изменения категории публикации на основе даты публикации? », Но я упомянул несколько сообщений о манипуляциях:

  • Мне нужно массовое обновление всех сообщений WordPress в запланированное время
  • Как я могу скрыть сообщения, которым больше 2 лет

Однако он не удаляет категорию и не добавляет новую:

Код:

function check_if_cat_has_reached_time() { // test if term exists and if doesn't return $test_term1 = term_exists('Uncategorized', 'category'); if ($test_term1 !== 0 && $test_term1 !== null) : // $default_cat = get_term_by('id', 'Uncategorized', 'category'); $default_cat = get_cat_ID('uncategorized'); else : return; endif; // test if term exists and if doesn't return $test_term2 = term_exists('failed', 'category'); if ($test_term2 !== 0 && $test_term2 !== null) : $new_cat = get_cat_ID('failed'); else : return; endif; global $post; // the Post ID $the_ID = $post->ID; // Post creation time in epoch // $post_creation = get_the_time('U',$the_ID); // current time in epoch $current_time = time(); // two years in epoch $two_years = 31556926*2; // post time plus two years $post_plus_two = (int)$two_years + (int)get_the_time('U',$the_ID); if ($current_time >= $post_plus_two && has_category($default_cat,$the_ID)) : wp_remove_object_terms($the_ID, $default_cat, 'category'); $update_post_cat = array( 'post_category' => array($new_cat), ); wp_insert_post($update_post_cat); endif; } add_action('save_post', 'check_if_cat_has_reached_time'); 

Есть ли причина, по которой wp_remove_object_terms() не работает? Я использовал это после прочтения. Удалите определенную категорию из сообщения .

Поэтому мои вопросы:

  • Исправляю ли я категорию?
  • Я правильно обновляю категорию?
  • Есть ли лучший крючок для манипулирования сообщениями в плагине?
  • Были ли какие-либо проблемы с производительностью, если бы это было реализовано на сайте с несколькими тысячами сообщений?

РЕДАКТИРОВАТЬ:

Ниже я попытался реализовать в функции function.php моей темы, но он все еще не работает. Я использую тему по умолчанию с WP Test . Перед выполнением функции я создаю категории:

 function create_foo_category() { wp_insert_term( 'Foo', 'category', array( 'description' => 'This is the Foo', 'slug' => 'foo' ) ); } add_action('after_setup_theme', 'create_foo_category'); 

затем для bar :

 function create_bar_category() { wp_insert_term( 'Bar', 'category', array( 'description' => 'This is the bar', 'slug' => 'bar' ) ); } add_action('after_setup_theme', 'create_bar_category'); 

Я попытался манипулировать предоставленным ответом:

 function check_if_cat_has_reached_time() { global $post; $the_ID = $post->ID; if (!wp_is_post_revision($the_ID)) { // unhook this function so it doesn't loop infinitely remove_action('save_post', 'check_if_cat_has_reached_time'); // test if term exists and if doesn't return $check_default_cat = term_exists('Foo', 'category'); if ($check_default_cat !== 0 && $check_default_cat !== null) { $default_cat = get_cat_ID('foo'); } else { return; } // test if term exists and if doesn't return $check_new_cat = term_exists('Bar', 'category'); if ($check_new_cat !== 0 && $check_new_cat !== null) { $new_cat = get_cat_ID('bar'); } else { return; } // current time in epoch $current_time = time(); // two years in epoch $two_years = 31556926*2; // post time plus two years $post_plus_two = (int)$two_years + (int)get_the_time('U',$the_ID); if ($current_time >= $post_plus_two && has_category($default_cat,$the_ID)) { wp_remove_object_terms($the_ID, $default_cat, 'category'); $args = array( 'ID' => $the_ID, 'post_category' => array($new_cat), ); wp_update_post($args); } // re-hook this function add_action('save_post', 'check_if_cat_has_reached_time'); } } add_action('publish_post', 'check_if_cat_has_reached_time'); 

РЕДАКТИРОВАТЬ:

Поговорив с несколькими людьми, я думаю, что было несколько непонятно, для чего была предназначена цель вышеупомянутого. Я хочу изменить сообщения, не вдаваясь в них с чем-то вроде события ежедневно. Обсудив этот вопрос, я узнал о wp_schedule_event() который я собираюсь проверить и отредактировать.

Solutions Collecting From Web of "Манипулировать категорию должности после времени"

Ваша текущая функция работает очень хорошо, но она зацепилась за крюк обновления, поэтому вам нужно фактически отредактировать / обновить сообщение для его запуска. Если вы хотите, чтобы сообщения были автоматически изменены после указанного времени, вам необходимо настроить запланированное событие. Я могу придумать два способа настроить расписание …

1. Повторяющееся событие, которое проверяет все (соответствующие) сообщения

Мы можем использовать wp_schedule_event() для запуска на крючке через определенные интервалы:

 // a custom hook to schedule add_action( 'wpse_269529_check_posts', 'wpse_269529_check_posts_cats' ); // make sure the event hasn't been scheduled if( !wp_next_scheduled( 'wpse_269529_check_posts' ) ) { // Schedule the event wp_schedule_event( time(), 'daily', 'wpse_269529_check_posts' ); } 

Параметрами для wp_schedule_event() являются (по порядку); когда первое событие должно выполняться (мы можем просто пропустить time() чтобы запустить его сейчас), как часто они должны запускаться (один из «почасовых», «twicedaily» или «daily») и крюк для запуска. Вы также можете передать некоторые аргументы, но нам это не нужно.

Мы также используем wp_next_scheduled() чтобы проверить, что событие еще не запланировано.

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

 function wpse_269529_check_posts_cats() { //categories $old_cat = get_cat_ID( 'foo' ); $new_cat = get_cat_ID( 'bar' ); // get all posts with the required category $args = array( 'posts_per_page' => -1, 'category' => $old_cat ); $myposts = get_posts( $args ); // loop through all posts and update with new category foreach ( $myposts as $mypost ) { $args = array( 'ID' => $mypost->ID, 'post_category' => array( $new_cat ), ); wp_update_post($args); } } 

Вы упоминаете производительность, и это пробегает все сообщения с категорией, поэтому, возможно, это не лучший вариант …

2. Одно запланированное событие за сообщение

Вы можете сделать это с помощью wp_schedule_single_event() и создать расписание создания сообщений (обратите внимание, что они будут работать только на новых сообщениях и не существующих). Вы используете функцию publish_post которая установит расписание:

 // runs when a post is published add_action( 'publish_post', 'wpse_269529_schedule_post_check' ); function wpse_269529_schedule_post_check( $post_id ) { // set the time when the event should be scheduled $timestamp = strtotime( '+2 years' ); // Schedule the event wp_schedule_single_event( $timestamp, 'wpse_269529_check_post', array( $post_id ) ); } 

Теперь, поскольку мы подключили это к publish_post , мы можем передать идентификатор сообщения запланированному событию и обновить эту запись на основе этого (не забудьте указать количество параметров на крючке действия на «1» для нашего идентификатора):

 // a custom hook to schedule add_action( 'wpse_269529_check_post', 'wpse_269529_check_post_cats', 10, 1 ); // replace post categories function wpse_269529_check_post_cats( $post_id ) { //categories $old_cat = get_cat_ID( 'foo' ); $new_cat = get_cat_ID( 'bar' ); // check for the old category if ( has_category( $old_cat, $post_id ) ) { // update post with new category $args = array( 'ID' => $post_id, 'post_category' => array( $new_cat ), ); wp_update_post($args); } } 

Вы можете использовать комбинацию из двух и циклически перемещаться по всем существующим сообщениям при подключении плагина или темы (или что-то еще в зависимости от того, когда, почему и как вы это делаете), а затем запланировать обновление за сообщение для всех новых сообщений.

Крючок save_post передает идентификатор сообщения в функцию обратного вызова, поэтому нет необходимости использовать get_the_ID() .

Если вы используете wp_insert_post() , новый пост будет вставлен в базу данных при каждом сохранении сообщения. Вместо этого используйте wp_update_post() :

 function check_if_cat_has_reached_time($post_id) { if ( ! wp_is_post_revision( $post_id ) ){ // unhook this function so it doesn't loop infinitely remove_action('save_post', 'check_if_cat_has_reached_time'); // test if term exists and if doesn't return $check_default_cat = term_exists('Uncategorized', 'category'); if ($check_default_cat !== 0 && $check_default_cat !== null) { $default_cat = get_cat_ID('uncategorized'); } else { return; } // test if term exists and if doesn't return $check_new_cat = term_exists('failed', 'category'); if ($check_new_cat !== 0 && $check_new_cat !== null) { $new_cat = get_cat_ID('failed'); } else { return; } // post time plus two years $post_plus_two = strtotime('+2 years') + strtotime(get_the_date('YM-d',$post_id)); if (strototime(date('YM-d')) >= $post_plus_two && has_category($default_cat,$post_id)) { wp_remove_object_terms($post_id, $default_cat, 'category'); $args = array( 'ID' => $post_id, 'post_category' => array($new_cat), ); wp_update_post($args); } // re-hook this function add_action('save_post', 'check_if_cat_has_reached_time'); } } add_action('publish_post', 'check_if_cat_has_reached_time'); 

Часть remove_action важна, поскольку wp_update_post запускает save_post каждом вызове, поэтому можно создать бесконечный цикл.