Получение post_id в функции wp_ajax
Я написал пользовательскую функцию AJAX, в которой назначил тип записи дочерним элементом другого типа записи. В одной функции я перебираю эти дочерние записи и хочу обновить базу данных, чтобы отразить post_parent (запись, которой принадлежат дочерние записи).
Проблема в том, что я не могу получить ID этой записи откуда-либо для обновления базы данных. Есть предложения?
Вот jQuery функция:
$.ajax({
url: ajaxurl,
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data: {
action: 'new_item_save',
item_order: $('#img-sortable').sortable('toArray').toString()
}
});
А вот 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' );
Более производительно просто передавать ID из JavaScript, использование url_to_postid
требует запроса к базе данных.

Это верно, но если вам нужно сделать это только на стороне сервера, как в моем случае, где мне нужно проверить ID записи.

Отличный ответ! Что касается производительности... возможно, это менее производительно, но точно более безопасно.

Referer может быть подделан. Не в браузере, но возможно в скриптовых языках. Следует использовать nonce
в сочетании с проверкой current_user_can
, после чего либо этот ответ, либо ответ TheDeadMedic будут одинаково безопасны. А для публичных AJAX-эндпоинтов следует использовать is_post_publicly_viewable
.

AJAX-хук не передаст объект $post
обратно в ваш callback - откуда ему знать, что это нужно делать!
Вам нужно отправить данные самостоятельно:
data:{
action: 'new_item_save',
post_id: POST_ID_EITHER_PARSED_FROM_DOM_OR_PHP_ECHOED,
item_order: $('#img-sortable').sortable('toArray').toString()
}
...а затем получить их из $_POST
в вашем обработчике:
function save_new_img_order() {
$post_id = $_POST['post_id'];
...
}
