Lemming

ajax + wordpress

    Рекомендуемые сообщения

    Lemming    3
    Lemming

    Здравствуйте, столкнулся с такой проблемой при создании сайта на Wordpress:

    у меня есть несколько кнопок на странице, есть один div-контейнер с определенным id, при нажатии на каждую из кнопок в этот контейнер должны выводиться все посты определенной категории.

    использую вот такой код jquery:

    $('#link-id').click(function(){
    $.ajax({
    url: "/wp-content/themes/memo/oneday.php",
    cache: false,
    beforeSend: function() {},
    success: function(html){
    $("#container-id").html(html);
    }
    });
    return false;
    });

    и вот php код страницы oneday.php:

    <?php 
    include("../../../wp-config.php");
    header("Content-type: text/html; charset=utf-8");
    query_posts('cat=5');
    if (have_posts()) : while (have_posts()) : the_post();
    endwhile;
    endif;
    wp_reset_query();
    ?>

    Проблема в том, что при клике на кнопку выводится ошибка рнр:

    Fatal error: Call to undefined function get_posts()

    Как реализовать нужную мне фуенкциональность без плагинов?

    Изменено пользователем Lemming

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog

    Таких вот глупостей лучше не делать, поимеете проблем с безопасностью и производительностью. У вордпресс есть своя апишка для ответа на такие запросы, подробнее тут: http://codex.wordpress.org/AJAX_in_Plugins

    И не смотрите, что там пишут о плагиинах. Этот код можно смело использовать в functions.php своей (или дочерней) темы.

    PS: для передачи JS кода на страницу можно использовать wp_localize_script

    Изменено пользователем hedgehog

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    Lemming    3
    Lemming

    Таких вот глупостей лучше не делать, поимеете проблем с безопасностью и производительностью. У вордпресс есть своя апишка для ответа на такие запросы, подробнее тут: http://codex.wordpress.org/AJAX_in_Plugins

    И не смотрите, что там пишут о плагиинах. Этот код можно смело использовать в functions.php своей (или дочерней) темы.

    PS: для передачи JS кода на страницу можно использовать wp_localize_script

    спасибо за ссылку, ничего не понял(

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog

    спасибо за ссылку, ничего не понял(

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

    Суть в том, чтобы в functions.php создать функцию, которая будет обрабатывать запрос:

    function my_action_callback() {
    // вывести какой-нибудь ответ
    echo $_REQUEST['myname'];

    // Обязательно! exit или die()
    exit;
    }
    }

    Уведомить вордпресс о том, что при запросе my_action нужно вызывать my_action_callback:

    add_action( 'wp_ajax_my_action', 'my_action_callback' );

    Отправить запрос и получить ответ можно так (в ajaxurl нужно передать путь к файлу "admin-ajax.php", получить можно вызовом PHP функции admin_url( 'admin-ajax.php' ) и передачей переменной через wp_localize_script):


    var data = {
    action:'my_action',
    myname:'Lemming'
    };
    jQuery.post(
    ajaxurl,
    data,
    function response(response){
    alert('Смольный отвечает: ' + response);
    }
    );

    Данные также можно возвращать в формате JSON. Для этого в my_action_callback отдаем правильный заголовок:

    header( "Content-Type: application/json" );

    И в ответе отдаем массив, пропущенный через json_encode (PHP).

    PS: код писал на лету без проверки, так как под рукой нет wordpress. Мог где-то ошибиться.

    PPS: если в запросе нужно проверять права пользователя, используйте nonces. Вряд ли это нужно для простого отображения постов.

    Изменено пользователем hedgehog
    • Like 1

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    Lemming    3
    Lemming

    Спасибо за детальное объяснение, оказывается все работало как нужно, стоило только перезапустить денвер.

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen

    Точно такая же проблема только с Fatal error: Call to undefined function add_action() и перезапуск денвера не помог. Что делать, как быть?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog

    Точно такая же проблема только с Fatal error: Call to undefined function add_action() и перезапуск денвера не помог. Что делать, как быть?

    На какой адрес отправляется запрос?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen

    Папка в которой лежит скрипт находится в корне. А запрос посылается сюда:

    ../wp-admin/admin-ajax.php?action=my_action

    На какой адрес отправляется запрос?

    Точно такая же проблема только с Fatal error: Call to undefined function add_action() и перезапуск денвера не помог. Что делать, как быть?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog
    Папка в которой лежит скрипт находится в корне. А запрос посылается сюда:

    Эм, а подробнее? В корне Wordpress лежит какой-то Ваш PHP скрипт, в котором производятся манипуляции с add_action? Если нет, то в на какой файл указывает ошибка "Fatal error: Call to undefined function add_action()"?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen

    В корне сайта лежит JS скрипт, который отбирает ссылку и отправляет запрос, а именно:

    $("#selectRegion > a").click( function() {

    var RegName = $(this).text();
    var RegID = $(this).attr("id");

    var data = {
    action: 'my_action',
    Name: RegName,
    ID: RegID
    };

    $.ajax({
    type : "post",
    dataType : "text",
    url : "../wp-admin/admin-ajax.php?action=my_action",
    data : data,
    success: function(response){
    alert('Сервер вернул ответ: ' + response);
    }


    });

    });

    Далее в admin-ajax.php цепляем 2 экшена:

    add_action('wp_ajax_my_action', 'my_action_callback');
    add_action("wp_ajax_nopriv_my_action", "my_action_callback");

    В functions.php сам код, который добавляет выбранный регион в куки и редиректит на ссылку этого региона пока кук жив:

    function my_action_callback (){

    $RegName = $_REQUEST['Name'];
    $ID = $_REQUEST['ID'];

    global $formRegion; //глобальная formregion

    if(isset($RegName) && isset($ID)) {
    $region = '?cat='.$ID; //формируем адрес для редиректа
    setcookie("city", $ID, time()+3600, '/'); //запоминаем выбраный регион
    if(is_home()) {
    wp_redirect( $region ); //редиректим, если страница главная
    exit;
    }
    }

    if(isset($_COOKIE['city']) and is_home() ) {
    $formRegion = $_COOKIE['city'];
    $region = '?cat='.$formRegion;
    wp_redirect($region);
    exit;
    }

    }

    Вот. В итоге ошибка Fatal error: Call to undefined function add_action().

    Ошибка указывает на admin-ajax.php где и прописаны эти экшены. Пробывал заменить на фильтры, проблема не решилась.

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog
    Далее в admin-ajax.php цепляем 2 экшена:

    По рукам линейкой! Это "системный" файл Wordpress, его трогать противопоказано и add_action там не место. Все хуки (add_action) добавляйте в functions.php

    Пробывал заменить на фильтры, проблема не решилась

    Основное предназначение фильтров - это изменение каких-либо данных перед тем, как эти данные отобразятся или пойдут обрабатываться дальше (обычный хук), в то время как action - это нечто сродни событиям :)

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen

    Так а сам код с редиректами тоже в functions.php?

    К сожалению проблема осталасть, вот что выдает алерт:

    Сервер вернул ответ: <!--error--><br />

    <b>Fatal error</b>: Call to undefined function add_action() in <b>Q:\home\wp\www\wp-content\themes\skeptical\functions.php</b> on line <b>22</b><br />

    <script language=Javascript src='/denwer/errors/phperror_js.php'></script>

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog
    Так а сам код с редиректами тоже в functions.php?

    Эм, в ответ должен приходить URL целевой страницы, на основании которого редиректит уже Javascript, а не PHP.

    Call to undefined function add_action() in Q:\home\wp\www\wp-content\themes\skeptical\functions.php

    А данные отправляются все так же на admin-ajax.php ?

    Работает это так:

    1. admin-ajax.php получает данные и инклудит нужные файлы (его трогать нельзя, если там есть какие-то свои модификации, их необходимо отменить)

    2. если найдена функция, отвечающая за обработку нужного action, управление передается ей

    3. если функция возвращает какие-то данные, они возвращаются обратно клиенту

    PS: '?action=my_action' в url не надо. Эти данные и так передаются POST'ом (см. объект data).

    • Like 1

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen
    А данные отправляются все так же на admin-ajax.php ?

    Нет, уже сюда: ../wp-content/themes/skeptical/functions.php?action=my_action

    Работает это так: 1. admin-ajax.php получает данные и инклудит нужные файлы (его трогать нельзя, если там есть какие-то свои модификации, их необходимо отменить) 2. если найдена функция, отвечающая за обработку нужного action, управление передается ей 3. если функция возвращает какие-то данные, они возвращаются обратно клиенту

    Ну вроде так и делаю же..

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog

    И как, не возникает противоречий между

    Нет, уже сюда: ../wp-content/themes/skeptical/functions.php?action=my_action

    и

    1. admin-ajax.php получает данные

    Ну вроде так и делаю же..

    Данные должны отправляться на wp-admin/admin-ajax.php, а не к functions.php или куда-либо еще (вообще-то, если поиграться с include, можно отправлять на любой свой скипт, но сейчас этот вариант не рассматриваем). И, повторяю, не надо добавлять переменную action в сам URL, т.е. ?action=my_action можно убрать.

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen
    Данные должны отправляться на wp-admin/admin-ajax.php, а не к functions.php или куда-либо еще

    Не понимаю, что я должен исправить, если честно...)

    ?action=my_action

    убрал.

    Отправляю в JS'e запрос сюда: ../wp-admin/admin-ajax.php, правильно?

    А PHP скрипт и экшены лежат в function.php так?

    PS. Пишет сервер вернул ответ 0, при алерте. Не пойму, к чему 0?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog
    Отправляю в JS'e запрос сюда: ../wp-admin/admin-ajax.php, правильно? А PHP скрипт и экшены лежат в function.php так?

    Правильно.

    PS. Пишет сервер вернул ответ 0, при алерте. Не пойму, к чему 0?

    Потому что вы ничего не возвращаете в ответ. Уберите редиректы из my_action_callback(), вместо этого возвращайте JSON объект с адресом страницы, на которую нужно редиректить (см. json_encode). А редирект выполняйте средствами javascript после получения ответа.

    И еще: в проверке is_home() при аякс-запросе смысла нет. my_action_callback() ничего не знает о том, какую страницу сейчас просматривает пользователь. Проверку необходимо делать на фронтенде и передавать с аякс-запросом в объекте data. Например, добавив свойство isHome: 0/1

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen

    Понял, щас попробую. А с куками как быть? Через php оставить или тоже в JS?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    euqen    0
    euqen

    Спасибо большое за помощь!! Разобрался

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    zagazat    0
    zagazat

    Добрый день. Возникла проблема, не могу понять где лужа.
    Есть набор статей. Выпадающим выводится список, далее я получаю ID статьи, и из этой статьи нужно вывести метки этой статьи.
    Решил делать это с помощью ajax. Но выдаёт мне undefined и всё тут.
    Привожу код:
    HTML:

    <div class="block_oborud"> <form method="post" id="geo">  <div class="col-xs-9" style="padding: 0;">   <select class="form-control" name="model" placeholder="Выберите модель">    <?php     $args = array( 'post_type' => 'post', 'category' => 3, 'posts_per_page' => 25, 'order' => 'ASC' );     $attachments = get_posts( $args );      if ($attachments) {        foreach ( $attachments as $post ) { setup_postdata($post);          echo "<option value='";          echo the_ID()."'>";     //передаём ID поста на сервер для отображения городов          echo the_title();       //отображаем название модели в форме          echo "</option>";        }       }       wp_reset_postdata();      ?>     </select>    </div>    <div class="col-xs-3" style="padding: 0;">      <input type="hidden" value="citiesView" name="action">      <input type="submit" class="btn" value="Показать">    </div>   </form></div>

    functions.php

    function citiesView(){ if (isset($_POST['model'])) {  $post_id = $_POST['model'];  $cities = array(      'status' => 1,      'city' => wp_get_post_tags($post_id)  );  echo json_encode($cities); } else {  $cities = array(       'status' => 0,        'city' => 'Городов не найдено'  );  echo json_encode($cities); } wp_die();}add_action('wp_ajax_postview_citiesView', 'citiesView');add_action('wp_ajax_nopriv_postview_citiesView', 'citiesView');

    и JS

    $('#geo').submit(function(e) { e.preventDefault(); var ajaxurl = 'http://' + location.host + '/wp-admin/admin-ajax.php'; var msg = $(this).serialize(); $.ajax({   type: "POST",   url: ajaxurl,   data: msg,   success: function(html) {     var res = JSON.parse(html);     alert(res.status);   },   error: function(html) {     alert('Some Trouble');   } })})

    событие error в ajax-запросе не срабатывает. просто выдаётся undefined.
    правильно понимаю, что запрос к functions.php происходит нормально, но какая-то фигня с данными которые должны выводиться в алерте?

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    afdw    119
    afdw
    правильно понимаю, что запрос к functions.php происходит нормально, но какая-то фигня с данными которые должны выводиться в алерте?
     

    В Chrome: F12 -> Console -> Right Mouse Button -> Log XMLHTTPRequests. F5. Теперь показываются запросы. Если кликнуть по ссылки в логе о запросе и ещё раз кликнуть по появившейся и выделившейся ссылке, то можно попасть на место, где подробно изложена вся информация о запросе.

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах
    hedgehog    149
    hedgehog

    Потому что action неправильный.  Красным выделено, при какой переменной "action" будет выполнен колбек "citiesView". 

     

    add_action('wp_ajax_postview_citiesView', 'citiesView');

    <input type="hidden" value="postview_citiesView" name="action">

    Поделиться сообщением


    Ссылка на сообщение
    Поделиться на других сайтах

    Создайте аккаунт или войдите в него для комментирования

    Вы должны быть пользователем, чтобы оставить комментарий

    Создать аккаунт

    Зарегистрируйтесь для получения аккаунта. Это просто!

    Зарегистрировать аккаунт

    Войти

    Уже зарегистрированы? Войдите здесь.

    Войти сейчас

    • Войти через Facebook
    • Войти через Twitter
    • Войти через Microsoft
    • Войти через LinkedIn
    • Войти через Google