Save_post ক্রিয়ায় আপডেট বনাম নতুন পোস্ট পরীক্ষা করুন Check


21

এটি একটি নতুন পোস্ট তৈরি হচ্ছে বা বিদ্যমান পোস্ট আপডেট হচ্ছে কিনা তা নির্ধারণ করা কি সেভ_পোস্ট কর্মের মধ্যে থাকা সম্ভব?


আমি মনে করি না এটি সম্ভব। নীচে আমার মন্তব্য দেখুন @ মোরেলিডার উত্তর। এটি কোনও নতুন পোস্ট বা আপডেট হচ্ছে কিনা তা আপনার কেন জানতে হবে? কোনও কাজের আশেপাশে বা বিকল্প পদ্ধতি থাকতে পারে।
স্টিফেন হ্যারিস

উত্তর:


16

ওয়ার্ডপ্রেস সংস্করণ থেকে 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();
}

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 সেকেন্ডের ভিন্নতার অনুমতি দিই we পোস্টটি.


1
কখনও কখনও post_date_gmtহয় 2019-03-12 01:31:30এবং post_modified_gmtহয় 2019-03-12 01:31:31। :(
তিনি ইয়েফি 何 一

1
@ হাইফাই 何 一 非 ভাল বিষয়, যদি কোনও নির্দিষ্ট দ্বিতীয়টির শেষে প্রক্রিয়াজাতকরণ শুরু হয়, তবে এটি ঘটতে পারে। আমি আমার উত্তর আপডেট করেছি, ধন্যবাদ
জেমস কুশিং

বলছি, শুধু একটি তথ্য। হুক একটি পোস্ট পুনরুদ্ধার এবং মুছে ফেলা হয়।
মেলভিন

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');

এটি কাজ করার জন্য, আপনাকে প্রথমে অ্যাড_পোস্ট_মেটা ব্যবহার করে কাস্টম ফিল্ড তৈরি করতে হবে?
এমএফ 1

কোডেক্স অনুসারে: [আপডেট_পোস্ট_মেটা] অ্যাড_পোস্ট_মেটা () ফাংশনের জায়গায় ব্যবহার করা যেতে পারে। কোডেক্স.ওয়ার্ডপ্রেস.আর.
ফাংশন_রিফারেন্স /

এটি ব্যর্থ হতে পারে, যদি কোনও প্লাগইন অ্যাক্টিভেশনের মাধ্যমে কোড হুক সক্ষম হওয়ার আগে পোস্টগুলি তৈরি করা হয়েছিল। পুরানো পোস্টগুলিতে মেটা সেট থাকে না, তাই তাদের জন্য প্রথম আপডেটটি নতুন হিসাবে বিবেচিত হবে।
ভাসু চাওলা

4

"আপডেট" প্যারামিটার সহ আইওসিন উত্তরের উদাহরণ:

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যেত - সুতরাং বর্তমান পোস্টটি ফিরে আসবে।
স্টিফেন হ্যারিস

সত্য, স্রেফ কোডেক্সে এটি পরীক্ষা করা হয়েছে। সতর্ক থাকুন জন্য ধন্যবাদ.
মোড়ালিদা

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()ইতিমধ্যে প্রকাশিত হওয়ার প্রক্রিয়াধীন থাকা সত্ত্বেও 'প্রকাশ' এবং 'খসড়া' নয় returns
cgogolin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.