Интеграция PHP в Javascript для отображения маркеров на карте с помощью Google API – проблема с wp_localize

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

Я бы отображал маркеры Google карты на пользовательском сайте с помощью Google API maps. Я делаю все, как в этом посте: Интеграция PHP в Javascript для отображения маркеров карты с Google API

Но консоль выдает мне ошибку, я не знаю, где я могу искать ошибку.

(index):774 Uncaught (in promise) ReferenceError: storeData is not defined
at initMap ((index):774)
at js?key=AIzaSyAg-GBNbwLWCxiN-UI-0COkr1bgAKpXjQU&callback=initMap:123
at js?key=AIzaSyAg-GBNbwLWCxiN-UI-0COkr1bgAKpXjQU&callback=initMap:123

Я думаю, WordPress сначала пытается использовать wp_localize, затем загружает jquery. Или WordPress не знает, как подключить jquery-core с jquery CDN.

Код моего пользовательского сайта:

<?php /* Template Name: Mapy */ ?>

<?php get_header(); ?>

<?php
    $storeData = [];
        $args = array( 'post_type' => 'product');
        $loop = new WP_Query( $args );

        foreach ($loop->posts as $post){
            $storeData[] = [
                'title' => apply_filters('the_title', $post->post_title),
                'lat'   => get_field('gps_dlugosc'),
                'long'  => get_field('szerokosc_gps')
            ];
        }
    wp_localize_script('jquery-core', 'storeData', $storeData);

?>

<section style="padding-top:70px;">
    <div id="map"></div>
</section>

<script>
    // Инициализация и добавление карты
    function initMap() {
      // Положение Uluru
      var poznan = {lat: 52.402684, lng: 16.9213905};
      var j = storeData.length;
      //console.log(storeData.length);    
      // Карта, центрированная на Uluru
      var map = new google.maps.Map(
          document.getElementById('map'), {
              zoom: 15,
              center: poznan,
              zoomControl: true,
              mapTypeControl: true,
              scaleControl: false,
              streetViewControl: false,
              rotateControl: false,
              fullscreenControl: true,
          }
      );

        for (var i=0; i<5; i++) {
            var marker=new google.maps.Marker({
                position: new google.maps.LatLng({lat: storeData[i].lat, lng: storeData[i].long}),
                map: map,
                title: storeData[i].title
            });
        }
    }

</script>

<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAg-GBNbwLWCxiN-UI-0COkr1bgAKpXjQU&callback=initMap"></script>

<?php get_footer(); ?>

Спасибо за помощь, извините, я не очень хорошо знаю английский.

Хорошо, в вашем коде есть несколько недоразумений…

1. Вы должны локализовать свой собственный скрипт, а не встроенный.

Вы не можете быть уверены, какие скрипты будут использоваться на сайте. В вашем случае вы локализуете скрипт jquery-core, но не гарантируете, что этот скрипт зарегистрирован на сайте.

Это означает, что ваша локализационная переменная может не быть включена на вашей странице (и в вашем случае это так).

2. Вы должны локализовать скрипты до их вывода.

Ваш код локализует скрипт непосредственно в шаблоне. Было бы намного лучше, если бы вы сделали это внутри functions.php.

Но есть еще большая проблема – вы локализуете этот скрипт после вызова get_header(). Это означает, что скрипт может уже быть выведен, поэтому он не будет локализован…

Как это исправить?

1. Переместите ваш JS-код:

function initMap() {
    ...  
}

в какой-нибудь внешний файл типа my-map-script.js.

2. Регистрируйте и локализуйте его правильно

function my_enqueue_map_scripts() {

    if ( is_page(123) ) { // вы можете зарегистрировать его только для данной страницы, просто удалите этот if, если он должен быть доступен глобально

        wp_enqueue_script( 'my-map-script', get_template_directory_uri() . '/js/ma-map-script.js', array(), '1.0.0', true );

        $storeData = [];
        $args = array( 'post_type' => 'product');
        $loop = new WP_Query( $args );

        foreach ($loop->posts as $post){
            $storeData[] = [
                'title' => apply_filters('the_title', $post->post_title),
                'lat'   => get_field('gps_dlugosc'),
                'long'  => get_field('szerokosc_gps')
            ];
        }
        wp_localize_script('my-map-script', 'storeData', $storeData);
    }
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_map_scripts' );

Ответ или решение

Интеграция PHP в JavaScript для отображения маркеров на карте с помощью Google API: Решение проблемы с wp_localize

Интеграция PHP и JavaScript для отображения маркеров на карте Google через API может вызвать ряд проблем. Среди них — ошибка неопределенной переменной, как в вашем случае с storeData. Давайте рассмотрим, как можно эффективно решить эту проблему и обеспечить корректную работу вашего кода.

1. Локализация скриптов: Проблема и решение

Прежде всего, проблемы возникают, когда вы пытаетесь локализовать встроенный скрипт, такой как jquery-core, без уверенности в его подключении. Это ведет к тому, что переменная storeData не передается в JavaScript, что и вызывает ошибку.

Чтобы исправить это, важно локализовать собственный, самописный скрипт, гарантируя, что он будет загружен и переменные в него переданы вовремя.

2. Перенос скрипта в отдельный файл JavaScript

Сначала перенесите код JavaScript для работы с картой в отдельный файл, например my-map-script.js. Это повысит читаемость и поддерживаемость вашего проекта. Вот базовая структура вашего JS скрипта:

function initMap() {
    var poznan = {lat: 52.402684, lng: 16.9213905};
    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 15,
        center: poznan,
        zoomControl: true,
        mapTypeControl: true,
        scaleControl: false,
        streetViewControl: false,
        rotateControl: false,
        fullscreenControl: true,
    });

    for (var i = 0; i < storeData.length; i++) {
        var marker = new google.maps.Marker({
            position: new google.maps.LatLng({lat: storeData[i].lat, lng: storeData[i].long}),
            map: map,
            title: storeData[i].title
        });
    }
}

3. Правильная регистрация и локализация скриптов

В файле functions.php зарегистрируйте и локализуйте ваш скрипт. Это позволит вам правильно передать переменную storeData из PHP в JavaScript.

function my_enqueue_map_scripts() {
    if (is_page_template('page-mapy.php')) { // применяйте условие, если необходимо
        wp_enqueue_script('my-map-script', get_template_directory_uri() . '/js/my-map-script.js', array(), '1.0.0', true);

        $storeData = [];
        $args = array('post_type' => 'product');
        $loop = new WP_Query($args);

        foreach ($loop->posts as $post){
            $storeData[] = [
                'title' => apply_filters('the_title', $post->post_title),
                'lat'   => get_field('gps_dlugosc', $post->ID),
                'long'  => get_field('szerokosc_gps', $post->ID)
            ];
        }
        wp_localize_script('my-map-script', 'storeData', $storeData);
    }
}
add_action('wp_enqueue_scripts', 'my_enqueue_map_scripts');

Заключение

Следуя данным шагам, вы сможете избежать ошибок с неопределенной переменной и обеспечить корректное отображение маркеров на карте Google. Важно организовывать код таким образом, чтобы скрипты и данные передавались своевременно и структурировано. Это не только устранит текущие ошибки, но и упростит дальнейшую разработку и поддержку вашего проекта.

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

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