Как передать переменную в действие wp_ajax?

14 апр. 2015 г., 21:54:46
Просмотры: 15.7K
Голосов: 3

Я пишу плагин, который получает данные из внешнего API и вставляет их в тему bbPress. Вот пример кода:

function bbp_ajax() {
    $topic_id = bbp_get_topic_id();
    $the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true);
    $nonce = wp_create_nonce( 'theNonce' );

    // jQuery AJAX код, действия bbpAjax...
}
add_action ( 'bbp_template_before_replies_loop', 'bbp_ajax');

function get_ajax_content() {
    check_ajax_referer( "theNonce" );
    $api_url = get_option( 'jifbs_url' );
    $fullurl = $api_url.$the_issue_key;

    $username = get_option( 'jifbs_username' );

    // Затем я получаю данные через cURL и вывожу их. Но мне нужен $the_issue_key для авторизации в API
}

add_action( 'wp_ajax_bbpAjax', 'get_ajax_content' );
add_action( 'wp_ajax_nopriv_bbpAjax', 'get_ajax_content' );

Я не могу понять, как передать $the_issue_key в функцию get_ajax_content. Я пробовал делать её глобальной (ужас), но она всегда возвращает null.

$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true); выполненная в функции get_ajax_content возвращает null.

Есть ли что-то специфичное в действии wp_ajax, что мне нужно знать - или я упускаю что-то очевидное?

0
Все ответы на вопрос 1
2

Вам нужно поместить значение переменной на страницу, чтобы JavaScript мог передать его обратно в PHP с помощью AJAX. AJAX-функции представляют собой полностью отдельную "загрузку страницы", поэтому даже если вы сделаете переменную глобальной, это не сработает. Лучший способ сделать это — использовать функцию wp_localize_script (https://codex.wordpress.org/Function_Reference/wp_localize_script).

Вот полный пример того, как это можно реализовать:

// Сначала подключаем ваш JavaScript в WordPress
function your_prefix_enqueue_scripts(){

    // Подключаем ваш JavaScript (предполагается, что файл JavaScript находится в директории "includes/js" вашего плагина)
    wp_enqueue_script( 'your_unique_js_name', plugins_url('js/yourjavascriptfile.js', dirname(__FILE__) ), array( 'jquery' ) );

    // ИЛИ (проще, но не рекомендуется)  
    wp_enqueue_script( 'your_unique_js_name', 'http://domain.com/myjavascriptfile.js', array( 'jquery' ) );

    // Здесь мы создаем объект JavaScript под названием "youruniquejs_vars". Мы можем обращаться к любой переменной в массиве, используя youruniquejs_vars.название_подпеременной
    wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', 
        array(
            // Чтобы использовать эту переменную в JavaScript, обращайтесь к "youruniquejs_vars.ajaxurl"
            'ajaxurl' => admin_url( 'admin-ajax.php' ),
            // Чтобы использовать эту переменную в JavaScript, обращайтесь к "youruniquejs_vars.the_issue_key"
            'the_issue_key' => $the_issue_key,
        ) 
    );  
}
add_action( 'wp_enqueue_scripts', 'your_prefix_enqueue_scripts' );

// Это ваша функция обратного вызова для AJAX
function your_ajax_callback_function_name(){

    // Получаем переданные данные 
    $the_issue_key = $_POST["the_issue_key"];

    // Здесь выполняем необходимые действия

    // Создаем массив, который отправим обратно в JavaScript
    $array_we_send_back = array( 'test' => "Test" );

    // Обязательно кодируем вывод в JSON, так как именно этого ожидает JavaScript
    echo json_encode( $array_we_send_back );

    // Обязательно завершаем выполнение после вывода данных AJAX.
    die(); 
}
add_action( 'wp_ajax_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );
add_action( 'wp_ajax_nopriv_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );

Затем в вашем JavaScript-файле выполните что-то вроде этого:

jQuery(document).ready(function($){

    /**
     * При клике на триггер AJAX
     */
    $( document ).on( 'click', '.my-button', function(event){

        event.preventDefault();

        // Используем AJAX для выполнения действия...
        var postData = {
            action: 'your_ajax_callback_function_name',
            the_issue_key: youruniquejs_vars.the_issue_ke,
        }

        // Отправка AJAX-запроса
        $.ajax({
            type: "POST",
            data: postData,
            dataType:"json",
            url: youruniquejs_vars.ajaxurl,
            // Срабатывает при успешном возврате AJAX-запроса с валидным JSON
            success: function (response) {
                alert( response.test );
            }
            // Срабатывает при возврате AJAX-запроса с невалидным JSON
        }).fail(function (data) {
            console.log(data);
        }); 
    });
});
14 апр. 2015 г. 22:23:16
Комментарии

Почти готово, большое спасибо :) Можешь уточнить один момент? В callback-функции, допустим $the_issue_key = "12345" - у меня не получается передать это значение в массив youruniquejs_vars, он всегда возвращает null.

Finne Finne
15 апр. 2015 г. 17:50:28

Тебе нужно задать значение "12345" при вызове "wp_localize_script"

    `wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', array('ajaxurl' => admin_url( 'admin-ajax.php' ),'the_issue_key' => "12345",) );`

(Извини за форматирование... не получается сделать его "красивым")

Phil Johnston Phil Johnston
15 апр. 2015 г. 17:56:07