Obținerea post_id în funcția wp_ajax
Am scris o funcție AJAX personalizată în care am atribuit un tip de postare ca fiind copil al unui alt tip de postare. Într-o funcție parcurg aceste postări copil și vreau să actualizez baza de date pentru a reflecta post_parent (postarea de care aparțin postările copil).
Problema este că nu pot prelua ID-ul acelei postări de nicăieri pentru a actualiza baza de date. Aveți sugestii?
Iată funcția jQuery:
$.ajax({
url: ajaxurl,
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data: {
action: 'new_item_save',
item_order: $('#img-sortable').sortable('toArray').toString()
}
});
Și aici este callback-ul 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' );
Este mai performant să transmiți doar ID-ul din JavaScript, folosirea url_to_postid
necesită interogarea bazei de date.

Așa este, dar dacă vrei să o faci doar pe partea de server, ca în cazul meu unde trebuie să validez ID-ul postării.

foarte bun răspunsul! legat de performanță... poate că e mai puțin performant, dar cu siguranță e mai sigur.

Referer-ul poate fi falsificat. Nu într-un browser, dar da, în limbaje de scripting. Ar trebui folosit un nonce
combinat cu o verificare current_user_can
, după care fie acest răspuns, fie cel al lui TheDeadMedic ar fi la fel de sigure. Și pentru punctele de acces ajax publice, ar trebui folosit is_post_publicly_viewable
.

Cârligul (hook) AJAX nu va returna un obiect $post
către funcția ta de callback - cum naiba ar ști să facă asta!
Trebuie să trimiți datele tu însuți:
data:{
action: 'new_item_save',
post_id: POST_ID_EITHER_PARSED_FROM_DOM_OR_PHP_ECHOED,
item_order: $('#img-sortable').sortable('toArray').toString()
}
...și apoi să le preiei din $_POST
în handler-ul tău:
function save_new_img_order() {
$post_id = $_POST['post_id'];
...
}
