J'ai une fonction qui définit un champ personnalisé sur un type de message. Disons que le champ est "sous-titre".
Lorsque le message est enregistré, je souhaite effectuer une validation sur l'entrée et afficher un message d'erreur sur l'écran d'édition du message si nécessaire. Quelque chose comme:
// Handle post updating
function wpse_update_post_custom_values($post_id, $post) {
// Do some checking...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors->add('oops', 'There was an error.');
}
return $errors;
}
add_action('save_post','wpse_update_post_custom_values',1,2);
J'essaie de lier cela à l'action save_post, mais je ne sais pas comment gérer les erreurs. Il ne semble pas y avoir d'objet d'erreur passé dans la fonction, et si je crée mon propre obj WP_Error et le renvoie, il n'est pas respecté par quelque mécanisme que ce soit qui crache des erreurs sur la page de post-édition.
J'ai actuellement un message d'erreur sur la page dans ma boîte de méta personnalisée, mais ce n'est pas idéal - je préfère avoir une grosse erreur rouge, en haut comme WP s'affiche normalement.
Des idées?
MISE À JOUR:
Sur la base de la réponse de @Denis, j'ai essayé plusieurs choses différentes. Le stockage des erreurs en tant que global n'a pas fonctionné, car Wordpress effectue une redirection pendant le processus save_post, qui tue le global avant de pouvoir l'afficher.
J'ai fini par les stocker dans un méta-champ. Le problème avec cela est que vous devez les effacer, ou ils ne disparaîtront pas lorsque vous accédez à une autre page, j'ai donc dû ajouter une autre fonction attachée à admin_footer qui efface simplement les erreurs.
Je ne m'attendais pas à ce que la gestion des erreurs pour quelque chose d'aussi commun (mise à jour des messages) soit aussi maladroite. Suis-je en train de manquer quelque chose d'évident ou est-ce la meilleure approche?
// Handle post updating
function wpse_5102_update_post_custom_values($post_id, $post) {
// To keep the errors in
$errors = false;
// Do some validation...
if($_POST['subhead'] != 'value i expect') {
// Add an error here
$errors .= 'whoops...there was an error.';
}
update_option('my_admin_errors', $errors);
return;
}
add_action('save_post','wpse_5102_update_post_custom_values',1,2);
// Display any errors
function wpse_5102_admin_notice_handler() {
$errors = get_option('my_admin_errors');
if($errors) {
echo '<div class="error"><p>' . $errors . '</p></div>';
}
}
add_action( 'admin_notices', 'wpse_5102_admin_notice_handler' );
// Clear any errors
function wpse_5102__clear_errors() {
update_option('my_admin_errors', false);
}
add_action( 'admin_footer', 'wpse_5102_clear_errors' );
la source
admin_footer
crochet si vous supprimez les erreurs à la fin de votre fonction de gestionnaire d'avis. Simplifie un peu les choses.update_option('my_admin_errors', false);
immédiatement après l'instruction if à la fin dewpse_5102_admin_notice_handler()
?Réponses:
Stockez les erreurs dans votre classe ou en tant que global, éventuellement dans un transitoire ou une méta, et affichez-les dans les notifications d'administration sur les requêtes POST. WP ne comporte aucun gestionnaire de messages flash.
la source
Je suggère d'utiliser des sessions car cela ne créera pas d'effets étranges lorsque deux utilisateurs éditeront en même temps. Voilà donc ce que je fais:
Les sessions ne sont pas démarrées par wordpress. Vous devez donc démarrer une session dans votre plugin, functions.php ou même wp-config.php:
Lors de l'enregistrement du message, ajoutez des erreurs et des avis à la session:
Imprimez les notifications et les erreurs, puis nettoyez les messages de la session:
la source
Sur la base de la suggestion de pospi d'utiliser des transitoires , j'ai trouvé ce qui suit. Le seul problème est qu'il n'y a pas de crochet pour mettre le message en dessous de l' endroit où vont les autres messages, j'ai donc dû faire un hack jQuery pour y arriver.
h2
Tout d'abord, enregistrez le message d'erreur concernant votre gestionnaire
save_post
(ou similaire). Je lui donne une courte durée de vie de 60 secondes, il est donc juste assez long pour que la redirection se produise.Ensuite, récupérez simplement ce message d'erreur lors du chargement de la page suivante et affichez-le. Je le supprime également pour qu'il ne s'affiche pas deux fois.
Étant donné que des
admin_notices
incendies avant que le contenu de la page principale ne soit généré, l'avis n'est pas là où vont les autres messages de post-édition, j'ai donc dû utiliser ce jQuery pour le déplacer là-bas:Étant donné que l'ID de publication fait partie du nom transitoire, cela devrait fonctionner dans la plupart des environnements multi-utilisateurs, sauf lorsque plusieurs utilisateurs modifient simultanément la même publication.
la source
acme_plugin_error_msg_POSTID
. Vous pouvez simplement ajouter un ID utilisateur à celaacme_plugin_error_msg_POSTID_USERID
.Lors de l'
save_post
exécution, il a déjà enregistré le message dans la base de données.En regardant dans le code de base WordPress, plus précisément à la
wp-includes/post.php
de »update_post()
fonction, il n'y a aucun moyen intégré pour intercepter une requête avant qu'elle ne soit enregistrée sur la base de données.Cependant, nous pouvons accrocher
pre_post_update
et utiliserheader()
etget_post_edit_link()
pour empêcher la publication du message.Si vous devez informer l'utilisateur de ce qui s'est mal passé, vérifiez cet essentiel: https://gist.github.com/Luc45/09f2f9d0c0e574c0285051b288a0f935
la source
Pourquoi ne validez-vous pas votre champ à l'aide de Javascript? Je pense que ce serait la meilleure approche pour cela.
la source
En essayant d'utiliser le script ci-dessus, j'ai rencontré un problème étrange. Deux messages s'affichent sur l'écran d'édition, après la mise à jour post. L'un montre l'état du contenu de la sauvegarde précédente et un autre de la sauvegarde actuelle. Par exemple, si j'enregistre correctement le message et que je fais ensuite une erreur, le premier est "erreur" et le second est "ok" - bien qu'ils soient générés en même temps. Si je change le script et que j'ajoute un seul message (par exemple "erreur"), lance une mise à jour avec "erreur" et ensuite une autre avec "ok", le message "erreur" reste (s'affiche pour la deuxième fois). Je dois encore enregistrer avec "ok" pour m'en débarrasser. Je ne sais vraiment pas ce qui ne va pas, je l'ai testé sur trois serveurs locaux différents et il y a le même problème sur chacun d'eux.
la source
J'ai écrit un plugin qui ajoute une gestion des erreurs flash pour les écrans de modification de publication et empêche la publication des publications jusqu'à ce que les champs obligatoires soient remplis:
https://github.com/interconnectit/required-fields
Il vous permet de rendre tous les champs de publication obligatoires, mais vous pouvez utiliser l'API qu'il fournit pour rendre tous les champs personnalisés requis également avec un message d'erreur personnalisable et une fonction de validation. Par défaut, il vérifie si le champ est vide ou non.
la source