Вопрос или проблема
Я получаю данные из API, используя JS. Как я могу использовать эти данные с PHP? Более конкретно, назначить эти данные переменной $_SESSION
в PHP, чтобы я мог использовать их на других страницах (файлах шаблонов)?
Шаг 1: Запустите wp_localize_script, добавьте следующую функцию в function.php
add_action('wp_enqueue_scripts', 'jsto_php_enqueue_scripts', 5);
public function jsto_php_enqueue_scripts() {
wp_register_script('file_handle', plugin_dir_url(__FILE__) . 'js/js-file-name.js', array('jquery'), '0.0.1', false);
wp_enqueue_script('file_handle');
// Установите значения Nonce, чтобы AJAX вызовы были безопасны
$add_something_nonce = wp_create_nonce("add_something");
$ajax_url = admin_url('admin-ajax.php');
$user_id = 20; //PHP переменная
// передаем объект ajax в этот javascript файл
// Добавьте значения nonce в этот объект, чтобы мы могли получить к ним доступ в файле javascript plugin-name-admin.js
wp_localize_script('file_handle', 'ajax_object',
array(
'ajax_url' => $ajax_url,
'add_something_nonce' => $add_something_nonce,
'user_id' => $user_id
)
);
}
Шаг 2: Доступ к Локализованным Переменным в вашем JavaScript Файле (в данном примере js-file-name.js)
(function($) {
'use strict';
console.log(ajax_object);
console.log(ajax_object.ajax_url);
console.log(ajax_object.user_id);
console.log(ajax_object.add_something_nonce);
})(jQuery);
Я сам боролся с той же проблемой последние пару дней.
Я довольно новичок в WordPress, поэтому это может НЕ быть на 100% правильным способом сделать это. Я постараюсь исправить, если кто-то заметит любые ошибки (пожалуйста, прокомментируйте, если найдете их).
Вот код, который наконец-то сработал для меня:
Главный PHP файл плагина:
<?php
/*
Название плагина: My plugin
Описание:
Версия: 1.0
Автор: Pirate
*/
class MyPlugin
{
public function __construct()
{
// Добавление действия как для авторизованных, так и для неавторизованных пользователей
add_action('wp_ajax_myplugin_action', array($this, 'myplugin_handle_ajax'));
add_action('wp_ajax_nopriv_myplugin_action', array($this, 'myplugin_handle_ajax'));
// Добавление действия к wp_enqueue_scripts позволяет создавать nonces в функции обратного вызова
add_action('wp_enqueue_scripts', array($this, 'myplugin_load_scripts_styles'));
}
public function myplugin_load_scripts()
{
wp_enqueue_script('myplugin_scripts', plugins_url('myplugin_scripts.js'), null, '1.0', true);
$nonce = wp_create_nonce('ajax_validation');
wp_localize_script('myplugin_scripts', 'myplugin_data',
array(
'url' => admin_url('admin-ajax.php'),
'security' => $nonce,
'additional_data' => 'Все, что нужно отправить в JS'
)
);
}
public function myplugin_handle_ajax()
{
check_ajax_referer('ajax_validation', 'security');
// Все данные, которые вы отправили из JS, находятся в $_REQUEST
$dataFromJS = $_REQUEST['dataFromJS'];
// Здесь вы можете делать с ними все, что пожелаете - обрабатывать, отправлять другим методам и т.д.
$dataToSendBack = 'Данные, которые я возможно хочу отправить обратно в JS';
wp_send_json_success($dataToSendBack); //параметр является необязательным
}
//Создание экземпляра класса
$my_plugin = new MyPlugin();
myplugin_scripts.js
// Мне не нужно было оборачивать это в $(document).ready(),
// но это может быть необходимо в зависимости от последовательности выполнения вашего конкретного скрипта
$('#ajax_button').on('click', function () {
let ajax_data = {
action: 'myplugin_handle_ajax',
security: myplugin_data.secuirty,
dataFromJS: 'Все что я хочу отправить в PHP'
};
$.ajax({
url: myplugin_data.url,
method: 'POST',
data: ajax_data,
success: function (response) {
//необязательная обработка ответа
}
})
});
.
Ответ или решение
Конечно, давайте разберем, как передать переменную из JavaScript в PHP, используя контекст, предоставленный в описании задачи:
Как передать переменную из JavaScript в PHP и сохранить ее в $_SESSION
Для передачи данных из JavaScript в PHP, а затем их сохранения в сессии PHP ($_SESSION
), можно воспользоваться AJAX-запросами в комбинации с функциями WordPress. Вот пошаговый процесс для достижения этой цели.
1. Подготовка PHP и WordPress скриптов
В файле вашего плагина WordPress или в functions.php
вашей темы, выполните следующие действия:
- Подключите JavaScript-файл и локализуйте необходимые данные:
function myplugin_enqueue_scripts() {
wp_enqueue_script('myplugin_script', plugins_url('myplugin_script.js', __FILE__), array('jquery'), null, true);
$nonce = wp_create_nonce('myplugin_ajax_nonce');
wp_localize_script('myplugin_script', 'myplugin_data', array(
'ajax_url' => admin_url('admin-ajax.php'),
'security' => $nonce,
));
}
add_action('wp_enqueue_scripts', 'myplugin_enqueue_scripts');
- Создайте функцию обработки AJAX:
add_action('wp_ajax_myplugin_action', 'myplugin_handle_ajax');
add_action('wp_ajax_nopriv_myplugin_action', 'myplugin_handle_ajax');
function myplugin_handle_ajax() {
check_ajax_referer('myplugin_ajax_nonce', 'security');
session_start();
$dataFromJS = $_POST['dataFromJS'];
$_SESSION['my_data'] = $dataFromJS;
wp_send_json_success('Data stored in session');
}
2. Написание JavaScript для отправки данных
Добавьте следующий код в JavaScript-файл (myplugin_script.js
):
jQuery(document).ready(function($) {
$('#send_button').on('click', function() {
let dataToSend = {
action: 'myplugin_action',
security: myplugin_data.security,
dataFromJS: 'данные для передачи'
};
$.ajax({
url: myplugin_data.ajax_url,
type: 'POST',
data: dataToSend,
success: function(response) {
console.log('Ответ от PHP:', response);
},
error: function(error) {
console.error('Ошибка AJAX:', error);
}
});
});
});
Заключение
Таким образом, благодаря использованию AJAX-запросов, вы можете беспрепятственно передавать данные из JavaScript в PHP, и затем сохранять их в сессии для дальнейшего использования на других страницах вашего сайта WordPress. Этот подход предлагает гибкость и безопасность за счет использования nonce, что защищает от CSRF-атак.
Не забудьте проверить, что JavaScript и PHP-код взаимодействуют правильно, особенно удостоверившись, что ваш JavaScript-файл загружается на нужных страницах и что AJAX запросы корректно обрабатываются.