2011-11-28 29 views
5

Tôi đã mất hy vọng tìm giải pháp cho vấn đề của mình, hy vọng ai đó có thể giúp tôi ở đây. Đây là vấn đề:Wordpress 301 Đã chuyển Phản hồi vĩnh viễn theo yêu cầu của Jquery.post

Tôi có cài đặt wordpress với một bảng phụ gọi là wp_lojas (dành cho cửa hàng). Khách hàng có thể truy cập trang web và thông qua biểu mẫu, đặt địa chỉ của họ và sử dụng Api của Google Maps, tìm các cửa hàng gần họ.

Khi người dùng gửi biểu mẫu, tôi xác minh vị trí địa chỉ của họ (vĩ độ/kinh độ) và thông qua truy vấn SQL tôi tìm kiếm các cửa hàng gần nhất.

Biểu mẫu gửi thông số (vĩ độ/kinh độ/bán kính) thông qua yêu cầu ajax ($ .post()) vào tệp php nằm trong thư mục chủ đề của tôi (/wp-content/themes/accessorize/dadosLojas.php) và tệp đó xây dựng một XML với các cửa hàng đã tìm thấy.

Mọi thứ hoạt động tốt ngoại tuyến, trên máy cục bộ của tôi. Trực tuyến tôi nhận được câu trả lời "301 đã chuyển vĩnh viễn". Nếu các bạn đã cài đặt Firebug và muốn thử, liên kết thử nghiệm là http://www.colletivo.com.br/accessorize/ và biểu mẫu nằm ở chân trang. Nếu bạn muốn một địa chỉ từ Brazil, hãy thử "Rua Vicente Leporace, 1534".

Nếu bạn không hiểu những gì tôi đã cố gắng giải thích hoặc cần thêm thông tin, vui lòng cho tôi biết.

Cảm ơn bạn rất nhiều.

Trả lời

1

Sự cố được giải quyết với gợi ý mà Greg Pettit đã đưa ra!

Tôi không biết khả năng Wordpress chặn các yêu cầu ajax, tôi nghĩ rằng nó có liên quan gì đó với htaccess chuyển hướng yêu cầu đến một url không tồn tại.

Biết được điều này, tôi nghiên cứu làm thế nào để đưa ra yêu cầu ajax sử dụng các chức năng của Wordpress và đây là giải pháp:

Trong functions.php chủ đề của tôi:

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

} 

Trong phần đầu của Wordpress Tôi đặt :

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

Khi người dùng gửi các hình thức, tôi gửi một ajax POST cho lớp của Wordpress đó là chịu trách nhiệm về nó '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); 
     } 
    } 
); 

Vậy đó! Cảm ơn Greg Pettit vì đã làm rõ ý tưởng của tôi.

Một liên kết đó giúp tôi quá là 5 tips for using ajax in wordpress

Tôi hy vọng câu trả lời này có thể giúp một người nào đó một ngày.

0

Wordpress sẽ đồng chọn các yêu cầu AJAX của bạn cho bất kỳ tệp PHP cụ thể nào. Đó là tất cả ma thuật đen đối với tôi, vì vậy ai đó có câu trả lời tốt hơn có thể sẽ đến sớm. Tuy nhiên, bạn có thể nói rằng bạn cần đặt các yêu cầu AJAX của bạn thông qua một tập lệnh đặc biệt được thiết kế để định tuyến yêu cầu một cách thích hợp. Theo mặc định, điều này được thực hiện với ajax-admin.php (hoặc là admin-ajax.php?)

Tôi ước mình có thêm chi tiết, nhưng tôi muốn ít nhất cũng cho bạn biết rằng trước khi bạn đi quá nhiều vòng kết nối, có một cách cụ thể mà bạn cần để xử lý các yêu cầu AJAX cho một tập lệnh tùy chỉnh trong Wordpress.

+0

Tôi hiểu! Vâng, tôi nghĩ rằng tôi có thể tiếp tục tìm kiếm con đường đó. Cảm ơn –

0

Tôi có cùng một vấn đề lạ ngày hôm nay nhưng chỉ ảnh hưởng đến người dùng trong vai trò người đăng ký. Gốc của tất cả các điều ác là một chức năng nhỏ mà nên ngăn chặn người đăng ký truy cập vào phần phụ trợ.

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

Như bạn có thể thấy, hàm được gắn vào móc admin_init và do đó được thực hiện trên quản trị viên và cũng trên cuộc gọi AJAX.

Giải pháp rất đơn giản. Chỉ cần kiểm tra xem đó là một yêu cầu AJAX trước khi chuyển hướng.

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'); 
Các vấn đề liên quan