【问题标题】:Wordpress 301 Moved Permanently response on Jquery.post requestWordpress 301 Moved Permanently 响应 Jquery.post 请求
【发布时间】:2011-11-28 21:09:13
【问题描述】:

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

我有一个 wordpress 安装,带有一个名为 wp_lojas 的额外表(用于商店)。客户可以访问该网站并通过表格输入他们的地址,然后使用 Google Maps Api 找到他们附近的商店。

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

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

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

如果您不明白我试图解释的内容,或者需要更多信息,请告诉我。

非常感谢。

【问题讨论】:

    标签: jquery wordpress request


    【解决方案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>
    

    当用户提交表单时,我为负责它的 Wordpress 类发送一个 POST ajax '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

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

    【讨论】:

      【解决方案2】:

      我今天遇到了同样奇怪的问题,但只影响了订阅者角色的用户。万恶之源是一个小功能,它应该阻止订阅者访问后端。

      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');
      

      【讨论】:

        【解决方案3】:

        Wordpress 会将您的 AJAX 请求合并到任何给定的 PHP 文件。这对我来说都是黑魔法,所以很快就会有人有更好的答案。不过,只要说您需要通过一个特殊的脚本来传递您的 AJAX 请求就足够了,该脚本旨在适当地路由请求。默认情况下,这是使用 ajax-admin.php 完成的(或者是 admin-ajax.php?)

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

        【讨论】:

        • 我明白了!好吧,我想我可以继续寻找那条路。谢谢
        猜你喜欢
        • 2014-12-30
        • 1970-01-01
        • 2017-02-28
        • 2014-07-05
        • 2017-06-13
        • 2018-05-08
        • 2020-10-07
        • 1970-01-01
        • 2019-06-26
        相关资源
        最近更新 更多