问题描述

是否可以在 save_post 操作中确定是否正在创建新职位或更新现有职位?

最佳解决方案

自 WordPress 版本 3.7 起。 – IIRC – save_post 钩子 – 有关钩子及其在代码参考中的使用的更多信息:save_post 和 Codex:save_post – 具有可用于确定的第三个参数 $update

@param     int               $post_ID     Post ID.
@param     WP_Post     $post          Post object.
@param     bool            $update     Whether this is an existing post being updated or not.

次佳解决方案

执行此检查 (在挂钩函数中) 的方式是比较发布日期和修改日期 (以 GMT 格式进行标准化)

function check_new_vs_update( $post_id ){
    $myPost = get_post($post_id);
    if( $myPost->post_modified_gmt == $myPost->post_date_gmt ){
        //New Post
    }else{
        //Updated Post
    }
}
add_action('save_post', 'check_new_vs_update' );

这是因为即使在创建时,该帖子也附有一个’modified’ 日期,与’created’ 日期完全相同。

第三种解决方案

我最终只是在设置之前检查自定义值的存在。这样,如果它是一个新创建的帖子,则自定义值将不存在。

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

第四种方案

ialocin 答案示例用”update” 测光仪:

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。