Pregunta:
Para una agenda de indie rock, creé publicaciones de eventos. Con la ayuda de javascript, los valores de los campos personalizados (bandas, lugares e información de fecha seleccionada en las casillas de selección) se copian como el título de la publicación al publicar o actualizar la publicación. También hay una función personalizada que actualiza el slug cada vez que cambia el título. . Problema: si otro usuario crea una nueva publicación seleccionando exactamente los mismos valores de campos personalizados, se crea otra publicación con exactamente el mismo slug. Y si se crean dos publicaciones con el mismo slug, ambas conducen a una página de error 404 hasta que una de ellas se elimina manualmente. Mi pregunta: ¿hay alguna manera de "validar" la publicación slug comparándola con las publicaciones más antiguas en la base de datos? Gracias por tu ayuda !
Respuesta:
El estilo Ajax (un poco sucio, pero puedes mejorarlo fácilmente)
En su functions.php (o en un complemento, o en cualquier otro lugar):
function my_ajax_update(){
if (isset($_POST['title'])){
global $wpdb;
$title = esc_sql($_POST['title']);
if(!$title) return;
$page = $wpdb->get_results("
SELECT *
FROM $wpdb->posts
WHERE post_title LIKE '$title'
AND post_type = 'event'
AND post_status = 'publish'
LIMIT 1
");
if ($page) echo "This title already exists !";
}
}
add_action("wp_ajax_check_double_post", "my_ajax_update");
Y en algún lugar de su plantilla de metabox (o cargada a través de una acción):
jQuery(document).ready(function($){
var the_title = $('#title').val();
$('#publish').click(function(e){
e.preventDefault();
$.post(
ajaxurl,
{
action:"check_double_post",
title: the_title
},
function(data){
if ((data) != 0) {
message = $('<div id="message" class="error below-h2" />').html('<p>Warning, this title already exists!</p>')
$('h2').after(message);
$('#ajax-loading').hide();
$('#publish').removeClass('button-primary-disabled');
}
else {
$(this).submit();
}
}
);
});
});