Question

J'ai une fonction qui définit un champ personnalisé sur un type de poste. Supposons que le champ est "subhead".

Lorsque le poste est sauvé, je veux faire une validation sur l'entrée, et affiche un message d'erreur sur l'écran de la modifier 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);

Je suis en train d'accrocher ce à l'action save_post, mais je ne peux pas comprendre comment gérer les erreurs. Il ne semble pas être un objet d'erreur passé dans la fonction, et si je crée mon propre WP_Error obj et de le retourner, ce n'est pas respecté par tout mécanisme recrache des erreurs sur la page d'édition de poste.

J'ai actuellement sur la page message d'erreur dans ma boîte de méta personnalisée, mais cela est moins qu'idéal - Id plutôt un grand, rouge, haut-at-the-top erreur comme WP normalement affiche <. / p>

Toutes les idées?

Mise à jour:

Sur la base de la réponse de @Denis, j'ai essayé quelques choses différentes. Le stockage des erreurs en tant que global ne fonctionne pas, parce que Wordpress fait une redirection au cours du processus save_post, qui tue le monde avant de pouvoir l'afficher.

J'ai fini de les stocker dans un champ de méta. Le problème est que vous devez les effacer, ou ils ne disparaîtront pas lorsque vous naviguez vers une autre page, donc je devais ajouter une autre fonction attachée au admin_footer que seulement vous permet de supprimer les erreurs.

Je n'aurais pas attendre à ce que la gestion des erreurs pour quelque chose de si (les messages de mise à jour) de commun serait ce maladroit. Suis-je manque 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' );
Était-ce utile?

La solution

erreurs Store dans votre classe ou en tant que global, peut-être dans un transitoire ou méta, et les afficher dans les avis d'admin sur les requêtes POST. WP ne figure pas tout gestionnaire de messages flash.

Autres conseils

Je suggère d'utiliser des sessions car cela ne crée pas d'étranges effets lorsque deux utilisateurs d'édition en même temps. Voilà donc ce que je fais:

sessions ne sont pas ouvertes par wordpress. Donc, vous devez commencer session dans votre plugin, functions.php ou même wp-config .php:

if (!session_id())
  session_start();

Lors de l'enregistrement de poste, les erreurs et les avis de append à la session:

function my_save_post($post_id, $post) {
   if($something_went_wrong) {
     //Append error notice if something went wrong
     $_SESSION['my_admin_notices'] .= '<div class="error"><p>This or that went wrong</p></div>';
     return false; //might stop processing here
   }
   if($somthing_to_notice) {  //i.e. successful saving
     //Append notice if something went wrong
     $_SESSION['my_admin_notices'] .= '<div class="updated"><p>Post updated</p></div>';
   }

   return true;
} 
add_action('save_post','my_save_post');

Imprimer les avis et les erreurs, puis nettoyer les messages de la session:

function my_admin_notices(){
  if(!empty($_SESSION['my_admin_notices'])) print  $_SESSION['my_admin_notices'];
  unset ($_SESSION['my_admin_notices']);
}
add_action( 'admin_notices', 'my_admin_notices' );

Pourquoi ne pas vous valider votre champ avec l'aide de certains Javascript? Je pense que ce serait la meilleure approche pour cela.

Essayer d'utiliser le script ci-dessus, je suis tombé sur un problème étrange. Deux messages sont affichés sur l'écran d'édition, après la mise à jour après. On est montrant l'état du contenu de la sauvegarde précédente et un autre à partir du courant. Par exemple, si je sauve le poste correctement, puis faites une erreur, la première est « erreur » et le second est « ok » - barbante ils sont générés dans le même temps. Si je change le script et append un seul message (par exemple « erreur »), lancer une mise à jour avec « erreur » et après qu'un autre avec le message « ok », « erreur » (séjours est affiché pour la deuxième fois). Je dois sauver avec « ok » une fois de plus pour se débarrasser de celui-ci. Je ne sais vraiment pas ce qui ne va pas, je l'ai testé sur trois serveurs locaux et il y a la même question sur chacun d'eux. Si quelqu'un a une idée ou une suggestion, s'il vous plaît aider!

J'ai écrit un plugin qui ajoute dans une gestion des erreurs flash pour les écrans d'édition post et empêche les messages en cours de publication jusqu'à ce que les champs obligatoires sont remplis:

https://github.com/interconnectit/required-fields

Il vous permet de faire un poste champs obligatoires mais vous pouvez utiliser l'API qu'elle fournit à faire des champs personnalisés requis aussi avec un message d'erreur personnalisable et la fonction de validation. Il par défaut vérifier si le champ est vide ou non.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top