web-dev-qa-db-fra.com

Comment implémenter add_settings_error sur les pages de menu personnalisées?

Le livre Professional WordPress Plugin Development explique en détail comment utiliser correctement l'API Settings et explique également comment ajouter des menus et des sous-menus, mais il ne fournit malheureusement aucun exemple joint. Bien que j'aie réussi à faire fonctionner la plupart de ces éléments, je ne vois pas comment implémenter correctement add_settings_error dans les pages de menus personnalisées. Voici mon code:

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 validation ci-dessus fonctionnera parfaitement avec les paramètres rendus avec add_options_page, mais n'affichera pas les erreurs de paramètres sur les pages rendues avec add_menu_page.

8
jnthnclrk

Le processus de création et d’affichage des erreurs/notifications comporte plusieurs composants:

  1. add_settings_error() call pour ajouter un élément à empiler (variable globale $wp_settings_errors).
  2. settings_errors transitoire qui conserve les erreurs afin qu'elles survivent au déplacement de page en page.
  3. settings_errors() function get_settings_errors() pour extraire les erreurs en mémoire ou transitoires, puis les afficher.

Ceux-ci fonctionnent comme un charme pour les paramètres API, mais malheureusement, ils ne sont pas configurés pour une utilisation générique. D'autre part, il est trivial de contourner ce problème.

Accrochez settings_errors() à admin_notices sur la page de votre plugin, transmettez-lui le code d'erreur pour qu'il ne montre que vos fichiers.

Enregistrez manuellement les erreurs dans settings_errors transitoire (insérez simplement cette variable globale dans celle-ci).

Étant donné que get_settings_errors() s'attend à ce que les paramètres GET ($_GET['settings-updated']) lui permettent de vérifier les transitoires au lieu de la mémoire, vous pouvez indiquer ces erreurs ou obtenir les erreurs des transitoires et les enregistrer dans la variable globale avant votre appel settings_errors().

Mise à jour

Vous faites en sorte que cela pose quelques problèmes, alors je vais essayer de répondre à vos préoccupations ici.

API de paramètres ne fonctionne avec les pages d'administration, qui n'utilisent pas la section Paramètres comme base. Votre véritable problème est que, dans ce cas, le rapport d’erreurs/avis ne fonctionne pas.

Voici d'abord ce qui se passe lorsque vous postez un formulaire, configuré avec les paramètres de l'API:

  1. Les données sont publiées sur la page spéciale options.php.
  2. Là les données sont nettoyées/validées en utilisant le rappel.
  3. Toutes les erreurs/remarques survenues lors de la désinfection/validation sont collectées et enregistrées dans les éléments transitoires.
  4. Vous êtes redirigé vers d'où que vous veniez .

Maintenant, lorsque vous chargez la page admin, il vérifie si cette page appartient à la section Paramètres et si ce cas inclut un fichier options-head.php minuscule, il traite de la récupération et de l'affichage des avis d'erreur.

Donc la seule chose qui "ne fonctionne pas" sur d'autres pages est cette dernière étape, qui est facile à faire soi-même avec une vue d'ensemble des fonctions associées ci-dessus (j'ai probablement trop de détails sur les transitoires, vous n'en aurez pas besoin pour les cas élémentaires).

8
Rarst

Un peu tard, mais je viens de traverser cela. Sur la base du code de l'OP, la meilleure solution que j'ai trouvée consiste à insérer ce code:

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

Cela ajoutera l’affichage des avis d’administration aux pages d’administration rendues à l’aide de add_menu_page.

0
Bev