Domanda

Ho una funzione che definisce un campo personalizzato su un tipo di messaggio. Dicono che il campo è "sottotitolo".

Quando il messaggio viene salvato, voglio fare un po 'di validazione in ingresso e visualizzare un messaggio di errore sullo schermo dopo modificare se necessario. Qualcosa di simile:

// 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);

sto cercando di agganciare questo all'azione save_post, ma non riesco a capire come gestire gli errori. Non sembra essere un oggetto di errore passato nella funzione, e se creo il mio obj WP_Error e restituirlo, non è rispettato da qualsiasi meccanismo sputa fuori gli errori sulla pagina del post di modifica.

Al momento ho un messaggio di errore sulla pagina dentro la mia meta personalizzata di dialogo, ma questo è proprio l'ideale - preferirei avere un grande, rosso, up-at-the-top errore come WP normalmente visualizzato <. / p>

Tutte le idee?

UPDATE:

In base a risposta @Denis', ho provato un paio di cose diverse. Memorizzazione errori come globale non ha funzionato, perché Wordpress fa un redirect durante il processo di save_post, che uccide il mondiale prima di poter visualizzarlo.

Ho finito la loro memorizzazione in un campo di meta. Il problema di questo è che è necessario cancellare fuori, altrimenti non andrà via quando si passa a un'altra pagina, quindi ho dovuto aggiungere un'altra funzione attaccato al admin_footer che solo cancella gli errori.

I non avrebbe aspettato che la gestione degli errori per qualcosa di così (i messaggi di aggiornamento) comune sarebbe questo goffo. Mi sto perdendo qualcosa di ovvio o è questo l'approccio migliore?

// 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' );
È stato utile?

Soluzione

errori negozio nella tua classe o come globale, possibilmente in un transitorio o meta, e visualizzarli in avvisi di amministrazione su richieste POST. WP non presenta alcun gestore di messaggi flash.

Altri suggerimenti

Suggerisco di usare le sessioni poiché questo non creerà effetti strani quando due utenti modificano allo stesso tempo. Quindi questo è quello che faccio:

Le sessioni non vengono avviati da WordPress. Quindi è necessario avviare una sessione nel vostro plugin, functions.php o anche wp-config .php:

if (!session_id())
  session_start();

Quando si salva il post, errori di aggiunta e le comunicazioni alla sessione:

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');

Stampa avvisi e gli errori e poi pulire i messaggi nella sessione:

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' );

In base a pospi 's suggerimento per l'uso transitori , mi si avvicinò con il seguente. L'unico problema è che non c'è nessun gancio per mettere il messaggio sotto la h2 dove altri messaggi andare, così ho dovuto fare un jQuery incidere per arrivare lì.

Per prima cosa, salvare il messaggio di errore ogni scrupolo il tuo save_post (o simili) gestore. Ho dato un breve corso della vita di 60 secondi, quindi è lì giusto il tempo per il reindirizzamento avvenga.

if($has_error)
{
  set_transient( "acme_plugin_error_msg_$post_id", $error_msg, 60 );
}

Poi, basta recuperare quel messaggio di errore sul prossimo caricamento della pagina e visualizzarlo. Ho anche eliminarlo in modo che non otterrete visualizzata due volte.

add_action('admin_notices', 'acme_plugin_show_messages');

function acme_plugin_show_messages()
{
  global $post;
  if ( false !== ( $msg = get_transient( "acme_plugin_error_msg_{$post->ID}" ) ) && $msg) {
    delete_transient( "acme_plugin_error_msg_{$post->ID}" );
    echo "<div id=\"acme-plugin-message\" class=\"error below-h2\"><p>$msg</p></div>";
  }
}

Dal momento che gli incendi admin_notices prima il contenuto della pagina primaria viene generato, l'avviso non è dove gli altri messaggi di posta di modifica vanno, così ho dovuto usare questa jQuery per spostare lì:

jQuery('h2').after(jQuery('#acme-plugin-message'));

Dal momento che l'ID post è parte del nome transitoria, questo dovrebbe funzionare nella maggior parte degli ambienti multi-utente, tranne quando più utenti stanno modificando contemporaneamente lo stesso posto.

Quando viene eseguito save_post, si è già salvato il post sul database.

Guardando nel codice di base di WordPress, più specificamente la funzione wp-includes/post.php del update_post(), non c'è built-in modo di intercettare una richiesta prima che venga salvato nel database.

Tuttavia, si può collegare pre_post_update e uso header() e get_post_edit_link() per evitare che il post di essere salvato.

<?php

/**
*   Performs validation before saving/inserting custom post type
*/
function custom_post_site_save($post_id, $post_data) {
    // If this is just a revision, don't do anything.
    if (wp_is_post_revision($post_id))
        return;

    if ($post_data['post_type'] == 'my_custom_post_type') {
        // Deny post titles with less than 5 characters
        if (strlen($post_data['post_title'] < 5)) {
            header('Location: '.get_edit_post_link($post_id, 'redirect'));
            exit;
        }
    }
}
add_action( 'pre_post_update', 'custom_post_site_save', 10, 2);

Se di notificare all'utente che cosa è andato storto, controllare questo succo: https: //gist.github .com / Luc45 / 09f2f9d0c0e574c0285051b288a0f935

Perché non convalidare il vostro campo con l'aiuto di alcuni Javascript? Credo che questo sarebbe stato l'approccio migliore per questo.

Il tentativo di utilizzare lo script di cui sopra, mi sono imbattuto in uno strano problema. Due messaggi vengono visualizzati sullo schermo di modifica, dopo l'aggiornamento palo. Uno sta mostrando lo stato del contenuto dal precedente salvataggio e un altro dalla corrente. Per esempio, se risparmio il posto correttamente e poi fare un errore, prima è "errore" e la seconda è "ok" - ospitarci sono generati nello stesso tempo. Se cambio la sceneggiatura e accodamento un solo messaggio (ad esempio, "errore"), avviare un aggiornamento con "errore" e dopo che un altro con, soggiorni messaggio "OK" "ERRORE" (viene visualizzato per la seconda volta). Devo salvare con "OK" ancora una volta per sbarazzarsi di esso. Io davvero non so cosa c'è di sbagliato, ho provato su tre diversi server locali e c'è lo stesso problema su ciascuno di essi. Se qualcuno ha qualche idea o suggerimento, si prega di aiuto!

Ho scritto un plugin che aggiunge in un trattamento per pubblicare schermate di modifica e impedisce i messaggi di errore lampo pubblicato fino a quando i campi obbligatori sono compilati:

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

E 'consente di effettuare qualsiasi messaggio campi obbligatori, ma è possibile utilizzare l'API fornisce apportare campi personalizzati richiesti anche con un messaggio di errore personalizzabile e funzione di convalida. E 'default verificare se il campo è vuoto o no.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top