Ottenere il post_id nella funzione wp_ajax
Ho scritto una funzione AJAX personalizzata in cui ho assegnato un tipo di post come figlio di un altro tipo di post. In una funzione sto facendo un ciclo attraverso questi post figli e voglio aggiornare il database per riflettere il post_parent (il post a cui appartengono i post figli).
Il problema è che non riesco a recuperare l'ID di quel post da nessuna parte per aggiornare il database. Qualche suggerimento?
Ecco la funzione jQuery:
$.ajax({
url: ajaxurl,
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data: {
action: 'new_item_save',
item_order: $('#img-sortable').sortable('toArray').toString()
}
});
Ed ecco la callback 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' );
È più performante passare semplicemente l'ID da JavaScript, utilizzare url_to_postid
richiede l'interrogazione del database.

Esatto, ma se vuoi farlo solo lato server, come nel mio caso in cui devo validare l'ID del post.

risposta molto valida! riguardo alle performance... forse è meno performante, ma è decisamente più sicuro.

Il referer può essere falsificato. Non in un browser, ma sì nei linguaggi di scripting. Dovrebbe essere utilizzato un nonce
combinato con un controllo current_user_can
dopo il quale sia questa risposta che quella di TheDeadMedic sarebbero ugualmente sicure. E per gli endpoint ajax pubblici, dovrebbe essere utilizzato is_post_publicly_viewable
.

L'hook AJAX non passerà un oggetto $post
alla tua callback - come potrebbe sapere di doverlo fare!
Devi inviare i dati tu stesso:
data:{
action: 'new_item_save',
post_id: POST_ID_EITHER_PARSED_FROM_DOM_OR_PHP_ECHOED,
item_order: $('#img-sortable').sortable('toArray').toString()
}
...e poi recuperarli da $_POST
nel tuo handler:
function save_new_img_order() {
$post_id = $_POST['post_id'];
...
}
