Save_post क्रिया पर अद्यतन बनाम नई पोस्ट के लिए जाँच करें


21

क्या यह सेव करने के लिए save_post एक्शन के भीतर संभव है कि यह एक नया पोस्ट बनाया जा रहा है या किसी मौजूदा पोस्ट को अपडेट किया जा रहा है?


मुझे नहीं लगता कि यह संभव है। नीचे दिए गए मेरे कमेंट को देखें @ moraleida का जवाब आपको यह जानने की आवश्यकता है कि क्या यह एक नया पोस्ट है या अपडेट किया जा रहा है? काम के आसपास या वैकल्पिक दृष्टिकोण हो सकता है।
स्टीफन हैरिस

जवाबों:


16

वर्डप्रेस संस्करण 3.7 से। - IIRC - save_postहुक - कोड संदर्भsave_post में हुक और इसके उपयोग के बारे में अधिक जानकारी : और कोडेक्स:save_post - में एक तीसरा पैरामीटर है $updateजिसका उपयोग केवल यह निर्धारित करने के लिए किया जा सकता है।

@ अपरम इंट $ पोस्ट_आईडी पोस्ट आईडी।
@param WP_Post $ पोस्ट पोस्ट ऑब्जेक्ट।
@param $ $ अपडेट यह मौजूदा पोस्ट अपडेट किया जा रहा है या नहीं।


ध्यान दें:

$updateहमेशा नहीं होता true- आप इसे नीचे दिए गए कोड के साथ स्वयं देख और परीक्षण कर सकते हैं। यह अच्छी तरह से प्रलेखित नहीं है, हालांकि, संभवतः नामित नाम से दूर है, और इसलिए भ्रामक अपेक्षाएं बनाता है। नीचे कोड का उपयोग कुछ डिबगिंग के लिए किया जा सकता है, कोड निष्पादन को कब रोकें, इसके साथ खेलें, क्योंकि अन्यथा आपको जानकारी / संदेश दिखाई नहीं देंगे। मुझे लगता है, भ्रामक व्यवहार में अपराधी संशोधन और ऑटो सेविंग की हैंडलिंग है - जिसे अक्षम किया जा सकता है, लेकिन मैं इसकी अनुशंसा नहीं करता, और इसका परीक्षण नहीं किया है। यकीन नहीं होता कि यह ट्राई टिकट का वारंट है , इसलिए मैंने एक नहीं खोला, अगर आपको ऐसा लगता है, तो कृपया लिंक का अनुसरण करें और इसे स्वयं करें। इसके अलावा, जैसा कि टिप्पणियों में कहा गया है, यदि आपके पास कोई विशिष्ट समस्या है, तो एक नया प्रश्न पोस्ट करें।

add_action( 'save_post', 'debug_save_post_update', 10, 3 );
function debug_save_post_update( $ID, $post, $update ) {

  echo '<pre>';
  print_r( $post ); echo '<br>';
  echo '$update == ';
  echo $update ? 'true' : 'false';

  //conditions
  if( ! $update && $post->post_status == "auto-draft" ) {
    // applies to new post
    echo ' && $post->post_status == "auto-draft"';
    //die();
  } else if ( ! $update ) {
    // applies basically to the (auto saved) revision 
    //die();
  } else {
    // applies to updating a published post
    // when there is a revision, which is normally the case, 
    // standard behavior of WordPress, then it is considered 
    // an update, which is where the confusion sets in
    // there are other methods, like checking time or post status
    // depending on your use case it might be more appropriate 
    // to use one of those alternatives 
    //die();
  }

  echo '</pre>';
  //die();
}

3
$updateपैरामीटर हमेशा सच है यह एक नई पोस्ट है यहाँ तक कि जब। तो यह पैरामीटर बेकार है। यकीन नहीं होता है कि यह कभी भी काम किया है, लेकिन यह निश्चित रूप से नरक के रूप में काम नहीं कर रहा है यह वर्डप्रेस 4.8 के नवीनतम संस्करण में प्रलेखित है।
सोलोमन क्लॉसन

@ सॉलोमनक्लोसन यदि आप एक नज़र डालते हैं wp_publish_post, तो हाँ। लेकिन यह इसके उपयोग के लिए सही नहीं है wp_insert_post। मैंने डिबग फ़ंक्शन लिखा है, मैं इसे उत्तर में जोड़ता हूं।
निकोलई

@ सॉलोमनक्लॉसन यदि आपके पास वास्तविक ठोस समस्या है, तो कृपया एक नया प्रश्न पूछें। डीबग फ़ंक्शन स्पष्टीकरण के लिए संशोधन पर एक नज़र डालें।
निकोलई

