理论上,由于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();
}
}
综上所述,你可以从上面看到,有很多事情需要考虑。我所展示的↑ 这仅仅是一个起点,因为有几十条路线可以走,编写一个完整的插件不仅仅是一个答案的内容。好消息是:您现在有了一个安全的环境来开始结束数据库调用。但实际的解决方案取决于您想要如何实现它。