web-dev-qa-db-ja.com

wp_insert_postの投稿作成​​日は何日と考えられますか?

私は投稿のデフォルトの "hotness"を設定する以下のフックを持っています。文脈上、暑さは投稿に保存されたmeta_valueであり、誰かが投稿を賛成または反対に投票するたびに変化します。このmeta_valueを使用して、「今何が暑いですか」という投稿を並べ替えることができます。ページ。

投稿がWordPressで作成された時点では、得票数と得票数の「得点」は0です。そのため、得点の暑さ計算の部分は完全に省略できます。投稿が作成されると、作成時間のみが考慮されます。

/* Hook: Add custom postmeta when a new post is created
 * Since: 8.0
 */
add_action( 'wp_insert_post', tjnz_prepare_postmeta );
function tjnz_prepare_postmeta( $post_id ) {
    if ( !wp_is_post_revision( $post_id ) ) {
        $hotness = round( ( time() - 1211380200 ) / 800000, 7 );
        add_post_meta( $post_id, '_tjnz_favorites', 0, true );
        add_post_meta( $post_id, '_tjnz_plays', 0, true );
        add_post_meta( $post_id, '_tjnz_downloads', 0, true );
        add_post_meta( $post_id, '_tjnz_upvotes', 0.000, true );
        add_post_meta( $post_id, '_tjnz_downvotes', 0.000, true );
        add_post_meta( $post_id, '_tjnz_hotness', $hotness, true );
    }
}

WordPressで投稿をスケジュールしたときにどうなるのでしょうか。クリックするとフックが作動しますか Scheduleそれとも、WordPressのcronjobが投稿を公開したとき?

クリックしたときにフックが作動する場合 Scheduleクリックして投稿をスケジュールしたときではなく、データベースに挿入された時刻が実際に投稿の公開時刻になるように変更するにはどうすればよいですか。

wp_insert_postのCodexページ は、$postオブジェクトに'post_date_gmt'メンバーがあることを示しています。それは次のように文書化されています。

'post_date_gmt' => [ Y-m-d H:i:s ] // GMTで、投稿が行われました。

私には、それがデータベースに挿入された時(スケジュールボタンをクリックした時)を意味するのか、それとも作成されることを意味するのか(スケジューラに入力した時間)を意味するのかは不明です。誰かがこれを明確にしてもらえますか?

編集する

ialocin の答えを調べた後、私はwp_insert_postフックを現在使用しても望ましい結果が得られないと結論しました。私は別のアプローチを試みますが、なぜ私がこれが必要なのかを他の人が理解するのを助けるために私の意図を明確にしたいです。

前にも述べたように、投稿するたびに 'hotness'の値を計算します。スコアの影響がなくても、暑さは時間の経過とともに徐々に増加します。 Unix Epoch + 1211380200 secondsは私の「個人用サイトEpoch」です。投稿のpost_date_gmt = 1211380200であれば、それは本質的に私のサイトの '誕生'に投稿されたものです(これは2008年5月21日です)。

すべての新しい投稿について、初期の人気値を保存したいので、投稿の公開日(GMT Unixタイムスタンプ)を知っていて、Unix Epochと私のEpochの間の異なる時間(1211380200秒)を差し引く必要があります。

私がコンテンツを投稿するときは、毎日投稿するのに十分な時間がないので、週を通して複数の投稿を「放送中」にするようにスケジュールすることがよくあります。投稿が初期値を正しく取得することが重要です。それが今後の計算の基礎となるからです。

私の新しいアプローチは、投稿ステータスの移行に取り組むことです。この権利を手助けしてください。

add_action( 'transition_post_status', 'tjnz_prepare_postmeta', 10, 3 );
function tjnz_prepare_postmeta( $new_status, $old_status, $post ) {
    if ( $new_status == 'publish' && $old_status != 'publish' ) {
        $hotness = round( ( $post->post_date_gmt - 1211380200 ) / 800000, 7 );
        update_post_meta( $post->ID, '_tjnz_favorites', 0 );
        update_post_meta( $post->ID, '_tjnz_plays', 0 );
        update_post_meta( $post->ID, '_tjnz_downloads', 0 );
        update_post_meta( $post->ID, '_tjnz_upvotes', 0.000 );
        update_post_meta( $post->ID, '_tjnz_downvotes', 0.000 );
        update_post_meta( $post->ID, '_tjnz_hotness', $hotness );
    }
}

私も$old_statusをチェックする理由は、私が更新したときにすでに公開されている投稿が$new_status$old_statusの両方が'publish'になると想定しているからです。既存の公開された投稿を更新するたびに誤ってメタ値をリセットしたくないしない

また、add_post_metaupdate_post_metaに変更したので、投稿が直接公開されているかスケジュールされているかにかかわらず、正しい値がデータベースに確実に挿入されるようになります。メタ値がまだ存在しない場合は、update_post_metaは実際にはadd_post_meta関数として機能します。

4
Marc Dingena

簡単に言うと、post_datepost_date_gmtは、投稿を作成した日付ではなく、投稿をスケジュールした日付に設定されるため、post_datepost_date_gmtは公開日を保持します。


更新:

コメントへの返信として:

  1. wp_insert_post フックはいつ起動されるのですか?

    • 実際には両方の場合、クリックで Schedule そして将来から公開への投稿ステータスの予定された変更について。
    • どうして?まず理由は:
      • 関数 wp_insert_post() はフック自体を呼び出しています。 source を参照してください。
    • そして第二に、それがの一部であるからです。
    • これによって引き起こされます:
    • ドキュメントをよく見て、ここでは主に post.php というソースコードを知っておくと、実際に起こっていることを理解するのに役立ちます。

  2. 関数time()を使うことができますか/すべきですか?

    • あなたは確かに、1.からの新しい情報を考慮に入れることができます。
    • あなたが事実に頼るべきなら、あなたがすでに必要としている情報です。そうであれば、同じ情報を2回取得する理由はありません。
    • それでpost_datepost_date_gmtがあなたが必要とする情報を持っていれば、それは確立されたので、それは出版日であるでしょう。
    • 変更を反映したい場合はpost_modifiedpost_modified_gmtを使用してください。

あなたが選択しようとしている実際のアプローチは本当に私が少しについて知っているあなたのニーズ/計画に依存します。私が言うことができる限り、あなたが間違いなく考慮すべきことは別のフック、あるいは複数のフックを使うことです。他のものを考慮するために Post Status Transitions を見てください。さらに、ソースを調べてください--- post.php - これらがいつどのように使われるのかを深く理解するために。これについて多くの質問がありますので、それを検索してください。

4
Nicolai