এটি একটি নতুন পোস্ট তৈরি হচ্ছে বা বিদ্যমান পোস্ট আপডেট হচ্ছে কিনা তা নির্ধারণ করা কি সেভ_পোস্ট কর্মের মধ্যে থাকা সম্ভব?
এটি একটি নতুন পোস্ট তৈরি হচ্ছে বা বিদ্যমান পোস্ট আপডেট হচ্ছে কিনা তা নির্ধারণ করা কি সেভ_পোস্ট কর্মের মধ্যে থাকা সম্ভব?
উত্তর:
ওয়ার্ডপ্রেস সংস্করণ থেকে 3.7। - আইআইআরসি - save_post
হুক - কোড রেফারেন্স:save_post
এবং কোডেক্স:save_post
এ হুক এবং এর ব্যবহার সম্পর্কে আরও তথ্যের একটি তৃতীয় প্যারামিটার রয়েছে $update
যা ঠিক এটি নির্ধারণ করতে ব্যবহার করা যেতে পারে।
@ পরিমাপ int $ post_ID পোস্ট আইডি।
@ পরিমেল WP_Post $ পোস্ট অবজেক্ট পোস্ট করুন।
@param bool $ আপডেট এটি কোনও বিদ্যমান পোস্ট আপডেট করা হচ্ছে কি না।
বিঃদ্রঃ:
$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 সেকেন্ডের ভিন্নতার অনুমতি দিই we পোস্টটি.
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');
"আপডেট" প্যারামিটার সহ আইওসিন উত্তরের উদাহরণ:
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()
ইতিমধ্যে প্রকাশিত হওয়ার প্রক্রিয়াধীন থাকা সত্ত্বেও 'প্রকাশ' এবং 'খসড়া' নয় returns