Получение post_id в функции wp_ajax

25 июл. 2012 г., 15:21:01
Просмотры: 22.6K
Голосов: 6

Я написал пользовательскую функцию 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' );
1
Комментарии

Пожалуйста, ознакомьтесь с [tag:wp-localize-script], чтобы узнать, как правильно передавать данные из PHP в JavaScript.

kaiser kaiser
25 июл. 2012 г. 15:25:47
Все ответы на вопрос 2
5
24

Это старый вопрос, но я хотел бы ответить для других людей.

В AJAX-функции, подключенной через wp_ajax, сделайте следующее:

$url     = wp_get_referer();
$post_id = url_to_postid( $url );
5 февр. 2015 г. 20:22:24
Комментарии

Более производительно просто передавать ID из JavaScript, использование url_to_postid требует запроса к базе данных.

Milo Milo
5 февр. 2015 г. 20:27:20

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

Mohammad Sayed Mohammad Sayed
5 февр. 2015 г. 20:30:33

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

zlikotp zlikotp
21 мар. 2020 г. 19:42:38

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

wp-overwatch.com wp-overwatch.com
25 февр. 2022 г. 00:53:30

Это один из лучших ответов. Ты спас мне кучу времени, чувак!!!

Mobashir Mobashir
29 окт. 2023 г. 11:15:48
0

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'];
    ...
}
25 июл. 2012 г. 15:54:00