web-dev-qa-db-ja.com

公開後にのみアクションを追加します - 更新はしません

ポストパブリッシュの価値を持つメタフィールドを追加するアクションがあります。問題は、投稿メタフィールドを更新するとデフォルト値にリセットされることです。

'publish_post'の代わりに 'new_to_publish'を試してみましたが、うまくいきません。

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

私が理解できるように、ステータスが保留から公開に変わるたびに、内部の状況は何でもします。しかし、うまくいきません。

私のサイトでは、投票が保存されているメタフィールド 'vot_count'を持つ投稿評価システムがあります。 vot_countを最高のものから最低のものへ問い合わせるとき、それは投票のない投稿を表示しないので、それらを問​​い合わせに含めるためにそれをデフォルト値0で埋める必要があります。すべてうまくいきますが、私が投票を更新すると0にリセットされます...投稿は保留中のステータスのユーザーによって公開されます。

5
th3rion

コメントで指摘された@miloのように、投稿メタが存在するかどうかを確認することが、あなたが望むものを達成する最も簡単な方法です-このように:

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




→更新時ではなく作成時/公開時

これは、更新ではなく公開時にすることの問題に適合するためですただし、auto-draftpublishは、投稿が最初に公開されたときにのみ、投稿が直接公開された場合にのみ機能します。 draftpublishまたはpendingpublishなど、さらに多くのケースをカバーする必要があるかもしれません。

あなたが試すことができます:

//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
    }
}


パブリッシュ時または正確に最初に行う作成作成で、更新ではないは次のようになります。 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
    }
}
2
Nicolai

驚くべきことに動作します。たぶん私は思ったほど愚かではありません。助けてくれてありがとう。

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

}
}

}
1
th3rion

これは最もうまくいくはずです。

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
  }
}
1