web-dev-qa-db-fra.com

Pourquoi ne puis-je pas me connecter à save_posts après admin_init?

J'essaie de me connecter à l'action "save_post" à partir d'un callback AJAX dans mon plug-in, mais cela ne semble pas fonctionner. En fait, la connexion à "save_posts" semble fonctionner uniquement à partir de quelques points d'exécution d'action clés (par exemple, "init" ou "admin_init") mais pas à partir d'autres (par exemple, un rappel "add_meta_boxes").

Dans mon cas particulier, j'aimerais cliquer sur un bouton de l'écran Éditer l'article pour ajouter un nouveau métabox personnalisé et le laisser enregistrer correctement les données du métabox. Mais bien sûr, au moment où je clique sur ce bouton et que j'ajoute cette metabox, j'ai déjà accroché l'action "save_post" une fois et WP ne semble apparemment pas vouloir me laisser accrocher à nouveau.

En parcourant brièvement le code source WP, je ne vois aucune raison évidente de ne pas pouvoir relancer cette action. Des idées sur la façon de contourner cette apparente limitation, ou au moins une explication de la raison pour laquelle cela ne fonctionne pas?

3
danblaker

L'ajout de fonction aux points d'ancrage est une opération d'exécution, elle n'est pas persistante. Quelle que soit l'opération de hook que vous exécutez dans les actions Ajax, elles sont exécutées dans une instance séparée WP et expirent dès que la réponse Ajax est renvoyée. Ils n'ont aucune influence sur la page actuellement chargée.

Vous aurez probablement besoin de raccorder votre fonctionnalité à save_post comme d'habitude (pas dans l'action Ajax) et de vérifier si votre métabox supplémentaire le gère.

2
Rarst

Je me cachais littéralement sur un problème connexe et c'est la première chose que j'ai lue en ligne qui donne un indice solide de ce que je faisais de travers.

Il s'avère que add_meta_boxes est appelé plus tard que save_post; vous devez donc configurer le hook de sauvegarde AVANT la création de la métabox. Cela semble contre-intuitif au début, mais le balisage est généralement généré APRÈS le traitement de Wordpress. Il est donc logique que les hooks soient configurés avant le rendu de la métabox.

Heureusement, j'ai eu un peu de code lié au crochet admin_init, qui se déclenche avant le save_post, il est donc devenu très facile de résoudre le problème.

Encore une fois, merci d'avoir posté cette question. Ce n'était pas exactement ce que je cherchais mais cela laissait entendre la réponse au problème.

1
akamaozu