仅在发布后添加操作-不更新

时间:2013-11-02 作者:th3rion

我有一个动作,在发布后增加了有价值的元字段。问题是,当我更新post meta字段时,它被重置为默认值。

我已经尝试了“new\\u to\\u publish”而不是“publish\\u post”,但它不起作用。

add_action(\'publish_post\', \'add_custom_field_automatically\');
function add_custom_field_automatically($post_ID) {
  global $wpdb;

  if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, \'votes_count\', \'0\');

}
}
还是不能让它工作

add_action( \'transition_post_status\', \'wpse120996_post_status_publish\', 10, 3 );
function wpse120996_post_status_publish( $new_status, $old_status, $post_ID ) { 
    if ( $new_status == \'publish\' && $old_status == \'pending\' ) {
          global $wpdb;

  if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, \'votes_count\', \'0\');
    }
}}
据我所知,每当状态从挂起更改为发布时,请执行if中的任何操作。但它不起作用。

在我的网站上,我有一个带有元字段“Voces\\u count”的后评价系统,其中存储了投票。当我从最高到最低查询Voces\\u count时,它不会显示没有投票的帖子,所以我需要用默认值0填充它以将它们包含到查询中。一切正常,但当我更新投票时,将重置为0。。。帖子由具有挂起状态的用户发布,我检查并发布这些状态。

3 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

正如@milo在评论中指出的,检查post-meta是否存在是实现您想要的最简单的方法-如下所示:

add_action(\'publish_post\', \'wpse120996_add_custom_field_automatically\');
function wpse120996_add_custom_field_automatically($post_id) {
    global $wpdb;
    $votes_count = get_post_meta($post_id, \'votes_count\', true);
    if( empty( $votes_count ) && ! wp_is_post_revision( $post_id ) ) {
        update_post_meta($post_id, \'votes_count\', \'0\');
    }
}



→ On creation/publish not on updates

我保留这个,因为它适合在发布时而不是更新时做事情。But auto-draftpublish 仅适用于首次发布帖子,并且仅适用于直接发布帖子的情况。例如,可能需要涵盖更多的案例draftpublishpendingpublish.

您可以尝试:

//it\'s specific because you specify the hook like this {$old_status}_to_{$new_status}
add_action( \'auto-draft_to_publish\', \'wpse120996_specific_post_status_transition\' );
function wpse120996_specific_post_status_transition() { 
        //your code
}
而不是使用new_to_publish.

→ 看看Post Status Transitions 了解更多信息。

或者你可以使用通用钩子transition_post_status 像这样:

//it\'s generic because you specify post statuses inside the function not via the hook
add_action( \'transition_post_status\', \'wpse120996_generic_post_status_transition\', 10, 3 );
function wpse120996_generic_post_status_transition( $new_status, $old_status, $post ) { 
    if ( $new_status == \'publish\' && $old_status == \'auto-draft\' ) {
        //your code
    }
}
另一种巧妙的方法是在发布时或确切地说,先发布creation 而且不在更新中将如下图所示。我选择使用save_post 钩子,但这可以用publish_post 钩子也一样。

add_action(\'save_post\', \'wpse120996_on_creation_not_update\');
function wpse120996_on_creation_not_update($post_id) {
    //get_post( $post_id ) == null checks if the post is not yet in the database
    if( get_post( $post_id ) == null ) {
        //your code
    }
}

SO网友:Daniel Morales Lira

这应该最有效:

add_action( \'publish_post\' , \'my_func\' , 10 , 2 );
function my_func( $ID , $post )
{
  if ( $post->post_date != $post->post_modified )
  {
    //THIS IS AN UPDATE
  }
  else
  {
    //POST JUST GOT PUBLISHED
  }
}

SO网友:th3rion

令人惊讶的是,它起作用了。也许我没有我想的那么笨。谢谢你们两位的帮助。

add_action(\'publish_post\', \'add_custom_field_automatically\');
function add_custom_field_automatically($post_ID) {

global $wpdb;

$meta_count = get_post_meta($post_ID, "votes_count", true);
if($meta_count == \'\') {
if(!wp_is_post_revision($post_ID)) {
    update_post_meta($post_ID, \'votes_count\', \'0\');

}
}

}

结束