Как передать переменную JS в PHP?

Вопрос или проблема

Я получаю данные из 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 запросы корректно обрабатываются.

Оцените материал
Добавить комментарий

Капча загружается...