Obtener el post_id en la función wp_ajax
Escribí una función AJAX personalizada en la que he asignado un tipo de post como hijo de otro tipo de post. En una función estoy recorriendo esos posts hijos, y quiero actualizar la base de datos para reflejar el post_parent (el post al que pertenecen los posts hijos).
El problema es que no puedo obtener el ID de ese post desde ningún lugar para actualizar la base de datos. ¿Alguna sugerencia?
Aquí está la función jQuery:
$.ajax({
url: ajaxurl,
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data: {
action: 'new_item_save',
item_order: $('#img-sortable').sortable('toArray').toString()
}
});
Y aquí está el callback en PHP:
function save_new_img_order( $post ) {
global $wpdb;
$pid = $post->ID;
$order = explode( ',', $_POST[ 'item_order' ] );
$counter = 0;
foreach ( $order as $item_id ) {
$wpdb->update( $wpdb->posts, array( 'menu_order' => $counter,
'post_parent' => $pid,
), array( 'ID' => $item_id ) );
$counter ++;
}
die( 1 );
}
add_action( 'wp_ajax_new_item_save', 'save_new_img_order' );
Es más eficiente simplemente pasar el ID desde JavaScript, usar url_to_postid requiere consultar la base de datos.
Milo
Así es, pero si quieres hacerlo solo del lado del servidor, como en mi caso donde tengo que validar el ID de la publicación.
Mohammad Sayed
¡Muy buena respuesta! En cuanto al rendimiento... tal vez sea menos eficiente, pero definitivamente es más seguro.
zlikotp
El referer puede ser falsificado. No en un navegador, pero sí en lenguajes de scripting. Se debe usar un nonce combinado con una verificación current_user_can, después de lo cual tanto esta respuesta como la de TheDeadMedic serían igual de seguras. Y para endpoints AJAX públicos, se debe usar is_post_publicly_viewable.
wp-overwatch.com
El hook de AJAX no devolverá un objeto $post a tu callback - ¡de ninguna manera sabría cómo hacerlo!
Necesitas enviar los datos tú mismo:
data:{
action: 'new_item_save',
post_id: POST_ID_EITHER_PARSED_FROM_DOM_OR_PHP_ECHOED,
item_order: $('#img-sortable').sortable('toArray').toString()
}
...y luego capturarlos desde $_POST en tu manejador:
function save_new_img_order() {
$post_id = $_POST['post_id'];
...
}