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.

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.

¡Muy buena respuesta! En cuanto al rendimiento... tal vez sea menos eficiente, pero definitivamente es más seguro.

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
.

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'];
...
}
