私は投稿のデフォルトの "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_meta
をupdate_post_meta
に変更したので、投稿が直接公開されているかスケジュールされているかにかかわらず、正しい値がデータベースに確実に挿入されるようになります。メタ値がまだ存在しない場合は、update_post_meta
は実際にはadd_post_meta
関数として機能します。
簡単に言うと、post_date
とpost_date_gmt
は、投稿を作成した日付ではなく、投稿をスケジュールした日付に設定されるため、post_date
とpost_date_gmt
は公開日を保持します。
更新:
コメントへの返信として:
wp_insert_post
フックはいつ起動されるのですか?
wp_insert_post()
はフック自体を呼び出しています。 source を参照してください。wp_publish_post()
- source を参照。post.php
というソースコードを知っておくと、実際に起こっていることを理解するのに役立ちます。関数time()
を使うことができますか/すべきですか?
post_date
とpost_date_gmt
があなたが必要とする情報を持っていれば、それは確立されたので、それは出版日であるでしょう。post_modified
とpost_modified_gmt
を使用してください。あなたが選択しようとしている実際のアプローチは本当に私が少しについて知っているあなたのニーズ/計画に依存します。私が言うことができる限り、あなたが間違いなく考慮すべきことは別のフック、あるいは複数のフックを使うことです。他のものを考慮するために Post Status Transitions を見てください。さらに、ソースを調べてください--- post.php
- これらがいつどのように使われるのかを深く理解するために。これについて多くの質問がありますので、それを検索してください。