Mon vrai problème est un peu complexe, je vais donc essayer de le résumer et de le garder simple.
Je travaille sur une application personnalisée basée sur WordPress. J'ai enregistré un type de publication personnalisé, appelons-le "personnes" où je stocke des informations sur ... les personnes.
Le CPT ne prend en charge que les champs par défaut du titre et du contenu de la publication, mais il existe des métaboxes pour stocker les informations de la personne (pensez à mon application comme un carnet d'adresses).
Il y a donc une métabox pour stocker des informations personnelles, une pour stocker des informations sur les réseaux sociaux, une autre pour stocker des informations liées au travail, c'est-à-dire si cette personne est pour moi un client, un fournisseur, si nous avons des crédits ou des débits ...
J'ai simplifié ici, mais il y a une quantité cohérente de métaboxes, disons 12.
Mon problème est que certaines personnes pour lesquelles je veux stocker des informations ne sont que des contacts aléatoires, et je veux stocker uniquement des informations personnelles, d'autres sont des amis et je veux stocker des informations personnelles et des informations sur les réseaux sociaux, d'autres sont des clients ou des fournisseurs et je souhaitez stocker des informations liées au travail.
Si, lors de la modification d'un article, je me cache (via le menu d'options de l'écran ) ou ferme une métabox dont je n'ai pas besoin, lorsque j'ouvre un autre article là où j'en ai besoin, je dois les afficher ou les rouvrir. Cela parce que la position / le statut / l'ordre des métaboxes sont enregistrés par utilisateur en tant que métadonnées utilisateur .
Si vous imaginez dans certains articles que j'ai besoin de 2 métaboxes, dans certains 10 et dans 5, vous comprenez que c'est ennuyeux parce que les garder tous affichés / ouverts rendent l'écran d'édition bas accessible (la barre de défilement semble infinie), et parfois les informations que je recherche sont à la fin de la page après un tas de métaboxes sans info ...
Question:
Est-il possible d'enregistrer la position / le statut / l'ordre des métaboxes par poste pour un type de poste spécifique?
PS: Je sais que certains js / jQuery peuvent résoudre le problème, mais si possible, j'éviterais les solutions javascript.
'get_user_option_*_post'
pour que WP reconnaisse les données personnalisées. Je pense seulement que je n'aime pas trop, c'est l'utilisation dewp_get_referer
cela vraiment sur$_SERVER
var qui n'est pas vraiment fiable mais je pense que j'ai une idée pour surmonter le "problème principal";)wp_get_referer()
méthode, c'est pourquoi je l'ai appelée une solution PHP non élégante ;-) J'ai d'abord pensé à stocker l'identifiant de publication actuel pour chaque utilisateur, mais cela ne fonctionne pas si un utilisateur en édite deux ou plus messages dans le navigateur. Réjouissez-vous d'entendre votre idée sur le "problème principal" Profitez du week-end ;-)Comme l'a souligné birgire dans sa réponse , WordPress utilise AJAX pour mettre à jour l'état des métaboxes et les données transmises dans la demande AJAX n'incluent pas l'identifiant de publication, ce qui rend difficile la mise à jour de l'état des boîtes par publication.
Une fois que j'ai trouvé l'action AJAX utilisée par WordPress
'closed-postboxes'
, j'ai recherché cette chaîne dans le dossier admin js pour trouver comment WordPress fait la demande AJAX.J'ai trouvé que cela se produit
postbox.js
à la ligne # 118 .Il ressemble à ceci:
Essentiellement, WordPress examine les éléments DOM avec la classe `` boîte aux lettres '' et la classe `` fermée '' et crée une liste séparée par des virgules de leurs ID. La même chose est faite pour les éléments DOM cachés avec la classe «boîte aux lettres».
Donc, ma pensée était: je peux créer une fausse métabox qui a les bonnes classes et qui est cachée, en définissant son id pour contenir l'ID du post, et de cette façon je peux le récupérer dans une requête AJAX.
Voici ce que j'ai fait:
De cette façon, j'ai créé une métabox qui est toujours fermée et toujours cachée, donc WordPress enverra son ID en tant que
$_POST
var dans la demande AJAX, et une fois que l'id de la fausse boîte contient l'ID de la poste de manière prévisible, je suis capable de reconnaître la publication.Après cela, j'ai regardé comment WordPress exécute la tâche AJAX.
À la
admin-ajax.php
ligne 72 , WordPress s'accroche'wp_ajax_closed-postboxes'
avec la priorité 1.Donc, pour agir avant WordPress, je pouvais accrocher la même action avec la priorité 0.
La sauvegarde des données dans un post meta a permis de filtrer
get_user_option_closedpostboxes_mycpt
etget_user_option_metaboxhidden_mycpt
(les deux variantes duget_user_option_{$option}
filtre) de forcer les options de chargement WordPress à partir du post meta:et
la source