正如@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-draft
→
publish
仅适用于首次发布帖子,并且仅适用于直接发布帖子的情况。例如,可能需要涵盖更多的案例
draft
→
publish
或
pending
→
publish
.
您可以尝试:
//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
}
}