2011-11-28 6 views
5

私の問題に対する解決策を見つけることに希望を失いました。誰かが私を助けてくれることを願っています。ここに問題があります:Wordpress 301 Jquery.postリクエストで永久に応答しました

私はwp_lojas(店舗用)と呼ばれる余分なテーブルを持つワードプレスのインストールがあります。顧客はサイトに移動し、フォームを通じて住所を入力し、Google Maps APIを使用して、近くにある店舗を見つけることができます。

ユーザーがフォームを送信すると、その住所の位置(緯度/経度)を確認し、SQLクエリを使用して最も近い店を探します。

フォームは、私のテーマフォルダ(/wp-content/themes/accessorize/dadosLojas.php)にあるphpファイルに、ajax要求($ .post())を使ってパラメータ(緯度/経度/ )、そのファイルは見つかったストアでXMLを構築します。

ローカルマシン上のすべてが正常にオフラインで動作します。オンライン私は「301 Moved Permanently」という答えを得る。あなたがFirebugをインストールして試したければ、テストリンクはhttp://www.colletivo.com.br/accessorize/で、フォームはページのフッタにあります。もしあなたがブラジルからの住所が欲しいなら、 "Rua Vicente Leporace、1534"を試してみてください。

私が説明しようとしたことを理解していない、または詳細情報が必要な場合は、私に知らせてください。

ありがとうございました。

答えて

1

ヒントGreg Pettitがヒントを得て解決しました!

Wordpressがajaxリクエストを傍受する可能性を認識していなかったため、リクエストが存在しないURLにリダイレクトされるhtaccessと関係があると思いました。

はこれを知って、私は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のヘッダーに:ユーザーがフォームを送信すると、私はそれはのwp-adminの/ adminに-ajax.php」の責任があるのWordpressのクラスのPOSTのAJAXを送る

<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> 

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

これだけです!私のアイデアを明確にしてくれたグレッグ・ペティットに感謝します。私を助け

つのリンクがあまりにも

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'); 
関連する問題