2011-11-28 4 views
5

Ho perso le mie speranze di trovare una soluzione al mio problema, spero che qualcuno possa aiutarmi qui. Ecco il problema:Wordpress 301 Spostato Risposta permanente su richiesta Jquery.post

Ho un'installazione di wordpress con una tabella aggiuntiva chiamata wp_lojas (per i negozi). I clienti possono andare sul sito e attraverso un modulo, inserire il loro indirizzo e utilizzare l'API di Google Maps, trovare i negozi vicino a loro.

Quando l'utente invia il modulo, verifica la posizione dell'indirizzo (latitudine/longitudine) e tramite una query SQL cerco i negozi più vicini.

Il modulo invia i parametri (latitudine/longitudine/raggio) attraverso una richiesta di ajax ($ .post()) in un file php che è dentro la mia cartella del tema (/wp-content/themes/accessorize/dadosLojas.php) e quel file crea un XML con i negozi trovati.

Tutto funziona correttamente offline, sul mio computer locale. Online ottengo una risposta "301 Moved Permanently". Se avete installato Firebug e volete provare, il link di prova è http://www.colletivo.com.br/accessorize/ e il modulo si trova sul piè di pagina. Se voi ragazzi volete un indirizzo dal Brasile, provate "Rua Vicente Leporace, 1534".

Se non capisci cosa ho cercato di spiegare, o hai bisogno di ulteriori informazioni, per favore fammi sapere.

Grazie mille.

risposta

1

Problema risolto con il suggerimento fornito da Greg Pettit!

Non ero a conoscenza della possibilità che Wordpress intercettasse richieste ajax, pensavo che avesse qualcosa a che fare con htaccess reindirizzando la richiesta a un URL inesistente.

Sapendo questo, ho ricercato come fare richieste Ajax utilizzando le funzioni di Wordpress e qui è la soluzione:

In functions.php del mio tema:

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

} 

Nell'intestazione di Wordpress ho messo :

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

Quando l'utente invia il modulo, mando un POST Ajax per la classe di Wordpress che ne è responsabile '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); 
     } 
    } 
); 

Questo è tutto! Grazie Greg Pettit per aver chiarito le mie idee.

Un collegamento che mi aiuta anche era 5 tips for using ajax in wordpress

Spero che questa risposta può aiutare qualcuno un giorno.

0

Wordpress coopterà le richieste AJAX a qualsiasi dato file PHP. Per me è tutta magia nera, quindi è probabile che qualcuno con una risposta migliore arrivi presto. Basti dire, però, che è necessario convogliare le richieste AJAX attraverso uno script speciale progettato per instradare la richiesta in modo appropriato. Per impostazione predefinita, questo è fatto con ajax-admin.php (o era admin-ajax.php?)

Vorrei avere più dettagli a mano, ma volevo almeno farti sapere che prima di entrare anche tu molte cerchie, c'è un modo particolare per gestire le richieste AJAX su uno script personalizzato in Wordpress.

+0

Ho capito! Bene, penso di poter continuare a cercare quel percorso. Grazie –

0

Ho avuto lo stesso strano problema oggi ma solo gli utenti interessati nel ruolo di sottoscrittore. La radice di tutto il male era una piccola funzione che dovrebbe impedire agli abbonati di accedere al back-end.

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

Come si può vedere, la funzione è attaccato al gancio admin_init e quindi eseguito su un amministratore e anche una chiamata AJAX.

La soluzione era semplice. Basta controllare se si tratta di una richiesta AJAX prima del reindirizzamento.

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