Wordpress 301 перемещен Постоянный ответ на запрос Jquery.post - PullRequest
5 голосов
/ 29 ноября 2011

Я потерял свои надежды на поиск решения моей проблемы, надеюсь, кто-то может помочь мне здесь. Вот проблема:

У меня есть установка 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 ]

1 голос
/ 30 ноября 2011

Проблема решена с подсказкой, которую дал Грег Петтит!

Я не знал о возможности перехвата ajax-запросов Wordpress, я думал, что это как-то связано с htaccess, перенаправляющим запрос на несуществующий URL.

Зная это, я исследовал, как делать ajax-запросы, используя функции Wordpress, и вот решение:

В функциях моей темы .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>

Когда пользователь отправляет форму, я отправляю ajax POST для класса 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);
        }
    }
);

Вот и все! Спасибо Грегу Петтиту за разъяснение моих идей.

Одна ссылка, которая мне тоже помогла, была 5 советов по использованию ajax в WordPress

Надеюсь, этот ответ может кому-нибудь помочь однажды.

0 голосов
/ 24 сентября 2013

У меня была та же странная проблема сегодня, но она затрагивала только пользователей в роли подписчика. Корнем всего зла была маленькая функция, которая не позволяла подписчикам получать доступ к бэкэнду.

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');
0 голосов
/ 29 ноября 2011

Wordpress будет обрабатывать ваши AJAX-запросы к любому файлу PHP. Для меня все это чёрная магия, так что, скорее всего, скоро появится кто-то с лучшим ответом. Достаточно сказать, однако, что вам нужно передать ваши AJAX-запросы через специальный скрипт, предназначенный для соответствующей маршрутизации запроса. По умолчанию это делается с помощью ajax-admin.php (или это было admin-ajax.php?)

Хотелось бы, чтобы у меня было больше подробностей, но я хотел бы, по крайней мере, сообщить вам, что прежде чем идти слишком много кругов, есть особый способ обработки запросов AJAX к пользовательскому сценарию в Wordpress.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...