Вопрос или проблема
У меня возникают проблемы с получением данных JSON, которые передаются через запрос ajax.
Я пытаюсь внедрить загрузчик медиафайлов на страницу настроек плагина. У меня он функционирует правильно, используя этот метод, что касается функциональности загрузчика медиафайлов. Я хотел бы иметь возможность получить данные ‘attachment’ в PHP, декодировать их, а затем обработать после закрытия загрузчика медиафайлов и выбора изображений. Запрос ajax работает, потому что я могу вернуть ответ, и он его получает, но когда я пытаюсь декодировать строку JSON и выполнить vardump, возвращается null, и если я пытаюсь получить доступ к ключу массива, он пуст. Вот код js…
jQuery(document).ready(function($){
var file_frame;
jQuery('.upload_image_button').live('click', function( event ){
event.preventDefault();
if ( file_frame ) {
file_frame.open();
return;
}
file_frame = wp.media.frames.file_frame = wp.media({
title: jQuery( this ).data( 'uploader_title' ),
button: {
text: jQuery( this ).data( 'uploader_button_text' ),
},
multiple: true
});
file_frame.on( 'select', function() {
var selection = file_frame.state().get('selection');
selection.map( function( attachment ) {
attachment = attachment.toJSON();
$.post(ajax_object.ajaxurl, {
action: 'ajax_action',
data: attachment
}, function(data) {
console.log(data);
});
});
});
file_frame.open();
});
});
А вот PHP функция, которая расположена в основном файле плагина и принимает запрос ajax…
function ajax_action_stuff() {
$image_data = $_POST['data'];
$data = json_decode( $image_data, true );
var_dump( $data );
// echo $data[url];
die();
}
add_action( 'wp_ajax_ajax_action', 'ajax_action_stuff' );
А также зарегистрированные скрипты, которые находятся в основном файле плагина…
function gzmu_load_scripts() {
wp_enqueue_media();
wp_enqueue_script( 'gzmu-media-upload', plugin_dir_url(__FILE__) . 'gzmu-media-upload.js' );
wp_localize_script( 'gzmu-media-upload', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
wp_enqueue_style( 'admin-styles', plugin_dir_url(__FILE__) . '/css/admin.css' );
}
add_action( 'admin_enqueue_scripts', 'gzmu_load_scripts' );
Я никогда не работал с JSON, поэтому немного запутался в том, как обрабатывать данные. Буду признателен за любые советы о том, что я мог сделать неправильно. Спасибо…
Вы делаете некоторые ошибки, 1-я $_POST['data'];
не содержит никаких данных POST, используйте ключи массива json для получения данных post, например.
$data_key1 = $_POST['key1'];
$data_key2 = $_POST['key2'];
// и так далее ...
замените key1, key2 и т.д. на ключи json данных, которые ваш ajax-запрос отправил.
после вызова var_dump
в функции ajax_action_stuff, данные JSON больше не являются JSON. Просто: echo $data;
В моих вызовах AJAX я обнаружил, что мне не нужно кодировать/декодировать данные как JSON при отправке POST данных. Данные, отправленные jQuery.POST, уже находятся в виде пар “ключ-значение”, так что, на мой взгляд, вам не нужно делать их JSON — и вам не нужно декодировать их в PHP-функции перед работой с ними.
Однако, я использую JSON перед отправкой данных обратно в jQuery. После того как я собираю свои данные в $content
, я кодирую их как JSON и возвращаю в одной строке:
echo json_encode($content, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
Затем в jQuery я декодирую JSON:
function( content ) {
var myContent = JSON.parse(content);
// делайте то, что хотите с парами "ключ-значение" в myContent
}
Я надеюсь, это поможет вам, как и мне.
Ответ или решение
Рассмотрим задачу получения данных в формате JSON через запрос AJAX, исходя из описания проблемы, связанной с использованием загрузчика медиафайлов в плагине WordPress. Мы разберём теоретические аспекты, предложим пример кода, затем применим это знание в практике для решения вашей проблемы.
Теория
AJAX (Asynchronous JavaScript and XML) — это метод, который позволяет веб-приложениям взаимодействовать с сервером асинхронно без необходимости обновления страницы. Это особенно полезно для работы с загрузчиками медиа, где требуется выбор файлов и последующая обработка данных на стороне сервера.
JSON (JavaScript Object Notation) — это текстовый формат для обмена данными, который легко читается человеком и автоматически парсится в различных языках программирования, включая JavaScript и PHP. В контексте AJAX-запросов он часто используется для передачи данных между клиентом и сервером.
Ваша проблема, вероятно, связана с неправильным пониманием передачи данных через AJAX и обработки JSON в PHP. Ошибка заключается в попытке декодировать строку, которая уже передается в виде массива, а не JSON.
Пример
Давайте начнем с анализа и исправления вашего JavaScript кода:
jQuery(document).ready(function($){
var file_frame;
jQuery('.upload_image_button').on('click', function(event) {
event.preventDefault();
if (file_frame) {
file_frame.open();
return;
}
file_frame = wp.media.frames.file_frame = wp.media({
title: jQuery(this).data('uploader_title'),
button: {
text: jQuery(this ).data('uploader_button_text'),
},
multiple: true
});
file_frame.on('select', function() {
var selection = file_frame.state().get('selection');
selection.map(function(attachment) {
attachment = attachment.toJSON();
// Здесь мы передаем данные как отдельные ключ-значения
$.post(ajax_object.ajaxurl, {
action: 'ajax_action',
id: attachment.id, // Пример передачи отдельной переменной
url: attachment.url // Добавьте больше полей по необходимости
}, function(responseData) {
console.log(responseData);
});
});
});
file_frame.open();
});
});
Теперь, давайте рассмотрим PHP функцию, которая обработает эти данные:
function ajax_action_stuff() {
// Получить данные из POST запроса
$attachment_id = intval($_POST['id']);
$attachment_url = esc_url($_POST['url']);
// Какая-то логика обработки
$result = array(
'id' => $attachment_id,
'url' => $attachment_url
);
// Возврат результата как JSON
echo json_encode($result, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
wp_die(); // Используйте wp_die() для корректного завершения AJAX запросов в WordPress
}
add_action('wp_ajax_ajax_action', 'ajax_action_stuff');
Обратите внимание, что мы заменили $_POST['data']
многими полями, такими как $_POST['id']
и $_POST['url']
, чтобы напрямую работать с данными POST запроса, которые отправлены jQuery.
Применение
-
Понимание формата данных: При отправке данных из JavaScript в PHP через AJAX переданные данные находятся в виде ассоциативного массива. Это означает, что их нерезонно интерпретировать как JSON строку, используя
json_decode
. Вместо этого вы должны обращаться к соответствующим ключам массива, таким как$_POST['id']
или$_POST['url']
. -
Правильное подключение скриптов: Убедитесь, что ваши скрипты и стили правильно подключены с использованием хука
admin_enqueue_scripts
. Это позволит избежать ситуаций, когда JavaScript код не выполняется из-за отсутствия необходимых библиотек. -
Работа с медиабиблиотекой WordPress: Если вы работаете с загрузкой изображений из медиабиблиотеки, убедитесь, что у вас установлены правильные права доступа и вы используете функции WordPress для безопасной обработки данных.
-
Обработка данных и их возврат: В PHP вы должны обрабатывать полученные данные и возвращать результат в виде JSON. Это обеспечивает хороший User Experience (UX), позволяя обновлять интерфейс пользователя на основе ответа от сервера.
Таким образом, вы можете управлять загрузкой и обработкой медиа файлов в вашем плагине WordPress, используя AJAX и JSON, что повышает интерактивность и удобство вашего приложения. Применяя данные рекомендации, вы сможете избежать многих распространённых ошибок и обеспечить надёжную работу ваших ресурсов.