公開と更新の両方で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');
}
まず最初に、投稿を更新すると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コアのコードを読んで、疑いがあるときはいつでも、それはあなたを大いに助けてくれるでしょう!