web-dev-qa-db-ja.com

Publish_ {custom-post-type}が更新時に起動するのはなぜですか?

公開と更新の両方で2つの異なるアクションを起動しようとしています。どちらも同時に発射すべきではありません。

問題は、アップデート時にpublish_pm_taskが起動され、save_postが起動されないことです。これで何か問題がありますか?

<?php
// Updated task notification
add_action( 'save_post', 'pm_updated_task_notification' );

// New task notification
add_action( 'publish_pm_task', 'pm_new_task_notification' );

function pm_new_task_notification() {

    error_log('definitely a task');

}

function pm_updated_task_notification( $post_id ) {

    $slug = 'pm_task';

    /* check whether anything should be done */
    $_POST += array("{$slug}_edit_nonce" => '');
    if ($slug != $_POST['post_type']) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!wp_verify_nonce($_POST["{$slug}_edit_nonce"], plugin_basename(__FILE__))) {
        return;
    }

    error_log('updated a task');

}
2
developdaly

まず最初に、投稿を更新するとwp_update_post関数が呼び出されることを理解しておく必要があります。しかし、WP coreのデザインが少し最適ではないため、実際の保存はwp_insert_post関数によって処理されます。 tracの 3006行目 にあります。

さて、次にwp_insert_post関数の中身を見てみましょう。ご覧のとおり、 2950行目 では、直接またはsave_post関数によって呼び出されるたびに、関数が呼び出されるたびにwp_update_postアクションが呼び出されます。つまり、投稿が挿入/公開または更新されたかどうかを判断するのには適していません。

より良いアクションを見つけるために、wp_transition_post_statusアクションの直前に呼び出されるsave_post関数を見てみましょう。 2942 行目で見てください。この関数は3つのアクションtransition_post_status{$old_status}_to_{$new_status}、および{$new_status}_{$post->post_type}を実行します。 3273 行目でそれを参照してください。ここでは、古くて新しい投稿ステータスを渡すNiceアクションtransition_post_statusがあります。これが私たちが必要としているものです。そのため、新しいステータスがpublishで、古いステータスがpublishではない場合、投稿は公開されます。そして、新しいステータスがpublishで古いステータスがnewであれば、投稿は挿入されています。そして最後に、新しいステータスが古いステータスと等しい場合、投稿は更新されたばかりです。

これがあなたのスニペットです:

add_action( 'transition_post_status', 'wpse_transition_post_status', 10, 3 );  

function wpse_transition_post_status( $new_status, $old_status, $post ) {
    if ( $new_status == 'publish' && $old_status == 'new' ) {
        // the post is inserted
    } else if ( $new_status == 'publish' && $old_status != 'publish' ) {
        // the post is published
    } else {
        // the post is updated
    }
}

P.S .: WordPressコアのコードを読んで、疑いがあるときはいつでも、それはあなたを大いに助けてくれるでしょう!

7
Eugene Manuilov