अद्यतन पोस्ट करते समय हुक करने का सही तरीका क्या है


19

जब पोस्ट अपडेट किया जाता है तो मैं हुक करने की कोशिश करता हूं लेकिन कोशिश करता हूं कि सभी हुक को छोड़कर कभी भी निष्पादित न हो updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

मैंने यह कोशिश की है, add_action('save_post', 'my_function');लेकिन कोई आईडी नहीं गूंज रहा था, या शायद यह संदेश पहले से ही गूंज रहा है, लेकिन रीडायरेक्ट हेडर के कारण कभी भी रेंडर नहीं किया गया है।


2
आपके पास एक स्थान है save_post, क्या वह एक टाइपो है, या वह आपके मूल कोड में था? विकास करते समय डिबगिंग को भी सक्षम करें
मिलो

@ मायो सॉरी टाइपो, लेकिन ओरिजनल कोड में नहीं
rusly

अगर ऐसा है, तो आपको नया पोस्ट बनाते समय स्क्रीन के ऊपरी बाएँ कोने में अपना आउटपुट देखना चाहिए। मौजूदा पोस्ट को सहेजना पुनर्निर्देशित होने से पहले होता है, इसलिए जब तक आप डिबगिंग सक्षम नहीं करते, आपको कुछ भी दिखाई नहीं देगा।
मिलो

जवाबों:


55

जब कोई पोस्ट अपडेट की जाती है तो कुछ हुक होते हैं जिन्हें निकाल दिया जाता है:

  • 'pre_post_update'पोस्ट अपडेट होने से ठीक पहले एक कार्रवाई की गई , जो तर्क दिया गया वह 2 है: $post_IDऔर $dataवह पोस्ट टेबल के अन्य सभी डेटाबेस कॉलम्स की एक सरणी है
  • 'transition_post_status'अद्यतन पर निकाल दिया गया हुक है, और 3 तर्क पास करें: $ new_post_status, $old_post_statusऔर $post(ऑब्जेक्ट)।
  • फिर, अन्य 2 संक्रमण हुक निकाल दिए गए हैं, लेकिन वे गतिशील नाम हैं, इसका मतलब है कि निकाल दिया गया प्रभावी कार्रवाई पुराने और नए पद की स्थिति पर निर्भर करता है। "{$old_status}_to_{$new_status}"और "{$new_status}_{$post->post_type}"। पहले केवल पोस्ट ऑब्जेक्ट को तर्क के रूप में पास करें, दूसरा पोस्ट आईडी और पोस्ट ऑब्जेक्ट को पास करें। यहां प्रलेखन का पता लगाएं ।
  • 'edit_post'कि पास 2 तर्क: $post_IDऔर $post(वस्तु)
  • 'post_updated'कि पास 3 तर्क: $post_ID, $post_after(पोस्ट वस्तु अद्यतन के बाद), $post_before(पोस्ट वस्तु अद्यतन करने से पहले)
  • एक और गतिशील हुक: "save_post_{$post->post_type}"जो पोस्ट प्रकार पर निर्भर करता है, जैसे कि मानक पदों के लिए'save_post_post' और पृष्ठों के लिए है 'save_post_page', इस हुक पास 3 तर्क: $post_ID, $post(वस्तु) और $updateहै कि एक बूलियन (सही या गलत) कि सच है जब आप एक अद्यतन प्रदर्शन करते हैं, में वास्तव में इस हुक को तब भी निकाल दिया जाता है जब कोई पोस्ट पहली बार सहेजी जाती है।
  • ' save_post' जो अद्यतन और पहली बचत दोनों पर निकाल दिया जाता है, और पिछले हुक के समान 3 तर्क पास करते हैं।
  • ' save_post_{$post_type}' जो अद्यतन और पहली बचत दोनों पर निकाल दिया जाता है, और पिछले हुक के पहले 2 तर्क पास करते हैं।
  • अंत में आपके पास है ' wp_insert_post' है , जिसे अपडेट और पहली बचत दोनों पर निकाल दिया जाता है, और पिछले 2 हुक के समान 3 तर्क पास करते हैं।

