Как получить содержимое записи через ajax?

4 февр. 2016 г., 12:33:49
Просмотры: 45K
Голосов: 12

Я работаю над плагином. У меня есть пользовательский тип записи team. В нем четыре записи разных категорий. Я использую этот код для отправки ID записи через ajax.

$(document).ready(function () {

        $(".post_thumbnail").click(function () {
            var id_post = $(this).attr('post_id');
            $.ajax({
                type: 'POST',
                url: "<?php echo plugin_dir_url(__FILE__).'post-content.php';?>",
                data: {
                    'post_id': id_post
                }, success: function (result) {

                   alert(result);
                },
                error: function () {
                    alert("ошибка");
                }
            });

        });
    });

Я успешно отправляю ID и получаю его. Для получения ID мой код выглядит так:

if(isset($_POST['post_id'])) {
    echo  $id=$_POST['post_id'];

}

но я не могу отобразить содержимое каждой записи. Как отобразить содержимое каждой записи? Я пытался изо всех сил, но не получилось. Буду признателен за любую помощь.

4
Комментарии

Возможный дубликат вопроса Использование the_content вне цикла

Stephen Harris Stephen Harris
4 февр. 2016 г. 13:06:31

@StephenHarris Я считаю, что это не совсем то же самое — я разместил ответ о корректном использовании AJAX в плагинах. Получение контента не столь важно по сравнению с правильной реализацией в самом WordPress.

fischi fischi
4 февр. 2016 г. 13:19:44

@fischi Я упустил момент, что они создали собственный endpoint, и изначально интерпретировал вопрос так, будто они уже успешно реализовали AJAX-часть (с использованием вашего решения), и им лишь требовалось получить содержимое записи по её ID.

Stephen Harris Stephen Harris
4 февр. 2016 г. 13:54:02

Вам стоит ознакомиться с REST API WordPress. Вы можете легко получить контент без всего этого php-кода в ответе ниже.

maysi maysi
10 янв. 2019 г. 13:34:05
Все ответы на вопрос 1
2
17

Во-первых, вы всегда должны использовать методы AJAX в WordPress, а не создавать для этого пользовательские функции. См. AJAX в плагинах в Кодексе.

С учетом этой практики вы можете настроить свой запрос следующим образом. Измените URL AJAX на

<?php echo admin_url('admin-ajax.php'); ?>

и добавьте ключ 'action': со значением имени конкретной функции WordPress, которую вы хотите выполнить на следующем шаге, когда сервер получит ваши данные.

$(".post_thumbnail").click(function () {
    var id_post = $(this).attr('post_id');
    $.ajax({
        type: 'POST',
        url: '<?php echo admin_url('admin-ajax.php'); ?>',
        data: {
            'post_id': id_post,
            'action': 'f711_get_post_content' // это имя метода AJAX, вызываемого в WordPress
        }, success: function (result) {
           alert(result);
        },
        error: function () {
            alert("error");
        }
    });
});

Теперь нужно сообщить WordPress, что делать, когда кто-то вызывает f711_get_post_content.

Зарегистрируйте действие в AJAX WordPress. Это делается в функциях вашего плагина. Первая часть ('wp_ajax_') сообщает WordPress, что это действие AJAX, а часть после этого - имя действия ('f711_get_post_content'). Второй аргумент - это функция, которую WordPress выполняет при вызове этого действия.

add_action( 'wp_ajax_f711_get_post_content', 'f711_get_post_content_callback' );
// Если вы хотите разрешить использование этой функции пользователям, не вошедшим в систему, зарегистрируйте ее еще раз с этой функцией:
add_action( 'wp_ajax_nopriv_f711_get_post_content', 'f711_get_post_content_callback' );

После этого создайте свою callback-функцию. Помните, что функции AJAX ВСЕГДА должны завершаться die(). Если ваша функция выводит JSON, что я рекомендую, вы можете завершить ее с помощью wp_send_json( $array );, которая включает в себя die().

function f711_get_post_content_callback() {

    // получаем post_id и очищаем его для повышения безопасности
    $post_id = intval($_POST['post_id'] );

    // Проверяем, было ли введено корректное целое число
    if ( $post_id == 0 ) {
        echo "Неверный ввод";
        die();
    }

    // получаем запись
    $thispost = get_post( $post_id );

    // проверяем, существует ли запись
    if ( !is_object( $thispost ) ) {
        echo 'Запись с ID ' . $post_id . ' не существует';
        die();
    }

    echo $thispost->post_content; // Возможно, вы захотите вывести wpautop( $thispost->post_content );

    die();
}

Это рекомендуемая версия с JSON. Она позволяет передавать несколько переменных обратно клиенту.

function f711_get_post_content_callback() {

    // получаем post_id и очищаем его для повышения безопасности
    $post_id = intval($_POST['post_id'] );

    // Проверяем, было ли введено корректное целое число
    if ( $post_id == 0 ) {

        $response['error'] = 'true';
        $response['result'] = 'Неверный ввод';

    } else {

        // получаем запись
        $thispost = get_post( $post_id );

        // проверяем, существует ли запись
        if ( !is_object( $thispost ) ) {

            $response['error'] = 'true';
            $response['result'] =  'Запись с ID ' . $post_id . ' не существует';

        } else {

            $response['error'] = 'false';
            $response['result'] = wpautop( $thispost->post_content );

        }

    }

    wp_send_json( $response );

}
4 февр. 2016 г. 13:18:20
Комментарии

Для всех, кто нашел этот ответ: обратите внимание на WordPress REST API, который гораздо проще в использовании. Вам не понадобится весь этот PHP-код, упомянутый в данном ответе.

maysi maysi
10 янв. 2019 г. 13:36:11

Здравствуйте, я использовал admin-ajax.php, но из-за настроек безопасности брандмауэра получаю ошибку 403, так как он вызывает wp-admin на фронтенде.

David Coder David Coder
3 мар. 2021 г. 07:32:58