在ADD_ACTION(SAVE_POST)期间,一个帖子被保存两次或更多

时间:2012-05-09 作者:mybecks

我在我的“创建新帖子”页面中添加了一个自定义元框,用于特定帖子类别的高级信息。

现在我认识到,如果我保存帖子,它会在db中写入2个条目,其中包含2个post\\u id。

add_action( \'add_meta_boxes\', \'my-plugin_add_custom_box\' );
add_action( \'save_post\', \'my-plugin_save_postdata\' );

my-plugin
function my-plugin_add_custom_box() {
    add_meta_box( 
        \'my-plugin_sectionid\',
        __( \'my-plugin\', \'my-plugin_textdomain\' ),
        \'my-plugin_inner_custom_box\',
        \'post\' 
    );
}

/* When the post is saved, saves our custom data */
function my-plugin_save_postdata( $post_id ) {
  // verify if this is an auto save routine. 
  // If it is our form has not been submitted, so we dont want to do anything
  if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) 
      return;

  // verify this came from the our screen and with proper authorization,
  // because save_post can be triggered at other times

  if ( !wp_verify_nonce( $_POST[\'my-plugin_noncename\'], plugin_basename( __FILE__ ) ) )
      return;


  // Check permissions
  if ( \'page\' == $_POST[\'post_type\'] ) //is this the correct post_type?
  {
    if ( !current_user_can( \'edit_page\', $post_id ) )
        return;
  }
  else
  {
    if ( !current_user_can( \'edit_post\', $post_id ) )
        return;
  }

  // OK, we\'re authenticated: we need to find and save the data

    //$mydata = $_REQUEST[\'sports\'];
    print($post_id); //prints two post ids e.g. 831 & 832
    //print($mydata); //prints two times content of $mydata
}
为什么表中有两条记录wp_posts 是否已创建?当我更新帖子时,会创建一条新记录post_name post\\u id-revision(843修订版)。创建一种新的帖子类型,比如体育,对此类帖子有什么好处?我的高级信息,如$_REQUEST[\'sports\']; 计划存储在一个单独的数据库中,并参考wp\\U POST。

提前感谢(&A);BR,

麦贝克

3 个回复
SO网友:swissspidy

两个ID中的一个可能是修订后的ID。为了防止这种行为,我总是在save\\u postdata函数中进行以下检查:

// Autosave, do nothing
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) 
        return;
// AJAX? Not used here
if ( defined( \'DOING_AJAX\' ) && DOING_AJAX ) 
        return;
// Check user permissions
if ( ! current_user_can( \'edit_post\', $post_id ) )
        return;
// Return if it\'s a post revision
if ( false !== wp_is_post_revision( $post_id ) )
        return;
正如您所看到的,我在这里使用的最后一个条件是检查后期修订。试着在你的函数中也使用这个。

SO网友:bueltge

Example 了解如何。

在你的功能中my-plugin_save_postdata()是否必须更新元数据,使用函数update_post_meta() 为了做到这一点,而不是更多;只有$_POST 是真的。此外,如果尚未停用修订,WP会在db中保存一个新条目。帖子的所有更新,包括autosave,使用新id创建新帖子。您可以通过wp-config.php - define( \'WP_POST_REVISIONS\', FALSE );

SO网友:Rohit Sharma

实际上,有一些指示需要遵循。

首先,应设置计数器全球$pr\\u leasing\\u counter;//如果这只是修订,请不要发送电子邮件
if(wp\\u is\\u post\\u revision($post\\u id))返回;//回音\'

\'; print_r( $post );

if ($post->post_type == \'leasing\' && $pr_leasing_counter!=1 && $update == 1 && $post->post_status == \'publish\' ) { $pr_leasing_counter = 1 }
<其次,该计数器将在条件下进一步设置

结束

相关推荐

Custom Post Row Actions

我偶然发现this question 在写这个问题的时候。我有一个问题是关于这个问题的。我发现你用的是get_delete_post_link 筛选为我的操作创建一个新的url(或一个类似的函数——在任何情况下,我都会将该函数与布尔值一起使用)。唯一的问题是,I don\'t know how to capture the event now. 考虑到我在谷歌上找不到很多关于行后操作的例子,我将不胜感激-/public function _wp_filter_get_delete_post_link( $