Как получить содержимое записи через ajax?
Я работаю над плагином. У меня есть пользовательский тип записи 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'];
}
но я не могу отобразить содержимое каждой записи. Как отобразить содержимое каждой записи? Я пытался изо всех сил, но не получилось. Буду признателен за любую помощь.
Во-первых, вы всегда должны использовать методы 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 );
}

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