Intereting Posts
Добавить пользовательскую вкладку в медиа-менеджере Могу ли я использовать REST-API в формате простой permalink? Как удалить фоновое изображение из элементов навигационной системы? wordpress обновлять несколько сообщений post meta Зачем использовать dynamic_sidebar () условно? Как увеличить увеличенное изображение эскиза сообщения? Необычно использовать параметры WP_Options? Как отсортировать пользовательский запрос WordPress с помощью комбинации метазначений? Архив настраиваемого почтового типа – {post-type} .php не работает Сделайте первое изображение миниатюром сообщения, не устанавливая его как отображаемое изображение Правило ReWrite для файлов ранее автономного блога переместилось в сеть Сообщение изображения создает необычный дополнительный HTML Отправлять уведомление администратору при отправке новой персонализированной почты В чем разница между идентификатором блога и идентификатором сайта? Флажок WordPress и недопустимое смещение строки

Как избежать бесконечного цикла в обратном вызове save_post

Я использовал этот сайт для решения моих проблем, но на этот раз мне не удалось найти и ответить на мои проблемы.

Я получаю бесконечный цикл при использовании wp_update_post внутри функции, вызываемой в save_post . Я знаю, что это распространенная проблема, но я не могу понять, как ее избежать.

Я хочу сохранить порядок моих сообщений (который относится к разделу «пост-типа»). Поэтому я создал пользовательский мета-ящик, содержащий некоторые сортируемые html-элементы. В каждом элементе есть скрытый входной тег с именем = 'sectionorder []'. Поэтому, когда я нажимаю кнопку стандартного WordPress 'Update', массив, содержащий все идентификаторы сообщений (в порядке), отправляется через POST. Итак, вот код, в котором я извлекаю массив, и хочу сохранить заказ:

  // Update section sort order $sectionorder = $_POST['sectionorder']; if (isset($sectionorder)) { // Avoid error if there is no sections added yet foreach( $sectionorder as $no => $sectionID ) { $post_update = array(); $post_update['ID'] = $sectionID; $post_update['menu_order'] = $no; wp_update_post( $post_update ); } } 

Но проблема в том, что он запускает бесконечный цикл. Как этого избежать? Может быть, я могу сделать это совершенно по-другому?

Приложите свою помощь!

Вы можете удалить обратный вызов из save_post , обновить сообщение, а затем снова добавить вызов обратно на крючок. Приводится пример Кодекса .

 add_action('save_post', 'wpse51363_save_post'); function wpse51363_save_post($post_id) { //Check it's not an auto save routine if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return; //Perform permission checks! For example: if ( !current_user_can('edit_post', $post_id) ) return; //Check your nonce! //If calling wp_update_post, unhook this function so it doesn't loop infinitely remove_action('save_post', 'wpse51363_save_post'); // call wp_update_post update, which calls save_post again. Eg: wp_update_post(array('ID' => $post_id, 'post_status' => 'private')); // re-hook this function add_action('save_post', 'wpse51363_save_post'); } 

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

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

 add_action('save_post', 'wpse51363_save_post', 25 ); 

// НЕПРАВИЛЬНЫЙ способ справиться с этим – приводит к бесконечному циклу

 remove_action('save_post', 'wpse51363_save_post'); wp_update_post(array('ID' => $post_id, 'post_status' => 'private')); add_action('save_post', 'wpse51363_save_post'); 

// ПРАВЫЙ способ справиться с этим – выполняется только один раз

 remove_action('save_post', 'wpse51363_save_post', 25 ); wp_update_post(array('ID' => $post_id, 'post_status' => 'private')); add_action('save_post', 'wpse51363_save_post', 25 );