Вопрос или проблема
Я работаю над плагином. У меня есть пользовательский тип записи 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 в плагинах в Codex.
С учетом этой практики вы можете настроить ваш запрос следующим образом. Измените 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("ошибка");
}
});
});
Теперь нам нужно сказать 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' );
После этого вы создаете вашу функцию обратного вызова. Помните, что ВСЕГДА нужно завершать выполнение ваших 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 );
}
Выберите категорию
slug) ; ?>’>name); ?>
Поиск
Продукты
Модальное окно заголовок
Название продукта :
Описание продукта :
Содержимое продукта :
Закрыть
Сохранить изменения
$(document).ready(function(){
//обновить редактируемый пост
$(document).on(‘click’,’#update_post’,function(){
var post_id = $(‘#edit_post_id’).val();
var post_name = $(‘#pro_name’).val();
var post_des = $(‘#pro_des’).val();
var post_content = $(‘#pro_con’).val();
$.ajax({
type:’GET’,
url:”,
data:{
‘action’ : ‘update_post’,
‘update_post_id’ : post_id,
‘product_name’: post_name,
‘product_des’ : post_des,
‘product_content’ : post_content,
},
success:function(result){
window.location.reload();
},
});
});
// кнопка редактирования поста
$(document).on(‘click’,’.edit_post’,function(){
var post_id = $(this).data(‘post_id’);
$.ajax({
type: “GET”,
url:” “,
data:{
‘action’: ‘edit’,
‘edit’: post_id,
},
success: function(result){
console.log(result.data.data);
if(result.success){
var title = result.data.data.tittle;
$(‘#pro_name’).val(title);
var des = result.data.data.description;
$(‘#pro_des’).val(des);
var content = result.data.data.content;
$(‘#pro_con’).val(content);
$(‘#edit_post_id’).val(post_id);
$(‘#exampleModal’).modal(‘show’);
}
},
});
});
// кнопка удаления поста
$(document).on(‘click’,”.delete_post”, function(){
var delete_post = $(this).data(‘post_id’);
$.ajax({
type: “GET”,
url: “”,
data : {
‘action’: ‘delete’,
‘delete’: delete_post,
},
success: function(result){
window.location.reload();
},
});
});
// категория поста
$(“#category”).change(function(){
var category = $(this).val();
$(‘#post_container’).empty();
$.ajax({
type: “GET”,
url: “”,
data : {
‘action’ : ‘my_action’,
‘category’ : category,
},
success: function(result){
if(result.success){
console.log(result.data.data);
$(‘#post_container’).append(result.data.data);
} else {
$(‘#post_container’).append(‘Продукты не найдены..!! ‘);
}
},
});
});
// кнопка поиска постов
$(“#search_1”).click(function(){
var search = $(“#search”).val();
$(“#post_container”).empty();
$.ajax({
type: “GET”,
url: “”,
data : {
‘action’ : ‘my_action’,
‘search’ : search,
},
success: function(result){
if(result.success){
console.log(result.data.data);
$(‘#post_container’).append(result.data.data);
} else {
$(‘#post_container’).append(‘Продукты не найдены..!! ‘);
}
},
});
});
// получение постов через ajax
function post_ajax(){
$.ajax({
type: “GET”,
url: “”,
data: {
‘action’:’my_action’
},
dataType: ‘json’,
success: function(result){
console.log(result);
if(result.success){
$(‘#post_container’).append(result.data.data);
} else {
$(‘#post_container’).append(‘Продукты не найдены..!! ‘);
}
},
});
}
post_ajax();
});
Ответ или решение
Для получения содержимого поста с использованием AJAX в WordPress, необходимо следовать определенным шагам, обеспечивая правильную регистрацию и вызов функций. Ниже описан детальный процесс, который поможет вам корректно реализовать данную функциональность в вашем плагине, работающем с пользовательским типом поста "team".
1. Настройка JavaScript для отправки AJAX-запроса
Сначала убедитесь, что вы используете правильный URL для AJAX-запроса. Вместо URL вашего плагина, используйте admin-ajax.php
. Это можно сделать следующим образом:
$(document).ready(function () {
$(".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("Ошибка");
}
});
});
});
2. Регистрация AJAX-обработчика в WordPress
После того, как вы определили обработчик на стороне клиента, необходимо зарегистрировать соответствующий обработчик на серверной стороне. Это делается с помощью функции add_action
в файле вашего плагина:
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'); // Для незалогиненных пользователей
3. Создание функции-обработчика
Теперь необходимо создать функцию, которая будет обрабатывать AJAX-запросы и возвращать содержимое поста. Убедитесь, что ваша функция корректно обрабатывает входящие данные и отправляет ответ. Ниже приведен пример функции:
function f711_get_post_content_callback() {
// Получаем ID поста и приводим его к целочисленному типу
$post_id = intval($_POST['post_id']);
// Проверяем валидность ID поста
if ($post_id === 0) {
wp_send_json_error('Некорректный ввод');
die();
}
// Получаем пост по ID
$thispost = get_post($post_id);
// Проверяем, существует ли пост
if (!is_object($thispost)) {
wp_send_json_error('Пост с ID ' . $post_id . ' не найден');
die();
}
// Возвращаем содержимое поста
$response = array(
'error' => false,
'result' => wpautop($thispost->post_content)
);
wp_send_json_success($response);
}
4. Обработка ответа на клиенте
По завершении AJAX-запроса вы можете модифицировать ваш код успеха для более информативного вывода:
success: function (result) {
if (result.success) {
// Можно вставить результат в нужный элемент на странице
$('#post_content').html(result.data.result);
} else {
alert(result.data);
}
}
Заключение
С помощью представленного подхода вы сможете успешно получать содержимое постов с помощью AJAX-запросов в WordPress. Убедитесь, что правильно обрабатываете данные на стороне сервера и клиента, включая проверку входных данных и отправку корректных ответов. Следование этим шагам обеспечит надежную работу вашего плагина и улучшит пользовательский опыт.
Не забывайте также соблюдать современные стандарты безопасности, такие как валидация и экранирование данных, особенно если вы планируете использовать пользовательский ввод.