Pregunta

Tengo una función que define un campo personalizado en un tipo de mensaje. Digamos que el campo es "subtítulo".

Cuando se guarda el post, quiero hacer una validación de la entrada, y mostrará un mensaje de error en la pantalla de edición posterior si es necesario. Algo así como:

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

Estoy intentando conectar esta a la acción save_post, pero no puedo encontrar la manera de manejar los errores. No parece ser un objeto de error pasado en la función, y si creo mi propia obj WP_Error y devolverlo, no es respetado por cualquier mecanismo escupe errores en la página de entrada de edición.

Actualmente tengo un mensaje de error en la página dentro de mi caja de meta costumbre, pero esto es menos que ideal - prefiero tener un grande, rojo, arriba-a-la-tapa de error como WP normalmente muestra <. / p>

¿Alguna idea?

ACTUALIZACIÓN:

En base a la respuesta @Denis', he intentado algunas cosas diferentes. El almacenamiento de los errores como un mundial no trabajo, porque Wordpress hace una redirección durante el proceso de save_post, que mata el mundial antes de poder mostrarlo.

Terminé almacenarlos en un campo de meta. El problema con esto es que es necesario borrar a cabo, o que no va a desaparecer cuando se desplaza a otra página, por lo que he tenido que añadir otra función de adjunto a la admin_footer que sólo borra los errores.

Yo no habría esperado que el manejo de errores para algo tan (mensajes de actualización) común sería este torpe. Me estoy perdiendo algo obvio o esto es el mejor enfoque?

// 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' );
¿Fue útil?

Solución

errores tienda en su clase o como un mundial, quizás un transitorio o meta, y los muestra en los anuncios de administración sobre las peticiones POST. WP no dispone de ningún controlador de mensajes flash.

Otros consejos

Es mejor utilizar las sesiones ya que esto no va a crear efectos extraños cuando dos usuarios de editar al mismo tiempo. Así que esto es lo que hago:

Las sesiones no se inician con WordPress. Así que hay que iniciar una sesión de en su plugin, functions.php o incluso wp-config .php:

if (!session_id())
  session_start();

Al guardar los correos, los errores de agregación y de avisos a la sesión:

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

Imprimir avisos y errores y luego limpiar los mensajes en la sesión:

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

Basado en pospi 's sugerencia para uso transitorios , me ocurrió lo siguiente. El único problema es que no hay gancho para poner el mensaje debajo de la h2 donde otros mensajes van, por lo que tenía que hacer un jQuery cortar para llegar allí.

En primer lugar, guardar el mensaje de error problema durante su save_post (o similar) manejador. Le doy un tiempo de vida corto de 60 segundos, por lo que hay tiempo suficiente para que la redirección ocurra.

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

A continuación, simplemente recuperar ese mensaje de error en la siguiente carga de la página y mostrarla. También se elimino por lo que no conseguirá aparece dos veces.

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>";
  }
}

Desde que se generan incendios admin_notices antes de que el contenido de la página principal, la notificación no es el lugar donde los otros mensajes de post editar van, así que tuve que usar este jQuery para moverlo allí:

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

Desde el ID del mensaje es parte del nombre transitoria, esto debería funcionar en la mayoría de entornos multiusuario, excepto cuando varios usuarios están editando simultáneamente el mismo puesto.

Cuando se ejecuta save_post, que ya ha guardado el post sobre la base de datos.

Mirando al código del núcleo de WordPress, más específicamente en función de la wp-includes/post.php update_post(), no hay una función de manera de interceptar una solicitud antes de que se guarda en la base de datos.

Sin embargo, podemos enganchar pre_post_update y el uso header() y get_post_edit_link() para evitar que el mensaje que se guarden.

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

Si para notificar al usuario lo que salió mal, mira esto lo esencial: https: //gist.github .com / Luc45 / 09f2f9d0c0e574c0285051b288a0f935

¿Por qué no validar su campo con la ayuda de un poco de Javascript? Creo que este sería el mejor enfoque para esto.

Si intenta usar el script anterior, me encontré con un problema extraño. Dos mensajes se muestran en la pantalla de edición, después de la actualización posterior. Uno está mostrando el estado del contenido de anteriores Guardar y otro de la corriente. Por ejemplo, si ahorro el mensaje correctamente y luego comete un error, primero es "error" y segundo es "ok" - Altough que se generan en el mismo tiempo. Si cambio el guión y añadir sólo un mensaje (por ejemplo, "error"), iniciar una actualización con "error" y después de eso, otro con "error" estancias mensaje "OK" (aparece por segunda vez). Debo guardar con "OK" una vez más para deshacerse de él. Realmente no sé lo que está mal, que he probado en tres servidores locales diferentes y no hay el mismo número en cada uno de ellos. Si alguien tiene alguna idea o sugerencia, por favor ayuda!

He escrito un plugin que agrega en un error de flash para el manejo de pantallas de edición de correos y mensajes previene de ser publicados hasta campos requeridos fueron completados:

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

Se le permite hacer cualquier puesto campos obligatorios pero se puede utilizar la API que proporciona para hacer los campos personalizados requeridos también con un mensaje de error personalizable y función de validación. Por defecto es comprobar si el campo está vacío o no.

Licenciado bajo: CC-BY-SA con atribución
scroll top