Save_post geri çağrısında sonsuz döngüden kaçınma


12

Bu siteyi sorunlarımı çözmek için çok kullanıyorum, ancak bu sefer sorunumu bulma ve cevaplamayı başaramadım.

Ben wp_update_postçağrılan bir işlev içinde kullanırken olsun ve sonsuz döngü save_post. Bunun ortak bir sorun olduğunu biliyorum, ancak nasıl önleneceğini anlayamıyorum.

Gönderilerimin sırasını kaydetmek istiyorum (post-type 'section' dan). Bu yüzden bazı sıralanabilir html öğeleri içeren özel bir meta kutu yaptık. Her öğede name = 'sectionorder []' ile gizli bir giriş etiketi vardır. Standart WordPress 'Güncelle' düğmesine tıkladığımda, gönderilerin tüm kimliklerini (sırayla) içeren bir dizi POST yoluyla gönderilir. İşte burada diziyi almak ve sipariş kaydetmek istiyor kodu:

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

Fakat sorun şu ki sonsuz bir döngü başlıyor. Bundan nasıl kaçınırım? Belki tamamen farklı bir şekilde yapabilirim?

Yardımınızı doğrulayın!

Yanıtlar:


26

Geri aramayı çağanozdan kaldırabilir, save_postpostayı güncelleyebilir ve ardından çağrıyı tekrar çağrıyı tekrar ekleyebilirsiniz. Codex bir örnek verir .

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

Vay. Hızlı cevap için teşekkürler. Tıkır tıkır çalışıyor! Neden bu kod örneğini kendim görmedim bilmiyorum ..
elgehelge

@Stephen, ben de update_post_metakanca save_postve sonra tekrar kanca gerekir kanca bağlı bir işlevde kullanın update_post_meta?
Anagio

Hayır, update_post_meta(genellikle) save_posttetiklenmeye neden olmaz .
Stephen Harris

Bir saat harcadıktan sonra bunu buldum ve bu da daha fazla saat tasarrufu sağladı, teşekkürler.
19'da Manchumahara 5:39

13

Ben yorum yapmak için itibar var bu yüzden Stephen mükemmel ve doğru olmasına rağmen bir cevap ekliyorum. İşlemin önceliğini ayarlamak istediğinizde yalnızca durumları işlemez.

Eylem eklerken önceliği ayarlarsanız, ancak eylemi kaldırırken öncelik belirtmezseniz, yine de sonsuz bir döngü elde edersiniz.

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

// Bunu yapmanın YANLIŞ yolu - sonsuz döngüye yol açar

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

// Bunu yapmanın SAĞ yolu - yalnızca bir kez yürütülür

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
Vay canına teşekkürler! Eklerken bile neden sonsuz döngüyü elde ettiğimi anlamaya çalışarak çıldırmıştım remove_action/add_action.
Banjer

1
WordPress Codex :: Plugin API / Action Reference / save post :: Sonsuz döngülerden kaçınma Bunu gösterirler. WordPress Codex :: Function Reference / remove action :: Usage " fonksiyonuna bakarsanız , fonksiyonun önceliği (fonksiyon ilk takıldığında tanımlandığı gibi)." Belirtilmezse, varsayılan önceliği kullanır (10). A / K / A - Eylemi GERÇEKTEN kaldırmak için AYNIN önceliğini eylem eklendiğinde belirtmeniz gerekir.
Michael Ecklund

Aradığım cevap buydu. Teşekkür ederim :)
manuman94
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.