Mi verdadero problema es un poco complejo, así que intentaré resumirlo y mantenerlo simple.
Estoy trabajando en una aplicación personalizada basada en WordPress. Registré un tipo de publicación personalizada, llamémosla "personas" donde almaceno información sobre ... personas.
El CPT solo admite campos predeterminados de título y contenido de publicación, pero hay algunos metaboxes para almacenar información de personas (piense en mi aplicación como una libreta de direcciones).
Entonces, hay un metabox para almacenar información personal, uno para almacenar información de redes sociales, otro para almacenar información relacionada con el trabajo, es decir, si esa persona es para mí un cliente, un proveedor, si tenemos créditos o débitos ...
Simplifiqué aquí, pero hay una cantidad constante de metaboxes, digamos 12.
Mi problema es que algunas personas para las que quiero almacenar información son solo contactos aleatorios, y quiero almacenar solo información personal, otras son amigos y quiero almacenar información personal y de redes sociales, otras son clientes o proveedores y yo desea almacenar información relacionada con el trabajo.
Si al editar una publicación me oculto (a través del menú de opciones de pantalla ) o cierro cualquier metabox que no necesito, cuando abro otra publicación donde la necesito, tengo que mostrarla o abrirla nuevamente. Esto se debe a que la posición / estado / orden de los metaboxes se guardan por usuario como metadatos de usuario .
Si te imaginas en algunas publicaciones que necesito 2 metaboxes, en algunas 10 y en algunas 5, entiendes que es molesto porque mantener todas ellas mostradas / abiertas hace que la pantalla de edición sea accesible (la barra de desplazamiento parece interminable), y a veces la información que busco es al final de la página después de un montón de metaboxes sin información ...
Pregunta:
¿Es posible guardar la posición / estado / orden de metaboxes por publicación para un tipo de publicación específico?
PD: Sé que algunos js / jQuery pueden resolver el problema, pero si fuera posible evitaría las soluciones de JavaScript.
'get_user_option_*_post'
para hacer que WP reconozca datos personalizados. Solo creo que no me gusta demasiado es el uso dewp_get_referer
eso realmente en$_SERVER
var que no es realmente confiable, pero creo que tengo una idea para superar el "problema principal";)wp_get_referer()
método, por eso lo llamé una solución PHP no elegante ;-) Primero pensé en almacenar la identificación de publicación actual para cada usuario, pero eso no funciona si un usuario está editando dos o más Publicaciones en el navegador. Esperamos escuchar acerca de su idea sobre el "problema principal" disfrutar el fin de semana ;-)Como señaló birgire en su respuesta , WordPress usa AJAX para actualizar el estado de metaboxes y los datos pasados en la solicitud de AJAX no incluyen identificación de publicación, y eso dificulta la actualización del estado de las cajas por publicación.
Una vez que encontré la acción AJAX utilizada por WordPress
'closed-postboxes'
, busqué esta cadena en la carpeta admin js para encontrar cómo WordPress realiza la solicitud AJAX.Encontré que sucede
postbox.js
en la línea # 118 .Se ve así:
Esencialmente, WordPress mira los elementos DOM con la clase 'postbox' y la clase 'cerrada' y crea una lista separada por comas de sus ID. Lo mismo se hace para los elementos DOM ocultos con la clase 'postbox'.
Entonces, mi pensamiento fue: puedo crear un metabox falso que tenga las clases correctas y que esté oculto, configurando su ID para que contenga ID de publicación, y de esta manera puedo recuperarlo en una solicitud AJAX.
Esto es lo que he hecho:
De esta manera, creé un metabox que siempre está cerrado y siempre oculto, por lo que WordPress enviará su ID como
$_POST
var en la solicitud de AJAX, y una vez que la identificación de la caja falsa contenga la ID de la publicación de una manera predecible, puedo reconocer la publicación.Después de eso, miré cómo WordPress realiza la tarea AJAX.
En la
admin-ajax.php
línea 72 , WordPress engancha'wp_ajax_closed-postboxes'
con prioridad 1.Entonces, para actuar antes de WordPress, podría conectar la misma acción con prioridad 0.
Tener los datos guardados en una publicación meta permitió filtrar
get_user_option_closedpostboxes_mycpt
yget_user_option_metaboxhidden_mycpt
(ambas variaciones delget_user_option_{$option}
filtro) forzar las opciones de carga de WordPress desde la publicación meta:y
fuente