¿Cómo se debe implementar add_settings_error en páginas de menú personalizadas?

8

El libro Professional WordPress Plugin Development explica en detalle cómo usar correctamente la API de configuración, y también muestra cómo agregar menús y submenús, pero desafortunadamente no proporciona ningún ejemplo conjunto de esto. Si bien logré hacer que la mayor parte funcione, no puedo entender cómo implementar adecuadamente add_settings_error en páginas de menú personalizadas. Aquí está mi código:

function settings_main_validate( $input ) {
$valid['text_string'] = preg_replace( '/[^a-zA-Z]/', '', $input['text_string'] );

if ( $valid['text_string'] != $input['text_string'] ) {
    //add_setting_error: $title, $id, $error_message, $class
    add_settings_error( 'fields_main_input', 'texterror', 'Incorrect value entered!', 'error' );
}   

return $valid;
}                  

La validación anterior funcionará muy bien en la configuración renderizada usando add_options_page, pero no mostrará los errores de configuración en las páginas renderizadas con add_menu_page.

jnthnclrk
fuente

Respuestas:

8

Hay varios componentes para la creación de errores / avisos y el proceso de visualización:

  1. add_settings_error()llame para agregar un elemento a la pila ( $wp_settings_errorsvariable global ).
  2. settings_errors transitoria que mantiene los errores para que sobrevivan se mueven de una página a otra.
  3. settings_errors()función get_settings_errors()para recuperar errores de la memoria o transitorios y luego mostrarlos.

Estos funcionan de maravilla para la API de configuración, pero desafortunadamente no están configurados para uso genérico. Por otro lado, es trivial evitarlo.

Conéctate settings_errors()a admin_noticesla página de tu complemento, pasa el código de error para que solo muestre tus cosas.

Guarde manualmente los errores en settings_errorstransitorios (solo inserte esa variable global en él).

Dado que get_settings_errors()espera una sugerencia en los parámetros GET ( $_GET['settings-updated']) de que debe verificar transitorios en lugar de memoria, puede proporcionar eso u obtener errores de transitorio usted mismo y guardarlos nuevamente en la variable global antes de su settings_errors()llamada.

Actualizar

Estás convirtiendo esto en un desastre con múltiples preguntas, por lo que intentaré abordar tus inquietudes aquí.

Ajustes API hace el trabajo con las páginas de administración, que no utilizan la configuración de la sección de base. Su problema real es que, en ese caso, la notificación de errores / notificaciones no funciona.

Primero, esto es lo que sucede cuando publica un formulario, configurado con la API de configuración:

  1. Los datos se publican en una options.phppágina especial .
  2. Los datos se desinfectan / validan mediante la devolución de llamada.
  3. Cualquier error / aviso que surgió durante la desinfección / validación se recopila y guarda en forma transitoria.
  4. Se le redirige a donde sea que haya venido .

Ahora, cuando carga la página de administración, verifica si esta página pertenece a la sección Configuración y si ese caso incluye un pequeño options-head.phparchivo, que trata de recuperar y mostrar avisos de errores.

Entonces, lo único que "no funciona" en otras páginas es este último paso, que es trivial para hacer usted mismo con una descripción general de la función relacionada anterior (probablemente entré en demasiados detalles sobre transitorios, no los necesitará para el caso básico).

Rarst
fuente
¿Estás diciendo que la API de configuración no está realmente diseñada para su uso en menús y pantallas de administrador?
jnthnclrk
@trnsfrmr bueno, no es mi lugar decir si fue o no diseñado , pero ciertamente no está configurado para eso de forma nativa.
Rarst
Maldición, me equivoqué completamente entonces. Entonces, ¿la API de configuración es solo para pantallas que viven debajo del elemento del menú Configuración? En retrospectiva, eso explica por qué usarlo en menús personalizados ha sido tan complicado.
jnthnclrk
Parece una pena que todas las funciones interesantes de la API de configuración no estén disponibles para los complementos que utilizan menús personalizados.
jnthnclrk
@trnsfrmr bien, aún puedes intentar usarlo, solo requiere un esfuerzo extra gastado
Rarst
0

Un poco tarde, pero acabo de pasar por esto. Según el código del OP, la mejor solución que encontré es insertar este código:

function your_admin_notices_action() {
    settings_errors( 'fields_main_input' );
}
add_action( 'admin_notices', 'your_admin_notices_action' );

Esto agregará la visualización del aviso de administrador a las páginas de administrador representadas usando add_menu_page

Bev
fuente
-1

Simplemente agregando

include_once 'options-head.php'; 

La función $ de mi página de menú personalizada parecía funcionar bien para mostrar los mensajes de error en las páginas de menú personalizadas.

James Smartt
fuente