web-dev-qa-db-ja.com

投稿が公開されたときに関数を実行する

私は、投稿が初めて公開されたときに作成したこの機能を使用します。

function a_new_post($post){
  $post_id = $post->ID;

  if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
      // ...run code once
      update_post_meta( $post_id, 'firstpublish', true );
  }
}
add_action( 'draft_to_published', 'a_new_post' );

何も問題ないと思いますが、サンプル投稿を作成しようとするとデータベースがチェックされ、 "firstpublished"フィールドが作成されていません。

誰かが何か悪いことを見ますか?

4
andeersg

正しい動作は'draft_to_publish'です。

正しいステータスを使用したことを確認するには、次のコマンドを使用してすべての登録済み投稿ステータス(カスタムステータスを含む)のリストを取得してください。

<pre><?php print '- ' . implode( "\n- ", array_keys( get_post_stati() ) );?></pre>

バニラインストールでは、あなたは得るべきです:

  • 公開する
  • 未来
  • ドラフト
  • 保留中
  • 非公開
  • trash
  • 自動ドラフト
  • 受け継ぐ

publish_postはあなたが公開された投稿を編集するたびに呼び出されることに注意してください。

get_post_stati() もWordPressでのこれらの予測不可能な名前の1つに注意してください。それは明らかに間違っています。名詞statusの複数形は、英語で状態、ラテン語で状態です。 :D

必要に応じて 'transition_post_status' にフックすることもできます。新しいステータスと古いステータスを引数として取得します。3番目の引数はpostオブジェクトです。それはfuture_to_publishもキャッチします、そしてまた一度捨てられてそして今再公表された投稿(trash_to_publish)。

例:

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

function a_new_post( $new_status, $old_status, $post )
{
    if ( 'publish' !== $new_status or 'publish' === $old_status )
        return;

    if ( 'post' !== $post->post_type )
        return; // restrict the filter to a specific post type

    // do something awesome
}
17
fuxia

ポストファーストセーブタイムメタ値はとても簡単に適用できます。

function a_new_post( $post_id, $post, $update ) {
    if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
        update_post_meta( $post_id, 'firstpublish', true );
    }
}
add_action( 'save_post', 'a_new_post', 10, 3 );
0
ravi patel