web-dev-qa-db-fra.com

Comment afficher une notification de l'administrateur après la mise à jour des paramètres du plugin?

J'ai un plugin avec une page de paramétrage, et certaines actions doivent être effectuées lorsqu'une certaine option est enregistrée. J'utilise le hook pre_update_option_ pour le faire. Jusqu'ici tout va bien. Cependant, si quelque chose ne va pas, je dois également en informer l'utilisateur. J'ai essayé ces choses:

1) Ajoutez un crochet à admin_notices avant de mettre à jour le code

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( 'correct_value' == $new_value );

    if ( !$valid ) add_action('admin_notices', 'my_notification_function' )
    return ($valid)? $new_value : $old_value;
});

La validation fonctionne, mais la notification ne s'affiche pas car, je suppose, les fonctions rattachées à admin_notices ont déjà été exécutées?

2) Validation dans la fonction liée à admin_notices Pour résoudre le problème ci-dessus, j'ai eu cette idée.

add_action('admin_notices', function () {

      //Do my validation
      $valid = ( 'correct_value' == $_POST['my_var'] );
      if (!$valid) { /* Display error message */ }
      //Store the value of $valid
});

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //fetch the value of $valid which I stored 
    return ($valid)? $new_value : $old_value;
});

Cela semblerait bien fonctionner, je vois la notification maintenant. Le problème est que, pour une raison étrange, je ne vois pas les valeurs affichées. J'ai essayé d'imprimer $_POST et c'est toujours vide! Probablement WordPress transmet-il les valeurs d'une autre manière? Si c'est le cas, comment?

Quel est le bon chemin à suivre et comment puis-je résoudre le problème? Bien sûr, si une autre méthode est meilleure que ces deux solutions et résout le problème, c'est la bienvenue.

4
DavidTonarini

Après avoir fouillé dans les paramètres de l'API, j'ai trouvé la réponse. La méthode 1 était correcte, mais la notification ne devrait pas être faite en se connectant à admin_notices, mais en utilisant la fonction add_settings_error

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( 'correct_value' == $new_value );

    if ( !$valid ) {
         //This fixes the issue
         add_settings_error( 'my_var', $error_code, $message );
    }
    return ($valid)? $new_value : $old_value;
});

Pour les afficher, vous devez également l'ajouter au début de la page des paramètres:

<h2>The heading of my settings page</h2>
<?php settings_errors(); ?>
3
DavidTonarini

Non, vous vous trompez. add_action doit être dans __construct() de votre objet plugin. Voici l'extrait de mon petit plugin WOOF par catégorie , vous pouvez télécharger le code entier de wordpress.org:

public function __construct() {
    //...
    add_action( 'admin_notices', array( $this, 'wbc_plugin_not_found' ) );
    //...
}

Dans mon code, je vérifie une condition (validation - dans votre cas) et renvoie le résultat via wbc_requirements_met(). Si le résultat est faux, j'ajoute un message de notification avec wbc_admin_message

public function wbc_plugin_not_found() {
    if ( $this->wbc_requirements_met() ) {
        return;
    }

    $message = __( 'WOOF by Category plugin requires the following plugins installed and activated: ', 'woof-by-category' );
    //...
    $this->wbc_admin_message( $message, 'error notice is-dismissible' );
    }

private function wbc_admin_message( $message, $class ) {
    ?>
    <div class="<?php echo esc_attr( $class ); ?>">
        <p>
            <span style="display: block; margin: 0.5em 0.5em 0 0; clear: both;">
            <?php echo wp_kses( $message, wp_kses_allowed_html( 'post' ) ); ?>
            </span>
        </p>
    </div>
    <?php
}
1
KAGG Design

Je rencontre ce même défi il y a quelques mois. J'avais besoin d'afficher des avis d'administrateur basés sur certaines validations que j'avais avec certains champs personnalisés dans un type d'article personnalisé.

Comme ma validation était dans un hook pre_save, le problème est que "le navigateur est actualisé après le déclenchement de ce hook".

J'ai donc trouvé une classe de John Oleksowicz qui stocke les notifications de l'administrateur dans la table d'options et les efface si nécessaire.

Il s’appelle: Notifications faciles d’administrateur WordPress

La classe est assez simple et vous pouvez simplement utiliser le plugin. Dans mon cas, j'ai utilisé la classe et je l'ai adaptée en changeant la façon d'appeler les fonctions de messages de l'administrateur.

Alors maintenant, chaque fois que je dois déclencher un avis d'administrateur, je fais juste:

planner_notices_add_error( $message );
1
Armando Duran

Nous avons écrit une petite bibliothèque pour les avis d’administration de Wordpress: https://gitlab.com/wpdesk/wp-notice

Maintenant, afficher la notice de l'administrateur est aussi simple que créer un nouvel objet:

$notice = new \WPDesk\Notice\Notice( 'info', 'Notice text goes here' );

0
Grzegorz Rola