J'ai le crochet suivant qui définit un "hotness" par défaut pour un post. Pour le contexte, hotness est un meta_value
enregistré dans le message et change à chaque fois que quelqu'un vote à la hausse ou à la baisse. J'utilise ce meta_value
pour trier les messages sur un "Qu'est-ce qui est chaud en ce moment?" page.
Parce qu'au moment où le message est créé dans WordPress, le "score" des votes positifs par rapport aux votes négatifs est égal à 0. Par conséquent, je peux complètement omettre la partie du calcul du score de Hotness qui est calculée. Lorsque la publication est créée, seule l'heure de création est prise en compte:
/* 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 );
}
}
Je me demande ce qui se passe lorsque vous planifiez une publication dans WordPress. Le crochet sera-t-il déclenché lorsque je clique? Schedule, ou quand le cronjob de WordPress publie le post?
Si le hook est déclenché lorsque je clique Schedule, comment puis-je effectivement changer cela pour que le temps inséré dans la base de données soit en fait le temps de publication de la publication, plutôt que lorsque je clique pour planifier la publication?
La page Codex pour wp_insert_post
indique que l'objet $post
a un membre 'post_date_gmt'
. C'est documenté comme:
'post_date_gmt' => [ Y-m-d H:i:s ]
// L'heure a été postée, en GMT.
Pour moi, il est difficile de savoir s'ils veulent dire quand il est inséré dans la base de données (heure de cliquer sur le bouton de planification) ou quand il est "destiné" à être créé (l'heure que j'ai entrée dans le planificateur). Quelqu'un peut-il s'il vous plaît clarifier cela?
Après avoir examiné la réponse de ialocin , j'ai conclu que mon utilisation actuelle du crochet wp_insert_post ne produira pas les résultats souhaités. Je vais essayer une autre approche, mais je veux clarifier mes intentions d'aider les autres à comprendre pourquoi j'ai besoin de cela.
Comme je le disais plus tôt, je calcule une valeur de "hotness" pour chaque message que je fais. Sans l'influence d'un score, la chaleur augmente toujours avec le temps. À Unix Epoch + 1211380200 seconds
est mon "site personnel Epoch". Si un message post_date_gmt
= 1211380200, il est essentiellement posté à la "naissance" de mon site (le 21 mai 2008).
Pour chaque nouvel article, je veux enregistrer sa valeur d'actualisation initiale. Je dois donc connaître la date de publication de l'article (dans l'horodatage GMT Unix) et soustraire l'heure différente entre Unix Epoch et mon Epoch, soit 1211380200 secondes.
Lorsque je poste du contenu, je programme souvent plusieurs messages pour qu'ils soient diffusés tout au long de la semaine, car je n'ai pas assez de temps pour publier tous les jours. Il est important que les messages prennent correctement la valeur initiale, car elle constitue la base de tout calcul ultérieur.
Ma nouvelle approche serait de prendre en compte les transitions post-statut. S'il vous plaît, aidez-moi à bien comprendre:
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 );
}
}
Je vérifie également $old_status
également parce que je suppose que, lorsque je mise à jour une publication déjà publiée, $new_status
et $old_status
seraient tous les deux 'publish'
. Je fais pas vouloir réinitialiser accidentellement une des méta-valeurs chaque fois que je mets à jour un article publié existant.
J'ai également remplacé add_post_meta
par update_post_meta
car je peux ainsi m'assurer que les valeurs correctes sont insérées dans la base de données, qu'une publication soit publiée directement ou planifiée. Je crois que si les méta-valeurs n'existent pas encore, update_post_meta
agira réellement comme une fonction add_post_meta
.
La réponse courte est post_date
et post_date_gmt
sera défini à la date de publication du message - pas à la date de création du message -, donc post_date
et post_date_gmt
tiennent la date de publication.
Mise à jour:
En réponse au commentaire:
Quand le raccordement wp_insert_post
sera-t-il déclenché?
wp_insert_post()
appelle le hook lui-même - voir source ;wp_publish_post()
- voir source ;check_and_publish_future_post()
- voir source ;post.php
, aide toujours à comprendre ce qui se passe réellement.Pouvez-vous/devriez-vous utiliser la fonction time()
?
post_date
et post_date_gmt
contiennent les informations dont vous avez besoin, qui seraient, comme il a été établi, la date de publication, utilisez-les.post_modified
et post_modified_gmt
si vous souhaitez refléter les modifications.L’approche que vous allez choisir dépend vraiment de vos besoins/projets, que je connais peu. Autant que je sache, une chose que vous devriez absolument envisager est d'utiliser un autre crochet - ou des crochets. Jetez un oeil à Post Status Transitions pour les autres à prendre en compte. Inspectez en outre la source - post.php
- pour obtenir plus de précisions quant au moment et à l’utilisation de ces points d'ancrage. Il y a beaucoup de questions à ce sujet ici, cherchez-les simplement.