ये हुक हर बार पोस्ट अपडेट होने के बाद, बैकेंड में एडमिन पेज के माध्यम से और "मैन्युअल रूप से" अपडेट किए जाने पर अपडेट किया जाता है wp_update_post या wp_insert_postफंक्शन्स में ।

जब पोस्ट को व्यवस्थापक पृष्ठों का उपयोग करके अपडेट किया जाता है तो अतिरिक्त हुक निकाल दिए जाते हैं, एक उदाहरण 'update_post_redirect'या है 'post_updated_messages'। ( यह देखें और उदाहरण के उदाहरणों के लिए इस WPSE उत्तर )।

ध्यान दें कि यदि आप कुछ हुक तर्क का उपयोग करना चाहते हैं, तो यह पहला नहीं है, एक आपको स्पष्ट रूप से add_actionकॉल में घोषित करना होगा ।

उदाहरण के लिए, यदि आप '$update'उस 'save_post'हुक के तर्क (जो कि तीसरा है) का उपयोग करना चाहते हैं, तो आपको ( डॉक्स देखें ) पर परम के 3रूप में जोड़ना होगा :$accepted_argsadd_action

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

अंतिम नोट संबंध समय : आपको यकीन है कि add_actionकहा जाता है चाहिए कार्रवाई शुरू होने से पहले है, या यह कुछ भी नहीं करेगा।

जैसे यह कोड:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

कुछ नहीं करेगा, क्योंकि हुक निकाल दिए जाने के बाद कार्रवाई जोड़ दी जाती है। यहां इसे पहचानना सरल है, वास्तविक विश्व कोड में हमेशा ऐसा नहीं होता है।


मुझे लगता है कि डैशबोर्ड में Add New (Post, Page, CPT) को मारने पर 'save_post' एक्शन हुक भी निकाल दिया जाता है। अपने आप को देखने के लिए बस इस कोड को चलाएं। function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );'Save_post' एक्शन प्रकाशित करने के बजाय Add New पर क्यों चलता है? ऑटो-ड्राफ्ट पोस्ट बनाने के लिए मुझे लगता है।
lowtechsun

@lowtechsun जैसा कि ए में कहा जाता है, हुक को हर बार पोस्ट अपडेट होने के बाद निकाल दिया जाता है, यानी DB में सहेजा जाता है। जब आप "नया जोड़ें" हिट करते हैं, तो पृष्ठ लोडिंग के करीब, WP डीबी में संग्रहीत एक मसौदा पोस्ट बनाता है ताकि वह हुक निकाल दिया जाए।
gmazzap

मेरे पास वापस आने के लिए धन्यवाद। बस कल के बारे में पता चला और सोचा कि इस की अवधारणा भ्रामक है। मतलब सबसे पहले मैं एक नई पोस्ट जोड़ने के लिए पेज खोलता हूँ। इस स्तर पर मुझे लगा कि मैंने पहले से कोई पोस्ट नहीं बनाया है। केवल एक बार मैं प्रकाशित मारा मैं नया पद बनाया गया है लगता होगा। इसे और आगे बढ़ाते हुए मुझे उम्मीद है कि अगर मैं ऐड न्यू हिट करता हूं तो WP ऑटो-ड्राफ्ट पोस्ट को डिलीट कर देता है, लेकिन फिर पब्लिश किए बिना पेज को छोड़ दें?
लोटेकसून

2

हुक क्यों नहीं post_updated_messages। इस तरह आप इस संदेश को ठीक उसी तरह दिखा सकते हैं जैसे कि डिफ़ॉल्ट वर्डप्रेस पोस्ट अपडेट किया गया है।

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

एक उदाहरण यहाँ देखें:

http://codex.wordpress.org/Function_Reference/register_post_type

के अंतर्गत post_updated_messages

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