Constantemente me encuentro con la misma molestia, así que pensé en ver si hay alguna idea o experiencia por ahí ...
He creado un complemento que usa su propia página de administración. Tiene que. Ahora que resolví las cosas WP_List_Table (), debo decir que es genial ... pero ...
Las páginas de complementos personalizados siempre se cargan como a admin.php?page=...
menos que quiera cargarlas directamente desde el directorio de complementos, lo cual no hago. Ahora, si hago una 'acción' desde esa página, necesito procesarla de alguna manera y luego redirigirla nuevamente a la página sin el parámetro de acción. No importa si hago GET o POST, de verdad.
En todas sus páginas internas, WP hace esto en la misma página, comprueba si hay una acción, si es así, la procesa y luego la redirige a sí misma sin la acción. Esto es posible porque admin-header
todavía no se ha cargado en estas páginas .
Sin embargo, si intenta hacerlo en su propia página, la mitad de la interfaz de administración ya se ha enviado al navegador, por lo que ya no es posible una redirección. Claramente, la solución es POST / GET directamente a otra página, cargar el marco WP en eso, hacer el procesamiento y luego redirigir de nuevo a la página original ... pero ... eso es un poco molesto, porque ... mi original La página se carga a través de una devolución de llamada, por lo que se ejecuta dentro de un método de mi clase. Eso es hermoso.
Si cargo una página separada, tengo que incluir manualmente wp-load.php
y estoy fuera de mi clase, lo cual es molesto, y en mi caso particular me molesta especialmente, porque solo estoy instanciando mi clase de complemento de forma anónima para que nadie pueda acceder a ella. desde fuera.
Entonces, después de esta larga historia ... ¿alguien encontró una buena solución para cargar otra página a través de una devolución de llamada sin tener toda la interfaz de administración configurada a su alrededor?
(Conozco una solución alternativa ... puedo conectar una función load-....
que verifica el parámetro de acción y procesa y redirige. Pero me pregunto si hay una mejor manera).
Gracias.
[plugin-wp-pagenavi]
?[plugin-development]
es ciertamente bienvenido aquí.plugin-wp-pagenavi
sirve ... estaba asumiendo que era por cosas relacionadas con la correlación entre los complementos y el menú de administración. Como mi pregunta está relacionada con eso, seleccioné esa etiqueta.[admin-menu]
aquí, pero no creo que esté realmente relacionado con eso. Cambié las etiquetas a lo que creo que le queda, por supuesto, puede editarlo nuevamente.Respuestas:
Como regla general, debe utilizar una solicitud POST para la mayoría de las acciones, para asegurarse de que no se ejecuten por accidente . Pero también es una buena práctica redirigir a una página normal después de una solicitud POST, para evitar la ejecución duplicada cuando el usuario actualiza la página.
Entonces el flujo es así:
La página central no tiene que ser su página de complemento. Esto significa que puede usar el "controlador POST genérico" que se incluyó hace tres años, el
'admin_action_' . $_REQUEST['action']
enlaceadmin.php
.Un usuario de ejemplo es el complemento Akismet . Si desea utilizarlo de manera confiable, debe enviarlo
admin.php
directamente , no a otra página que incluyaadmin.php
.Aquí hay un ejemplo muy básico de cómo usarlo:
fuente
admin.php
directamente es el "truco" que me enseñó la fuente de Akismet. Tiene razón cuando está mostrando un formulario y desea volver a mostrarlo en caso de errores: entonces sería fácil si el destino es su página de complementos pero se engancha en algún lugar al inicio (para que pueda redirigir si tiene éxito o mostrar el formulario de nuevo con mensajes de error si no). ¿Quizás lo sugiera en un boleto de Trac?'load-<pagehook>'
gancho funcionaba ... se llama antes de que se cargue la página ... pero eladmin_action_...
concepto parece mucho más agradable y más específico. Además, en una nota, los mensajes de error siguen siendo problemáticos si realiza POST y no desea volver a publicar en la recarga, pero ese es un tema diferente.admin_action_
gancho se moviera antes que el cargador de páginas del complemento.Abordé esto de manera ligeramente diferente simplemente agregando noheader = true a la url de acción en la página donde el usuario envía la acción
Luego, mi controlador realiza la acción (es decir, normalmente, agregar, actualizar o eliminar) y luego termina con un wp_redirect () a la siguiente acción de página (por ejemplo, agregar página -> editar página, eliminar página -> lista de páginas, editar página -> editar página ) También paso un mensaje en la URL para que pueda mostrar un estado como actualización exitosa o fallida.
Este enfoque mantiene todas las acciones: enumerar, agregar, editar, eliminar, eliminar en masa, etc. en la misma clase y con la misma babosa de administración, por lo que es bastante fácil de mantener y comprender.
fuente
Otro enfoque diferente es simplemente agregar un campo de entrada oculto al formulario:
De esta manera, WordPress parece manejar la redirección automáticamente.
fuente