¿Cómo manejo mejor las acciones de la página del complemento personalizado?

21

Siempre me encuentro con la misma molestia, así que pensé que vería si hay alguna idea o experiencia por ahí ...

He creado un complemento que utiliza su propia página de administración. Tiene que. Ahora que resolví las cosas de WP_List_Table (), debo decir que es genial ... pero ...

Las páginas de complementos personalizados siempre se cargan como admin.php?page=... a menos que quiera cargarlas directamente desde el directorio de complementos, lo que no hago. Ahora, si hago una 'acción' desde esa página, necesito procesarla de alguna manera y luego redirigir a la página sin el parámetro de acción. No importa si hago un GET o POST, en serio.

En todas sus páginas internas, WP hace esto en la misma página, verifica si hay una acción, si es así, la procesa y luego se redirige a sí misma sin la acción. Esto es posible, porque en estas páginas aún no se ha cargado el admin-header .

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 realizar 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 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 carga 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 plugin de forma anónima para que nadie puede acceder desde el exterior.

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 ya configurada?

(Sé de una solución alternativa ... puedo enganchar una función en load-.... que verifica el parámetro de acción y realiza el procesamiento y la redirección. Pero me pregunto si hay una mejor manera).

Gracias.

    
pregunta wyrfel 26.02.2011 - 01:44

3 respuestas

28

Como regla general, debe usar una solicitud POST para la mayoría de las acciones, para asegurarse de que no sean ejecutado 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í:

  1. Su página de plugin con un formulario POST, que se envía a
  2. Una página que maneja la solicitud, la cual redirige a
  3. Su página de complementos, que muestra el resultado de la acción

La página central no tiene que ser tu página de complementos. Esto significa que puede usar el "controlador genérico de POST" que se incluyó hace tres años, el gancho 'admin_action_' . $_REQUEST['action'] en admin.php .

Un usuario de ejemplo es el complemento Akismet . Si desea usarlo de manera confiable, tienes que enviar directamente a admin.php , no a otra página que incluya admin.php .

Este es un ejemplo muy básico de cómo usarlo:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}
    
respondido por el Jan Fabry 28.02.2011 - 22:08
3

Me acerqué a esto de manera ligeramente diferente simplemente agregando noheader = true a la url de acción en la página donde el usuario envía toma la acción

Mi controlador luego realiza la acción (es decir, normalmente agregar, actualizar o eliminar) y luego termina con wp_redirect () en la acción de la página siguiente (por ejemplo, agregar página - > editar página, eliminar página - > página de lista, editar página - > página de edición). También paso un mensaje en la URL para que pueda mostrar un estado como actualizar con éxito o no.

Este enfoque mantiene todas las acciones: lista, agregar, editar, eliminar, eliminar de forma masiva, etc. en la misma clase y con el mismo control administrativo, por lo que es bastante fácil de mantener y de entender.

    
respondido por el Russell Jamieson 29.08.2011 - 14:22
0

Otro enfoque diferente es simplemente agregar un campo de entrada oculto al formulario:

<input type="hidden" name="page" value="your-page-slug" />

De esta manera, WordPress parece manejar la redirección automáticamente.

    
respondido por el simonthesorcerer 16.01.2015 - 17:02

Lea otras preguntas en las etiquetas