【问题标题】:Include a JavaScript containing Php in WordPress在 WordPress 中包含一个包含 PHP 的 JavaScript
【发布时间】:2016-06-03 15:41:07
【问题描述】:

我目前正在开发一个交互式地图(使用 OpenStreetMap 和 OpenLayers),它可以在本地网站上按我的意愿工作(请参阅此屏幕截图:http://i.imgur.com/KZx5vdZ.jpg)。

我的代码使用 Html、Php 和 JavaScript。

我希望将此交互式地图集成到我的 WordPress 网站的页面中。对于 PHP 部分,很简单,我使用简码技术。我已经测试过了,它可以工作,包括与数据库的通信。

但是,地图本身是一个 JavaScript 脚本。我很想使用“enqueue_script”技术,但问题是我的脚本包含一些 Php,用于传递一个包含基本信息的 json 数组,以便在地图上放置标记。

问题是:是否可以在 WordPress 页面上包含此脚本(与我包含 Php 的页面相同),如果可以,我该怎么做?

这是(简化的)Php 代码。它有效,但它可能会帮助你们理解我想要做什么:

function register_shortcodes(){
    add_shortcode('fidu-display-map', 'display_map');
}
add_action( 'init', 'register_shortcodes');

function display_map(){

    generate_html();
    get_search_results();
    generate_map();
}

function generate_html(){

    echo "<div id=\"basicMap\" style=\"width: 100%;
            height: 100%; coordinates
            margin: 0;\"></div>";
}

function get_search_results(){

    global $wpdb;
    global $result;

    $result = $wpdb->get_results("SELECT * FROM search_results;", ARRAY_A);
}

function generate_map(){
    global $result;
    $res_lon = array();
    //[... other declarations]
    $res_link = array();
    foreach ($result as $row) {
        array_push($res_lon, $row['lon']);
        //[... other pushs]
        array_push($res_link, $row['societyLink']);
    }
    $search_result = array(
        $res_lon,
        //[... other merging]
        $res_link
    );
}

现在这里是 JavaScript,其中的 Json 部分给我带来了一些问题,因为它依赖于上面的 Php:

<script>

    document.addEventListener("DOMContentLoaded", function()
    {
        init();
    }, false);

    var map;

    function init(){
        map = new OpenLayers.Map('basicMap');

        var mapnik = new OpenLayers.Layer.OSM();
        var fromProjection = new OpenLayers.Projection("EPSG:4326");   // Transform from WGS 1984
        var toProjection   = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
        var centerPosition = new OpenLayers.LonLat(-85.00,38.00).transform( fromProjection, toProjection);
        var zoom           = 5;

        map.addLayer(mapnik);

        map.setCenter(centerPosition, zoom);


        addPoints(map);
    }

    function addPoints(map){
        var fromProjection = new OpenLayers.Projection("EPSG:4326");   // Transform from WGS 1984
        var toProjection   = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection
        //get positions from the search result from the database
        var positions = <?php echo json_encode($search_result) ?>;
        var infos = <?php echo json_encode($search_result) ?>;

        var coordinates = new Array();
        var pointStyle = {  externalGraphic: 'images/marker-blue.png',
            graphicWidth: 21,
            graphicHeight: 25,
            graphicYOffset: -24};

        // Layer
        var pointsLayer = new OpenLayers.Layer.Vector("Points Layer");


        // Add points to the layer
        for(i=0;i<positions[0].length;i++){
            //coordinates.push(new OpenLayers.Geometry.Point(positions[0][i], positions[1][i]).transform(fromProjection, toProjection));
            var pointFeature = new OpenLayers.Feature.Vector(
                new OpenLayers.Geometry.Point(positions[0][i], positions[1][i]).transform(fromProjection, toProjection),
                {description : infos[2][i]+'<br>'+infos[3][i]+'<br>'+infos[4][i]+' - '+infos[5][i]+'<br>'+infos[6][i]+'<br>Link: <a href="'+infos[7][i]+'">'+infos[7][i]+'</a>'},
                pointStyle
            );
            pointsLayer.addFeatures(pointFeature);
        }

        map.addLayer(pointsLayer);

        //Add a selector control to the vectorLayer with popup functions
        var controls = {
            selector: new OpenLayers.Control.SelectFeature(pointsLayer, { onSelect: createPopup, onUnselect: destroyPopup })
        };

        map.addControl(controls['selector']);
        controls['selector'].activate();
    }

    function createPopup(feature) {
        feature.popup = new OpenLayers.Popup.FramedCloud("pop",
            feature.geometry.getBounds().getCenterLonLat(),
            null,
            '<div class="markerContent">'+feature.attributes.description+'</div>',
            null,
            true,
            function() { controls['selector'].unselectAll(); }
        );
        map.addPopup(feature.popup);
    }

    function destroyPopup(feature) {
        feature.popup.destroy();
        feature.popup = null;
    }

</script>

【问题讨论】:

    标签: javascript php json wordpress


    【解决方案1】:

    您可以做的就是将这些变量放在您的 javascript 函数之外。因此,例如您可以将其放在&lt;head&gt; 中,例如:

    var mapPoints = {
        positions: <?php echo json_encode($search_result) ?>,
        infos: <?php echo json_encode($search_result) ?>
    }
    

    现在,如果您创建一个 javascript 文件并使用 enqueue_scripts 将其添加到您的页面,您仍然可以在您的函数中访问 mapPoints

    【讨论】:

    • 我不确定...如果我将这些变量放在 中,我会遇到同样的问题,因为我不能像那样将它们提供给 WordPress,可以吗?
    • 您不能在 .js 文件中组合 php 和 javascript。但是,您可以将这些变量放在头部(是的,您不能为此使用 enqueue_scripts),但是这样,您的 javascript 的所有其他部分都可以进入一个简单的 .js 文件,您可以使用 enqueue_scripts 将其添加到你的页面。这很好,因为实际的逻辑在一个单独的 javascript 文件中,而 head 中的变量是 php 和 javascript 代码之间的“桥梁”,只有那个被提取到 head 中。
    • 好的,我现在明白了,感谢您的回答。但是,我将它集成到 WordPress 中,这意味着标题已经完成。我的简码放在专用于内容的
      中。您认为我也可以将这些变量放入
      中吗?
    • 如果这些变量高于使用 enqueue_scripts 的实际 javascript 文件,那么它们将像在头部一样可用。
    • 这比我预期的要复杂(因为我的代码中还有其他问题),但现在我设法让一切正常工作。这个特定问题的解决方案正是您所说的。非常感谢您的帮助!
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签