Wordpress 301在Jquery.post请求上移动永久响应

时间:2011-11-28 21:09:13

标签: jquery wordpress request

我已经失去了寻找解决问题的希望,希望有人可以帮助我。这是问题所在:

我有一个wordpress安装,带有一个名为wp_lojas的额外表(用于商店)。客户可以访问该网站,通过表格,放置他们的地址,并使用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”。

如果您不理解我尝试解释的内容或需要更多信息,请告知我们。

非常感谢。

3 个答案:

答案 0 :(得分: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类'wp-admin / admin-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

我希望有一天这个答案对某人有帮助。

答案 1 :(得分:0)

Wordpress会将您的AJAX请求合并到任何给定的PHP文件中。这对我来说都是黑魔法,所以有更好答案的人很快就会出现。但是,我只想说,您需要通过一个专门的脚本来管理您的AJAX请求,该脚本旨在适当地路由请求。默认情况下,这是通过ajax-admin.php完成的(或者是admin-ajax.php?)

我希望我有更多详细信息,但我想至少让你知道,在你进入太多圈子之前,你需要一种特殊的方式来处理Wordpress中自定义脚本的AJAX请求。

答案 2 :(得分: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');