如何通过位置更改来更改内容?

时间:2012-05-25 作者:user478

我必须开发一个网站使用wordpress有数千页。页面将具有相同的内容,但内容的位置将发生变化。例如,地点将是悉尼、墨尔本等。是否有任何方法可以管理虚拟页面?这些页面也必须在搜索引擎中建立索引。有谁能建议我以有效的方式做这件事吗?

提前感谢

1 个回复
SO网友:kaiser

理论上,由于Wordpress没有内置某种地理位置检测脚本,我们必须自己制作。由于此脚本是javascript,因此我们需要将生成的位置数据获取到php。然后,我们可以执行请求或向请求中添加一些内容。

现在,我将为您提供部分代码、一些解释和起点,它们将允许您构建插件(无需将此类逻辑构建到主题中)。

Javascript(&A);位置首先,我们需要一个能够进行检测的函数。有很多可能性。您可以在下面看到一种可能的解决方案。将其保存到一个文件中,您可以调用geo_detection.js 并将其保存到名为/js. (您也可以使用任何其他解决方案)。

/**
 * GLOBAL POSITION VAR
 */
var currentPosition = getCurrentPosition();
/**
 * Gets current position
 * 
 * @return mixed false/position obj
 */
function getCurrentPosition()
{
    // Current position
    if ( navigator.geolocation ) 
    {
        navigator.geolocation.getCurrentPosition ( 
            function( position ) 
            {
                return position;
            }
        );
    }
    return false;
}
如果用户不在移动设备上,此脚本将无法进行真正的检测,因为大多数提供商拒绝访问,但在大多数情况下,它足够准确,可以获取城市中心并了解国家。

将设备数据带到PHP:我们需要脚本来进一步处理数据,我们需要它在PHP中可用,否则我们无法发出DB请求(或与之交互)。

Gladly WP有一个在这种情况下我们可以(忽略)使用的功能:wp_localize_script();.

/**
 * Register Script
 */
function wpse53244_register_script()
{
    foreach ( array( \'geo_detection\', \'geo_ajax\' ) as $file )
    {
        wp_register_script( 
             $file
            ,trailingslashit( plugins_url( \'js\', __FILE__ ) )."/js/{$file}.js"
            ,array( \'json2\', \'jquery\' )
            ,filemtime( plugin_dir_path( __FILE__ )."/js/{$file}.js" )
        );
    }
}
add_action( \'admin_enqueue_scripts\', \'wpse53244_register_script\' );
/**
 * Enqueue & Localize our script
 */
function wpse53244_enqueue_script()
{
    wp_enqueue_script( \'geo_detection\' );
    wp_enqueue_script( \'geo_ajax\' );
    wp_localize_script( 
         \'geo_ajax\'
        ,\'geo_ajax_object\'
        ,array( 
             \'ajaxurl\'     => admin_url( \'admin-ajax.php\' )
            ,\'_ajax_nonce\' => wp_create_nonce( \'geo_ajax_nonce\' )
            ,\'action\'      => \'geo_ajax\'
            ,\'location\'    => \'\'
         ) 
    );
}
add_action( \'admin_enqueue_scripts\', \'wpse53244_enqueue_script\' );
将设备数据引入PHP:处理数据首先,我们想使用另一个名为geo_ajax.js 需要在我们的/js 文件夹。这个jQuery.ajax() 下面的函数包含所有种类或任务的处理程序/函数:成功、错误和完成。我们现在只使用成功。

jQuery( document ).ready( function($) 
{
    $.ajax( {
         type:     \'POST\'
        ,url:      geo_ajax_object.ajaxurl
        ,data:     currentPosition
        ,success:  function( response, status, request )
         {
            return currentPosition;
         }
        ,error:    function( jqxhr , settings , exception )
         {
            return false;
         }
        ,complete: function( jqxhr, status )
         {
            return false;
         }
    } );
} );
然后,我们将添加php AJAX请求。这也需要一些安全检查。

/**
 * AJAX Callback
 */
function wpse53244_do_location_request()
{
    header( "Content-Type: application/json" );

    // Valid request type?
    wpse53244_is_save_allowed( $_POST );

    // Get our location
    $location = $_POST[\'data\'];

    // Actually processing the data:
    // This here completely depends on how you implement the localized content.
    // You could add additional meta boxes/custom fields, etc.
    // Whatever you can imagine or code...

    // Then you can here intercept the query with the \'posts_clauses\' or
    // \'posts_where\' filter and add the additional meta data to the query

    // Feedback
    echo json_encode( array(
         \'success\' => true
        ,\'error\'   => false
    ) );
    exit();
}
add_action( "wp_ajax_geo_ajax", \'wpse53244_do_location_request\' );

/**
 * Valid request?
 */
function wpse53244_is_save_allowed( $data )
{
    // Safety check
    check_ajax_referer( \'geo_ajax_nonce\', \'_ajax_nonce\' );

    $deny = json_encode( array(
         \'success\' => false
        ,\'error\'   => true
    ) );

    // AJAX autosave
    if ( 
        defined( \'DOING_AUTOSAVE\' ) 
        AND DOING_AUTOSAVE 
    )
        exit();

    // Some other request
    if ( 
        ! isset( $_POST[\'action\'] )
        OR \'geo_ajax\' !== $_POST[\'action\']
        )
    {
        echo $deny;
        exit();
    }
}
综上所述,你可以从上面看到,有很多事情需要考虑。我所展示的↑ 这仅仅是一个起点,因为有几十条路线可以走,编写一个完整的插件不仅仅是一个答案的内容。好消息是:您现在有了一个安全的环境来开始结束数据库调用。但实际的解决方案取决于您想要如何实现它。

结束