2011-11-28 42 views
5

我失去了我的希望找到解决我的问题,希望有人可以帮助我在这里。这里的问题:Wordpress 301移动永久响应Jquery.post请求

我有一个名为wp_lojas(用于商店)的额外表wordpress安装。客户可以访问该网站并通过表单,放置地址,然后使用Google Maps API查找附近的商店。

当用户提交表单时,我会验证他们的地址位置(纬度/经度),并通过SQL查询查找最近的商店。

表单通过ajax请求($ .post())将参数(纬度/经度/半径)发送到我的主题文件夹内的php文件(/wp-content/themes/accessorize/dadosLojas.php )并且该文件使用找到的商店构建XML。

一切工作正常离线,在我的本地机器上。在线我得到一个答案“301永久移动”。如果你们安装了Firebug并想尝试,测试链接是http://www.colletivo.com.br/accessorize/,表单位于页面的页脚上。如果你们想要来自巴西的地址,请尝试“Rua Vicente Leporace,1534”。

如果您不明白我试图解释什么,或需要更多信息,请告诉我。

非常感谢。

回答

1

问题解决了Greg Pettit给出的提示!

我不知道Wordpress拦截Ajax请求的可能性,我认为它与htaccess将请求重定向到不存在的URL有关。

知道了这一点,我研究了如何使用Wordpress的功能,使Ajax请求,这里是解决方案:

在我的主题的functions.php中:

// Hooks wp_ajax that points to the function that builds the XML Stores 
add_action('wp_ajax_procura_lojas','procuraLojas'); // Unlogged User 
add_action('wp_ajax_nopriv_procura_lojas','procuraLojas'); // Logged User 

// Function that Builds Stores XML 
function procuraLojas() { 

    global $wpdb; 

    // Retrieve $_POST informattion coming from jQuery.post 
    $lat = $_POST["latitude"]; 
    $lon = $_POST["longitude"]; 
    $raio = $_POST["raio"]; 

    // Query wp_lojas and Build XML 
    $consulta = $wpdb->get_results(sprintf("SELECT * , (3959 * acos(cos(radians('%s')) * cos(radians(latitude)) * cos(radians(longitude) - radians('%s')) + sin(radians('%s')) * sin(radians(latitude)))) AS distancia FROM wp_lojas HAVING distancia < '%s' ORDER BY distancia", 
    mysql_real_escape_string($lat), 
    mysql_real_escape_string($lon), 
    mysql_real_escape_string($lat), 
    mysql_real_escape_string($raio))); 

    $dom = new DOMDocument("1.0", "utf-8"); 
    $no = $dom->createElement("lojas"); 
    $parnode = $dom->appendChild($no); 

    header("Content-type: text/xml"); 

    foreach ($consulta as $loja){ 

     $no = $dom->createElement("loja"); 
     $novono = $parnode->appendChild($no); 

     $novono->setAttribute('nome',   $loja->nome); 
     $novono->setAttribute('lat',   $loja->latitude); 
     $novono->setAttribute('lon',   $loja->longitude); 
     $novono->setAttribute('telefone',  $loja->telefone); 
     $novono->setAttribute('email',   $loja->email); 
     $novono->setAttribute('endereco',  $loja->endereco); 
     $novono->setAttribute('numero',   $loja->numero); 
     $novono->setAttribute('complemento',  $loja->complemento); 
     $novono->setAttribute('bairro',   $loja->bairro); 
     $novono->setAttribute('cidade',   $loja->cidade); 
     $novono->setAttribute('estado',   $loja->estado); 
     $novono->setAttribute('cep',   $loja->cep); 
     $novono->setAttribute('distancia',  $loja->distancia); 

    } 

    // Print XML and Exit 
    echo $dom->saveXML(); 
    exit; 

} 

在WordPress的头,我把:

<script type='text/javascript'> 
/* <![CDATA[ */ 
var MyAjax = { ajaxurl: "<?php bloginfo('url'); ?>/wp-admin/admin-ajax.php" }; // Build the Link to admin-ajax.php/Javascript Global Variable 
/* ]]> */ 
</script> 

当用户提交表单,我发送POST AJAX的类的WordPress是负责这可湿性粉剂管理员/管理员-ajax.php“:

jQuery.post(
    MyAjax.ajaxurl, // Link to the file 'wp-admin/admin-ajax.php' responsible for handling ajax requisitions 
    { 
     action : 'procura_lojas', // Name used in the hook 'wp_ajax_procura_lojas' 
     latitude : center.lat(), // Latitude Parameter 
     longitude : center.lng(), // Longitude Parameter 
     raio : raio // Radius Parameter 
    }, 
    function(data) { // Callback 

     // Retrieve all nodes called 'loja' and put it in the map 
     var markers = data.documentElement.getElementsByTagName("loja"); 
     for (var i = 0; i < markers.length; i++) { 
      var dados = []; 
      dados["nome"] = markers[i].getAttribute('nome'); 
      dados["estado"] = markers[i].getAttribute('estado'); 
      dados["cidade"] = markers[i].getAttribute('cidade'); 
      dados["bairro"] = markers[i].getAttribute('bairro'); 
      dados["endereco"] = markers[i].getAttribute('endereco'); 
      dados["numero"] = markers[i].getAttribute('numero'); 
      dados["complemento"] = markers[i].getAttribute('complemento'); 
      dados["cep"] = markers[i].getAttribute('cep'); 
      dados["telefone"] = markers[i].getAttribute('telefone'); 

      var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute('lat')), parseFloat(markers[i].getAttribute('lon'))); 
      var marker = createMarker(markers[i].getAttribute("name"), latlng, dados); 
     } 
    } 
); 

就是这样!感谢Greg Pettit澄清我的想法。

一个链接,助我也为5 tips for using ajax in wordpress

我希望这个答案可以帮助别人一天。

0

Wordpress将选择您的AJAX请求给任何给定的PHP文件。这对我来说都是黑魔法,所以有更好答案的人很快就会出现。尽管如此,你需要通过一个特殊的脚本管理你的AJAX请求,这个脚本被设计用来适当地路由请求。默认情况下,这是用ajax-admin.php完成的(或者是admin-ajax.php?)

我希望我有更多的非正式的细节,但我想至少让你知道,很多圈子,您需要在Wordpress中处理AJAX对自定义脚本的请求。

+0

我明白了!好吧,我想我可以继续寻找那条路。谢谢 –

0

我今天有同样的奇怪问题,但只影响用户角色中的用户。万恶的根源是一个小功能,它应该防止用户访问后端。

function preventAccessToBackend() {  
    if(!current_user_can('edit_posts')) { 
     wp_redirect(home_url()); exit; 
    } 
} 
add_action('admin_init', 'preventAccessToBackend'); 

正如你所看到的,在功能连接到admin_init挂钩,因此对管理员执行,也一个AJAX调用。

该解决方案很简单。在重定向之前检查它是否是AJAX请求。

function preventAccessToBackend() {  
    if (defined('DOING_AJAX') && DOING_AJAX) { return; } 

    if(!current_user_can('edit_posts')) { 
     wp_redirect(home_url()); exit; 
    } 
} 
add_action('admin_init', 'preventAccessToBackend');