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.
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(); ?>
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
}
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 );
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' );