marca
Estoy intentando validar campos en un tipo de publicación personalizada en la página Editar publicación del panel de administración.
Cuando el usuario hace clic en “Publicar”, quiero validar los campos en los datos POST y cambiar post_status a “pendiente” si los datos no pasan las pruebas. Cuando esto ocurre, también me gustaría agregar errores a la página en el área de avisos del administrador.
He estado probando esto con un gancho agregado a la acción “wp_insert_post” que también guarda nuestros propios datos. No estoy seguro del orden de las operaciones, pero asumo que los eventos wp_insert_post ocurren primero y luego mi función se llama a través del enlace.
El problema es que es la función de WordPress la que realiza las acciones de publicación de publicaciones, por lo que cuando puedo validar los datos, WordPress ya ha guardado la publicación con el estado “publicar”. Lo que debo hacer es evitar esa actualización o volver a cambiar el estado a “pendiente”, pero tengo poco éxito en encontrar una manera de hacerlo dentro de la API.
Entonces, aquí hay un orden de operaciones que me gustaría efectuar:
1. admin user edits post data and clicks "Publish"
2. via wp_insert_post, my data validation and post meta save routine is called
3. If data passes validation, post status is "published"
4. Otherwise, post status set to "pending" & message shown in admin notice area
Seguramente alguien ha hecho esto, pero buscar mucho en Google me lleva a las mismas páginas aparentemente irrelevantes. ¿Puede alguien señalarme en la dirección correcta aquí? Gracias por adelantado-
ACTUALIZAR:
Por lo tanto, RichardML estaba en lo correcto, conectarme al filtro wp_insert_post_data me dio el lugar correcto para validar los campos de la página de edición de publicaciones del administrador. Sin embargo, estoy actualizando esto para notar cuál es el resto de la solución, específicamente obteniendo el motivo informado en el área de notificación del administrador.
En primer lugar, no puede simplemente generar datos o establecer un campo porque la página de administración es el resultado de una redirección, y cuando vuelve a mostrar la página de publicación de administración, la acción admin_notices ya se ha ido. El truco fue algo que recogí de otro foro, y es un truco, pero funciona.
Lo que deberá hacer es en su función de filtro de validación, si determina que necesitará mostrar errores, es usar set_option() para agregar una opción de blog con un nombre único (utilicé ‘publish_errors’). Este debería ser un código HTML en un div con una clase de “error”.
También deberá agregar un enlace de acción para ‘admin_notices’, apuntando a una función que verifica la existencia de la opción ‘publish_errors’ y, si la encuentra, la imprime en la página y la elimina con delete_option().
ricardo m
Puedes usar el wp_insert_post_data
filtro para inspeccionar y modificar los datos de la publicación antes de que se inserten en la base de datos.
En respuesta a su actualización, no creo que sea necesario agregar temporalmente una opción a la base de datos. Debería ser posible simplemente agregar una variable de cadena de consulta a la redirección de WordPress, algo como esto:
add_filter('wp_insert_post_data', 'my_post_data_validator', '99');
function my_post_data_validator($data) {
if ($data['post_type'] == 'post') {
// If post data is invalid then
$data['post_status'] = 'pending';
add_filter('redirect_post_location', 'my_post_redirect_filter', '99');
}
return $data;
}
function my_post_redirect_filter($location) {
remove_filter('redirect_post_location', __FILTER__, '99');
return add_query_arg('my_message', 1, $location);
}
add_action('admin_notices', 'my_post_admin_notices');
function my_post_admin_notices() {
if (!isset($_GET['my_message'])) return;
switch (absint($_GET['my_message'])) {
case 1:
$message="Invalid post data";
break;
default:
$message="Unexpected error";
}
echo '<div id="notice" class="error"><p>' . $message . '</p></div>';
}
-
Fantástico, parece exactamente lo que necesito. Gracias, Ricardo.
– marca
15 de febrero de 2011 a las 20:34
-
Consulte mi respuesta actualizada para conocer una forma alternativa de crear mensajes de error.
– Ricardo M.
16 de febrero de 2011 a las 1:14
-
¡Gracias por el código! He notado que si quiero eliminar un registro de tipo de publicación personalizado pendiente del área de administración, no lo hace. ¿Algún consejo sobre eso? ¡Gracias!
– DashaLuna
25 de abril de 2011 a las 11:55