क्या यह सेव करने के लिए save_post एक्शन के भीतर संभव है कि यह एक नया पोस्ट बनाया जा रहा है या किसी मौजूदा पोस्ट को अपडेट किया जा रहा है?
क्या यह सेव करने के लिए save_post एक्शन के भीतर संभव है कि यह एक नया पोस्ट बनाया जा रहा है या किसी मौजूदा पोस्ट को अपडेट किया जा रहा है?
जवाबों:
वर्डप्रेस संस्करण 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();
}
$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
।
जिस तरह से मैं यह जांच करता हूं (एक झुके हुए कार्य के भीतर) पोस्ट की तारीख और संशोधित तारीख की तुलना करना है (मानकीकरण के लिए जीएमटी में)
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 सेकंड के किसी भी तरह के विचरण की अनुमति देते हैं पोस्ट।
post_date_gmt
है 2019-03-12 01:31:30
और post_modified_gmt
है 2019-03-12 01:31:31
। :(
मैं इसे स्थापित करने से पहले एक कस्टम मूल्य के अस्तित्व के लिए जाँच कर रहा था। इस तरह, अगर यह एक नई बनाई गई पोस्ट है तो कस्टम मूल्य अभी तक मौजूद नहीं होगा।
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');
"अद्यतन" 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 );
if($update)
नए ब्लॉक को रखने या उपयोग करने की अनुमति दें if( ! $update )
। उत्तरार्द्ध बेहतर व्यवहार में ओपी मिलेगा और टर्नररी ऑपरेटर
आप अपडेट कोड के लिए pre_post_update एक्शन हुक और नए पोस्ट कोड के लिए save_post का उपयोग कर सकते हैं। पोस्ट अपडेट होने से पहले यह काम करता है।
save_post
हुक निकाल दिया जाता है दोनों जब एक पोस्ट निर्माण और अद्यतन (के बाद वर्डप्रेस डेटाबेस के लिए यह बचाया है) है। pre_post_update
पोस्ट अपडेट होने पर निकाल दिया जाता है, लेकिन पोस्ट अपडेट होने से पहले - यह महत्वपूर्ण हो सकता है।
जैसा कि दर्शन थानकी ने संकेत दिया (और स्टीफन हैरिस ने आगे बताया), आप 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
घटना के बाद (जो आमतौर पर पर्याप्त है, कम से कम हम इसके साथ क्या कर रहे हैं) के लिए उपयोग किया जा सकता है।
जब 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');
हालांकि यह अप्रयुक्त है। =)
save_post
पोस्ट पर पहुँचते हैं तब तक पहले ही डेटाबेस में सहेजा जा चुका होता है - इसलिए get_posts
वर्तमान पोस्ट को वापस कर देगा।
एक अन्य दृष्टिकोण जो एक अंतर्निहित फ़ंक्शन का उपयोग करता है और डेटाबेस में शामिल नहीं होता है 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()
पहले से ही 'प्रकाशित' हो जाता है और 'ड्राफ्ट' नहीं, भले ही यह प्रकाशित होने की प्रक्रिया में हो।