Як уникнути нескінченного циклу в зворотному дзвінку save_post


12

Я використовую цей сайт багато для вирішення своїх проблем, але цього разу мені не вдалося знайти і відповісти на свою проблему.

Я отримую і нескінченний цикл при використанні wp_update_postвсередині функції, яка викликається save_post. Я знаю, що це поширене питання, але я не можу зрозуміти, як цього уникнути.

Я хочу зберегти порядок моїх публікацій (який має "розділ" після публікації). Тому я створив власну метабокс, який містить деякі сортовані html-елементи. У кожному елементі є прихований тег вводу з ім'ям = 'sectionorder []'. Отже, коли я натискаю стандартний WordPress "Update" Buttom, масив, що містить усі ідентифікатори повідомлень (в порядку), надсилається через 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 );
    }
}

Але проблема полягає в тому, що він запускає нескінченну петлю. Як я цього уникаю? Можливо, я можу це зробити зовсім по-іншому?

Цінуйте вашу допомогу!

Відповіді:


26

Ви можете зняти зворотний дзвінок з 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. E.g:
    wp_update_post(array('ID' => $post_id, 'post_status' => 'private'));

    // re-hook this function
    add_action('save_post', 'wpse51363_save_post');
}

Ого. Дякуємо за швидку відповідь. Працює як шарм! Не знаю, чому я сам не бачив цього прикладу коду ..
elgehelge

@Stephen, я використовую update_post_metaфункцію, підключену до того, save_postщоб я також знімав і знову відключався після update_post_meta?
Анагіо

Ні, update_post_metaне буде (як правило) причини save_postспрацьовувати.
Стівен Гарріс

Витративши годину, знайшов це, і це також заощадило більше годин, дякую.
Манчумахара

13

Я не дуже маю репутацію коментувати, тому я додаю відповідь, навіть незважаючи на те, що Стівен відмінний і правильний. Він просто не обробляє випадки, коли ви хочете встановити пріоритет дії.

Якщо ви додасте пріоритет при додаванні дії, але не вказуєте пріоритет, коли ви видалите його, ви все одно отримаєте нескінченний цикл.

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 );

1
Дякую! Я збивався, намагаючись зрозуміти, чому я все ще отримую нескінченний цикл, навіть коли додаю remove_action/add_action.
Банджер

1
WordPress Codex :: API плагінів / Довідка про дії / збереження публікації :: Уникнення нескінченних циклів Вони демонструють це. Якщо ви подивитеся на WordPress Codex :: Довідка про функцію / видалення дії: Використання "Пріоритет функції (як визначено, коли функція була спочатку підключена)." Якщо не вказано, він використовує пріоритет за замовчуванням (10). A / K / A - Ви повинні вказати пріоритет SAME як коли було додано дію, щоб АКТУАЛЬНО видалити дію.
Майкл Еклунд

Це відповідь, яку я шукав. Дякую :)
manuman94
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.