save_postहुक एक 3 पैरामीटर कि हमेशा सही पर सेट किया जाता है, तो यकीन नहीं इस, अन्य हुक के साथ क्या करना अन्य हुक के बारे में नहीं बोल रहा है क्या है। मैं आपके उत्तर में हुक के बारे में बात कर रहा हूं। यह गलत है।
सोलोमन क्लॉसन

@ सोलोमनक्लोसन जैसा कि मैंने कहा कि हुक दो बार हो रहा है: wp_insert_post(), wp_publish_post()। उत्तरार्द्ध केवल भविष्य के पद हैं, $updateहमेशा होने के लिए निर्धारित है true। अन्यथा, के संबंध में wp_insert_post(), $updateहमेशा नहीं होता है true
निकोलई

11

जिस तरह से मैं यह जांच करता हूं (एक झुके हुए कार्य के भीतर) पोस्ट की तारीख और संशोधित तारीख की तुलना करना है (मानकीकरण के लिए जीएमटी में)

function check_new_vs_update( $post_id ){
    $myPost        = get_post($post_id);
    $post_created  = new DateTime( $myPost->post_date_gmt );
    $post_modified = new DateTime( $myPost->post_modified_gmt );

    if( abs( $post_created->diff( $post_modified )->s ) <= 1 ){
        // New post
    }else{
        // Updated post
    }
}
add_action('save_post', 'check_new_vs_update' );

यह काम करता है क्योंकि यहां तक ​​कि पोस्ट के निर्माण के बाद भी एक 'संशोधित' तारीख जुड़ी होती है, जो कि 'बनाई गई' तारीख के समान होती है, लेकिन हम सृजन के दौरान एक दूसरे पर टिक करने के मामले में 1 सेकंड के किसी भी तरह के विचरण की अनुमति देते हैं पोस्ट।


1
कभी-कभी post_date_gmtहै 2019-03-12 01:31:30और post_modified_gmtहै 2019-03-12 01:31:31। :(
वह Yifei 何 一

1
@HeYifei 何 一 if अच्छी बात है, अगर प्रसंस्करण किसी दूसरे के अंत में शुरू होता है, तो ऐसा हो सकता है। मैंने अपना उत्तर अपडेट कर दिया है, धन्यवाद
जेम्स कुशिंग

दोस्तों, बस एक जानकारी। पोस्ट को पुनर्स्थापित करने और हटाने पर हुक निकाल दिया जाता है।
मेल्विन

6

मैं इसे स्थापित करने से पहले एक कस्टम मूल्य के अस्तित्व के लिए जाँच कर रहा था। इस तरह, अगर यह एक नई बनाई गई पोस्ट है तो कस्टम मूल्य अभी तक मौजूद नहीं होगा।

function attributes_save_postdata($post_id) {
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  if (!wp_verify_nonce($_POST['_attributes_noncename'], plugin_basename(__FILE__))) return;
  if ('page' == $_POST['post_type']) {
    if (!current_user_can('edit_page', $post_id)) return;
  } else {
    if (!current_user_can('edit_post', $post_id)) return;
  }
  $termid = get_post_meta($post_id, '_termid', true);
  if ($termid != '') {
    // it's a new record
    $termid = 'update';
  } else {
    // it's an existing record
  }
  update_post_meta($post_id, '_termid', $termid);
}
add_action('save_post', 'attributes_save_postdata');

इस काम के लिए, क्या आपको पहले add_post_meta का उपयोग करके कस्टम फ़ील्ड बनाना होगा?
एमएफ 1

कोडेक्स के अनुसार: [update_post_meta] का उपयोग add_post_meta () फ़ंक्शन के स्थान पर किया जा सकता है। codex.wordpress.org/Function_Reference/update_post_meta
hereswhatidid

यह तब विफल हो सकता है, अगर कोड सक्रियण के माध्यम से सक्षम होने से पहले पोस्ट बनाए गए थे। पुराने पोस्ट में मेटा सेट नहीं है, इसलिए उनके लिए पहला अपडेट नया माना जाएगा।
वासु चावला

4

"अद्यतन" paremeter के साथ ialocin जवाब के लिए उदाहरण:

function save_func($ID, $post,$update) {

   if($update == false) {
     // do something if its first time publish
   } else {
     // Do something if its update
   }
}

add_action( 'save_post', 'save_func', 10, 3 );

2
इसे बेहतर बनाने के लिए एक बेहतर तरीका यह होगा कि आप अपडेट ब्लॉक को पहले डालें, केवल if($update)नए ब्लॉक को रखने या उपयोग करने की अनुमति दें if( ! $update )। उत्तरार्द्ध बेहतर व्यवहार में ओपी मिलेगा और टर्नररी ऑपरेटर
जेम्स कुशिंग

1

आप अपडेट कोड के लिए pre_post_update एक्शन हुक और नए पोस्ट कोड के लिए save_post का उपयोग कर सकते हैं। पोस्ट अपडेट होने से पहले यह काम करता है।


4
save_postहुक निकाल दिया जाता है दोनों जब एक पोस्ट निर्माण और अद्यतन (के बाद वर्डप्रेस डेटाबेस के लिए यह बचाया है) है। pre_post_updateपोस्ट अपडेट होने पर निकाल दिया जाता है, लेकिन पोस्ट अपडेट होने से पहले - यह महत्वपूर्ण हो सकता है।
स्टीफन हैरिस

1

जैसा कि दर्शन थानकी ने संकेत दिया (और स्टीफन हैरिस ने आगे बताया), आप pre_post_updateअपने लाभ के लिए उपयोग कर सकते हैं ।

global $___new_post;
$___new_post = true;

add_action(
  'pre_post_update',
  function() {
    global $___new_post;
    $___new_post = false;
  },
  0
);

function is_new_post() {
  global $___new_post;
  return $___new_post;
}

ग्लोबल्स का उपयोग करने का कारण function is_new_post() use ( &$new_post )पीएचपी (शॉकिंग ...) में मान्य नहीं है, इसलिए फ़ंक्शन चर में उस चर में खींचना काम नहीं करता है - इसलिए वैश्विक।

ध्यान दें कि यह वास्तव में केवल मज़बूती से / save_postघटना के बाद (जो आमतौर पर पर्याप्त है, कम से कम हम इसके साथ क्या कर रहे हैं) के लिए उपयोग किया जा सकता है।


0

जब save_post को ट्रिगर किया जाता है, तो उस पोस्ट के बारे में सभी जानकारी पहले से ही उपलब्ध है, इसलिए सिद्धांत रूप में आप इसका उपयोग कर सकते हैं

function f4553265_check_post() {

    if (!get_posts($post_id)) {
    // if this is a new post get_posts($post_id) should return null
    } else {
    // $post_id already exists on the database
    }
}
add_action('save_post','f4553265_check_post');

हालांकि यह अप्रयुक्त है। =)


