Save_post कॉलबैक में अनंत लूप से कैसे बचें


12

मैं अपनी समस्याओं के समाधान के लिए इस साइट का एक बहुत उपयोग कर रहा हूं, लेकिन इस बार मैं अपनी समस्या का पता लगाने और उत्तर देने में सफल नहीं हुआ।

मुझे wp_update_postएक फंक्शन के अंदर इस्तेमाल करने पर अनंत लूप मिलता है, जिसे कॉल किया जाता है save_post। मुझे पता है कि यह एक सामान्य मुद्दा है, लेकिन मैं यह नहीं जान सकता कि इससे कैसे बचा जाए।

मैं अपने पदों के क्रम को बचाना चाहता हूं (जो कि पोस्ट-टाइप 'सेक्शन' का है)। इसलिए मैंने एक कस्टम मेटा बॉक्स बनाया है जिसमें कुछ सॉर्टेबल html-elements होते हैं। प्रत्येक तत्व में नाम = 'सेक्शनऑर्डर []' के साथ एक छिपा हुआ इनपुट टैग होता है। इसलिए जब मैं मानक वर्डप्रेस 'अपडेट' बटन पर क्लिक करता हूं, तो एक सरणी जिसमें पोस्ट के सभी आईडी हैं (क्रम में) 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

@ स्टीफन , मैं 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 :: Plugin API / Action Reference / save post :: अनंत लूप्स से बचने के लिए वे इसे प्रदर्शित करते हैं। यदि आप वर्डप्रेस कोडेक्स पर देखते हैं :: फ़ंक्शन संदर्भ / निकालें कार्रवाई :: उपयोग "फ़ंक्शन की प्राथमिकता (जैसा कि फ़ंक्शन के हुक होने पर परिभाषित किया गया था)।" यदि निर्दिष्ट नहीं है, तो यह डिफ़ॉल्ट प्राथमिकता (10) का उपयोग करता है। ए / के / ए - आपको कार्रवाई को जोड़ने के क्रम में उसी प्राथमिकता को निर्दिष्ट करना होगा जब कार्रवाई को हटा दिया गया था।
माइकल एकलांड

यह वह प्रतिक्रिया है जिसकी मुझे तलाश थी।
साभार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.