После передачи jQuery Ajax в PHP в Wordpress, как обновить глобальную переменную перед использованием в другой функции (без использования async = false)? - PullRequest
0 голосов
/ 25 октября 2019

Первая публикация в StackOverflow. (благодарности приветствуются, чтобы помочь мне войти в сообщество)

Несмотря на то, что я новичок в кодировании в целом, я смог выполнить следующие шаги в Wordpress благодаря очень самому Заку Гордону. полезное видео https://youtu.be/Z0Jw226QKAM?t=216 и демонстрационные файлы https://github.com/zgordon/wordpress-ajax, следуя изложенным им шагам:

  1. Передача Nonce и URL AJAX через wp_localize_script
  2. Выполнение вызова AJAX с Nonceи URL в JavaScript
  3. Подключите PHP-функцию AJAX к Wordpress AJAX-крюкам
  4. Используйте JavaScript для обработки ответа AJAX

Хотя я могу вернуть ожидаемоерезультат с ответом AJAX (который я могу распечатать на консоль), и теперь я могу получить значение для передачи другой функции, я не могу обновить значение заранее, передав его другим функциям.

Основано на других разговорах StackOverflow ( JQuery - Сохранение ответа ajax в глобальную переменную ). Я думаю, что это, вероятно, проблема с Asynchronous vСинхронный вызов AJAX. Однако я также читал, что установку "async: false" следует избегать любой ценой, и на данный момент она устарела (и не помогла, когда я пытался), поэтому я пытаюсь найтиправильный способ передачи этой переменной из одной функции в другую. Ответы, которые я прочитал, не были специфичны для Wordpress, и я не мог решить их самостоятельно.

Цель довольно проста: получить $ (окно) .height () используя AJAX, сохраняйте как переменную, передавайте переменную в другую функцию в PHP, которая преобразует эту переменную и регулирует высоту карты. Плагин (hook: storymap_heights ).

Для начала: в настоящее время я просто пытаюсь заставить это работать с начальной загрузкой страницы, но мне также было бы любопытно, можно ли перезапускать функции каждый раз, когда размер окна браузера изменяется?

Следующий код приближает меня: мне нужно дважды обновить глобальную переменную $ heights {и / или " get_option ('jsforwp_heights') "}, чтобы обновить и правильно установить«новый» размер окна браузера (так что, похоже, переменная хранится, но только после того, как она хотя бы раз пройдёт). Код в настоящее время хранится в плагине Wordpress Snippets, но должен работать так же, как и в Functions.php:

<?PHP

global $heights;
if ( null == $heights  ) {
  add_option( 'jsforwp_heights', 100 );
}
$heights = get_option( 'jsforwp_heights' );

function my_theme_scripts() {
    wp_enqueue_script( 'my-great-script', get_template_directory_uri() . '/assets/js/my-great-script.js', array( 'jquery' ), '1.12.4', true );
    wp_localize_script(
        'my-great-script',
        'jsforwp_globals',
        [
            'ajax_url' => admin_url('admin-ajax.php'),
            'total_heights' => get_option('jsforwp_heights'),
            'nonce' => wp_create_nonce('nonce_name')
        ]
    );
}
add_action( 'wp_enqueue_scripts', 'my_theme_scripts' );

function screen_height_is(){
    check_ajax_referer('nonce_name');
    global $heights;
    $heights = $_POST['height'];
    update_option('jsforwp_heights',$heights);
//  set_map_height($heights);  //test
    $response['success'] = true;
    $response['height'] = $heights;     
    $response = json_encode($response);
    echo $response;
    wp_die();
}

add_action('wp_ajax_screen_height_is','screen_height_is',1);
add_action( 'wp_ajax_nopriv_screen_height_is', 'screen_height_is',1 );

function set_map_height(){
            global $heights;
            $testA = get_option('jsforwp_heights');  
            $testB = "px";
            $height = $testA. $testB;
            echo $height;
            return $height; 
            }
add_filter('storymaps_heights','set_map_height',10);    

//tests for function above
  //function set_map_height($heights){ 
  //$testA = '300'; //static option
  //$testA = $heights; //works with same loading delay problem
  //$testA = $response['height']; //doesn't work even if $response set as global

Я попытался вложить функции без успеха и вызвать set_map_height ($ heights) изв функции screen_height_is () безуспешно. Я также попытался установить #Priority в add_action и add_filter (1 для add_action, 10 для add_filter), чтобы попытаться заставить их ждать запуска, но это также не выглядит правильным.

Следующий код хранится в моемjs файл: my-great-script.js:

jQuery(document).ready(function($){
    var myResponse;
    $.ajax({
        type: 'post',
        dataType: 'json',
        url: jsforwp_globals.ajax_url,
        async: false,
        data: {
            action       : 'screen_height_is',
            _ajax_nonce  : jsforwp_globals.nonce,
            width        : $(window).width(),
            height       : $(window).height(),
            screen_width : screen.width,
            screen_height: screen.height
        },
        success: function( response ) {
 //      if( 'success' == response) {
         if( response['success'] == true) {
            alert("Something went right");
         }
         else {
            alert("Something went wrong");
         }
        }
    })
    .done(function(response) {
        console.log(response);
    })
    .fail(function(error) {
        alert(error);
    })   
    .always(function() {
        console.log("complete");
    });
});

Печать журнала консоли:

{высота: "598", успех: true}

завершено

Мне немного непонятно, нужно ли / как модифицировать обратный вызов Success для достижения моей общей цели? Или если wp_enqueue_script () зависимости нужно изменить?

В случае, если это поможет, следующий фильтр в PHP подключается к storymaps-core. php file:

add_filter('storymaps_heights','set_map_height',10);

Где находится следующее wp_enqueue_script :

function storymap_external_resources() {
    wp_enqueue_style( 'storymap-stylesheet', 'https://cdn.knightlab.com/libs/storymapjs/latest/css/storymap.css' );
    wp_enqueue_script( 'storymap-javascript', 'https://cdn.knightlab.com/libs/storymapjs/latest/js/storymap-min.js', array(), '1.0.0', false );
}
add_action( 'wp_enqueue_scripts', 'storymap_external_resources' ); 

Любая помощь по поводу того, что попробовать дальше, очень ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...