3
जब तक आप save_postपोस्ट पर पहुँचते हैं तब तक पहले ही डेटाबेस में सहेजा जा चुका होता है - इसलिए get_postsवर्तमान पोस्ट को वापस कर देगा।
स्टीफन हैरिस

सच है, बस इसे कोडेक्स में जांचा। सर उठाने के लिए धन्यवाद।
18

0

एक अन्य दृष्टिकोण जो एक अंतर्निहित फ़ंक्शन का उपयोग करता है और डेटाबेस में शामिल नहीं होता है get_post_status()

$post_status = get_post_status();
if ( $post_status != 'draft' ) {
    //draft
} else { 
    //not a draft: can be published, pending, etc. 
}

ध्यान दें कि यह उचित नहीं हो सकता है यदि आप बाद में स्थिति को "ड्राफ्ट" पर वापस सेट करने की योजना बनाते हैं - अगली बार जब आप पोस्ट अपडेट करेंगे, तो आपके निर्देशों को दोहराया जाएगा। संदर्भ के आधार पर, आप उन विभिन्न तारों पर विचार करना चाहते हैं जिन्हें get_post_status()अधिक उपयुक्त परिदृश्य बनाने के लिए वापस किया जा सकता है।

Get_post_status () और पोस्ट स्थिति के लिए कोडेक्स देखें

संभावित मूल्य हैं:

  • 'प्रकाशित' - एक प्रकाशित पोस्ट या पेज
  • 'लंबित' - पोस्ट लंबित समीक्षा है
  • 'ड्राफ्ट' - ड्राफ्ट स्टेटस में एक पद
  • 'ऑटो-ड्राफ्ट' - एक नई बनाई गई पोस्ट, जिसमें कोई सामग्री नहीं है
  • 'भविष्य' - भविष्य में प्रकाशित करने के लिए एक पोस्ट
  • 'निजी' - उन उपयोगकर्ताओं को दिखाई नहीं देता जो लॉग इन नहीं हैं
  • 'विरासत' - एक संशोधन। get_children देखें।
  • 'कचरा' - पोस्ट ट्रैशबिन में है। संस्करण 2.9 के साथ जोड़ा गया।

मुझे नहीं लगता कि यह वही है जो पूछा गया था। यदि मैं एक नया पोस्ट बनाता हूं और फिर 'पब्लिश' हिट करता हूं, save_post()तो पहली बार निष्पादित किया जाता है, लेकिन उस निष्पादन के दौरान get_post_status()पहले से ही 'प्रकाशित' हो जाता है और 'ड्राफ्ट' नहीं, भले ही यह प्रकाशित होने की प्रक्रिया में हो।
cgogolin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.