Первая публикация в StackOverflow. (благодарности приветствуются, чтобы помочь мне войти в сообщество)
Несмотря на то, что я новичок в кодировании в целом, я смог выполнить следующие шаги в Wordpress благодаря очень самому Заку Гордону. полезное видео https://youtu.be/Z0Jw226QKAM?t=216 и демонстрационные файлы https://github.com/zgordon/wordpress-ajax, следуя изложенным им шагам:
- Передача Nonce и URL AJAX через wp_localize_script
- Выполнение вызова AJAX с Nonceи URL в JavaScript
- Подключите PHP-функцию AJAX к Wordpress AJAX-крюкам
- Используйте 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' );
Любая помощь по поводу того, что попробовать дальше, очень ценится!