Est-il possible dans l'action save_post de déterminer s'il s'agit d'une nouvelle publication en cours de création ou d'une publication existante en cours de mise à jour?
save-post
wp-update-post
hereswhatidid
la source
la source
Réponses:
Depuis la version 3.7 de WordPress. - IIRC - le
save_post
crochet - plus d'informations sur le crochet et son utilisation dans Code Reference:save_post
et Codex:save_post
- a un troisième paramètre$update
qui peut être utilisé pour déterminer exactement cela.Remarque:
$update
n'est pas toujourstrue
- vous pouvez le voir et le tester vous-même avec le code ci-dessous. Cependant, il n'est pas bien documenté, peut-être loin d'être nommé de manière optimale, et crée donc des attentes trompeuses. Le code ci-dessous peut être utilisé pour certains débogages, essayez de savoir quand intercepter l'exécution du code, sinon vous ne verrez pas les informations / messages. Je pense que le coupable d'un comportement trompeur est la gestion des révisions et des sauvegardes automatiques - qui pourraient être désactivées, mais je ne le recommande pas et je ne l'ai pas testé. Je ne sais pas si cela justifie un ticket Trac , donc je n'en ai pas ouvert un, si vous le pensez, veuillez suivre le lien et le faire vous-même. En dehors de cela, comme indiqué dans les commentaires, si vous avez un problème spécifique, posez une nouvelle question.la source
$update
paramètre est TOUJOURS vrai même s'il s'agit d'un nouveau message. Ce paramètre est donc inutile. Je ne sais pas si cela a déjà fonctionné, mais c'est sûr que l'enfer ne fonctionne pas comme il est documenté dans la dernière version de wordpress 4.8.wp_publish_post
, alors oui. Mais ce n'est pas vrai pour son utilisation danswp_insert_post
. J'ai écrit une fonction de débogage, je l'ajoute à la réponse.save_post
hook a un 3ème paramètre qui est toujours défini sur TRUE, donc vous ne savez pas ce que cela a à voir avec les autres hooks, sans parler des autres hooks. Je parle du crochet dans votre réponse. Ceci est une erreur.wp_insert_post()
,wp_publish_post()
. Ce dernier n'est que de futurs postes, il$update
devrait y en avoir toujourstrue
. Sinon, en ce qui concernewp_insert_post()
,$update
n'est pas toujourstrue
.La façon dont j'effectue cette vérification (dans une fonction accrochée) consiste à comparer la date de publication et la date de modification (en GMT pour la normalisation)
Cela fonctionne parce que même à la création, le post a une date «modifiée» qui lui est attachée, ce qui est exactement la même que la date «créée», mais nous autorisons un écart de 1 seconde dans les deux cas au cas où une seconde se déclenche pendant la création de la poste.
la source
post_date_gmt
est2019-03-12 01:31:30
et l'post_modified_gmt
est2019-03-12 01:31:31
. :(J'ai fini par vérifier l'existence d'une valeur personnalisée avant de la définir. De cette façon, s'il s'agit d'une publication nouvellement créée, la valeur personnalisée n'existerait pas encore.
la source
Exemple de réponse à l'ialocine avec le paramètre "mise à jour":
la source
if($update)
ou de garder le nouveau bloc en premier mais en utilisantif( ! $update )
. Ce dernier mettra l'OP en meilleure pratique et est préféré à votre méthode par les normes de codage WordPress dans des cas comme l' opérateur ternaireVous pouvez utiliser le crochet d'action pre_post_update pour le code de mise à jour et save_post pour le nouveau code postal. Cela fonctionne avant la mise à jour d'un article.
la source
save_post
le crochet est déclenché à la fois lorsqu'un article est créé et mis à jour (après que WordPress l'a enregistré dans la base de données).pre_post_update
est renvoyé lorsqu'un article est mis à jour, mais avant sa mise à jour - cela peut être important.Comme Darshan Thanki l'a laissé entendre (et Stephen Harris a précisé), vous pouvez utiliser
pre_post_update
à votre avantage.La raison pour laquelle j'ai utilisé des globaux est parce que
function is_new_post() use ( &$new_post )
n'est pas valide en PHP (choquant ...) donc tirer cette variable dans la portée de la fonction ne fonctionne pas - d'où le global.Notez que cela ne peut vraiment être utilisé de manière fiable que pendant / après l'
save_post
événement (ce qui est généralement suffisant, au moins pour ce que nous en faisons).la source
Lorsque save_post est déclenché, toutes les informations sur cette publication sont déjà disponibles, donc en théorie, vous pouvez utiliser
ce n'est pas testé, cependant. =)
la source
save_post
message lui-même, il aurait déjà été enregistré dans la base de données - il enget_posts
serait de même pour le message actuel.Une autre approche qui utilise une fonction intégrée et aucun ajout à la base de données n'impliquerait
get_post_status()
.Notez cependant qu'il peut ne pas être approprié si vous envisagez de redéfinir ultérieurement le statut sur "brouillon" - vos instructions seront répétées la prochaine fois que vous mettrez à jour le message. Selon le contexte, vous souhaiterez peut-être prendre en compte les différentes chaînes qui peuvent être renvoyées par
get_post_status()
pour créer un scénario plus approprié.Voir Codex pour get_post_status () et Post Status
la source
save_post()
est exécuté pour la première fois, mais pendant cette exécution, ilget_post_status()
renvoie déjà «publier» et non «brouillon», même s'il n'est qu'en cours de publication.