Lemming 3 Жалоба Опубликовано: 11 сентября, 2012 (изменено) Здравствуйте, столкнулся с такой проблемой при создании сайта на 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() Как реализовать нужную мне фуенкциональность без плагинов?Изменено 11 сентября, 2012 пользователем Lemming Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hedgehog 149 Жалоба Опубликовано: 11 сентября, 2012 (изменено) Таких вот глупостей лучше не делать, поимеете проблем с безопасностью и производительностью. У вордпресс есть своя апишка для ответа на такие запросы, подробнее тут: http://codex.wordpress.org/AJAX_in_Plugins И не смотрите, что там пишут о плагиинах. Этот код можно смело использовать в functions.php своей (или дочерней) темы. PS: для передачи JS кода на страницу можно использовать wp_localize_scriptИзменено 11 сентября, 2012 пользователем hedgehog Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lemming 3 Жалоба Опубликовано: 11 сентября, 2012 Таких вот глупостей лучше не делать, поимеете проблем с безопасностью и производительностью. У вордпресс есть своя апишка для ответа на такие запросы, подробнее тут: http://codex.wordpress.org/AJAX_in_Plugins И не смотрите, что там пишут о плагиинах. Этот код можно смело использовать в functions.php своей (или дочерней) темы. PS: для передачи JS кода на страницу можно использовать wp_localize_script спасибо за ссылку, ничего не понял( Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hedgehog 149 Жалоба Опубликовано: 11 сентября, 2012 (изменено) спасибо за ссылку, ничего не понял( Странно, где-то видел хорошие статьи на русском по использованию 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. Вряд ли это нужно для простого отображения постов.Изменено 11 сентября, 2012 пользователем hedgehog 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Lemming 3 Жалоба Опубликовано: 11 сентября, 2012 Спасибо за детальное объяснение, оказывается все работало как нужно, стоило только перезапустить денвер. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
euqen 0 Жалоба Опубликовано: 30 марта, 2013 Точно такая же проблема только с Fatal error: Call to undefined function add_action() и перезапуск денвера не помог. Что делать, как быть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hedgehog 149 Жалоба Опубликовано: 1 апреля, 2013 Точно такая же проблема только с Fatal error: Call to undefined function add_action() и перезапуск денвера не помог. Что делать, как быть? На какой адрес отправляется запрос? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
euqen 0 Жалоба Опубликовано: 1 апреля, 2013 Папка в которой лежит скрипт находится в корне. А запрос посылается сюда: ../wp-admin/admin-ajax.php?action=my_action На какой адрес отправляется запрос? Точно такая же проблема только с Fatal error: Call to undefined function add_action() и перезапуск денвера не помог. Что делать, как быть? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hedgehog 149 Жалоба Опубликовано: 1 апреля, 2013 Папка в которой лежит скрипт находится в корне. А запрос посылается сюда: Эм, а подробнее? В корне Wordpress лежит какой-то Ваш PHP скрипт, в котором производятся манипуляции с add_action? Если нет, то в на какой файл указывает ошибка "Fatal error: Call to undefined function add_action()"? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
euqen 0 Жалоба Опубликовано: 1 апреля, 2013 В корне сайта лежит 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; //глобальная formregionif(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 Жалоба Опубликовано: 1 апреля, 2013 Далее в admin-ajax.php цепляем 2 экшена: По рукам линейкой! Это "системный" файл Wordpress, его трогать противопоказано и add_action там не место. Все хуки (add_action) добавляйте в functions.php Пробывал заменить на фильтры, проблема не решилась Основное предназначение фильтров - это изменение каких-либо данных перед тем, как эти данные отобразятся или пойдут обрабатываться дальше (обычный хук), в то время как action - это нечто сродни событиям Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
euqen 0 Жалоба Опубликовано: 1 апреля, 2013 Так а сам код с редиректами тоже в 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 Жалоба Опубликовано: 1 апреля, 2013 Так а сам код с редиректами тоже в 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). 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
euqen 0 Жалоба Опубликовано: 1 апреля, 2013 А данные отправляются все так же на admin-ajax.php ? Нет, уже сюда: ../wp-content/themes/skeptical/functions.php?action=my_action Работает это так: 1. admin-ajax.php получает данные и инклудит нужные файлы (его трогать нельзя, если там есть какие-то свои модификации, их необходимо отменить) 2. если найдена функция, отвечающая за обработку нужного action, управление передается ей 3. если функция возвращает какие-то данные, они возвращаются обратно клиенту Ну вроде так и делаю же.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hedgehog 149 Жалоба Опубликовано: 1 апреля, 2013 И как, не возникает противоречий между Нет, уже сюда: ../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 Жалоба Опубликовано: 1 апреля, 2013 Данные должны отправляться на 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 Жалоба Опубликовано: 1 апреля, 2013 Отправляю в 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 Жалоба Опубликовано: 1 апреля, 2013 Понял, щас попробую. А с куками как быть? Через php оставить или тоже в JS? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
euqen 0 Жалоба Опубликовано: 3 апреля, 2013 Спасибо большое за помощь!! Разобрался Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
zagazat 0 Жалоба Опубликовано: 1 июля, 2015 Добрый день. Возникла проблема, не могу понять где лужа. Есть набор статей. Выпадающим выводится список, далее я получаю 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 Жалоба Опубликовано: 1 июля, 2015 правильно понимаю, что запрос к functions.php происходит нормально, но какая-то фигня с данными которые должны выводиться в алерте? В Chrome: F12 -> Console -> Right Mouse Button -> Log XMLHTTPRequests. F5. Теперь показываются запросы. Если кликнуть по ссылки в логе о запросе и ещё раз кликнуть по появившейся и выделившейся ссылке, то можно попасть на место, где подробно изложена вся информация о запросе. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hedgehog 149 Жалоба Опубликовано: 1 июля, 2015 Потому что action неправильный. Красным выделено, при какой переменной "action" будет выполнен колбек "citiesView". add_action('wp_ajax_postview_citiesView', 'citiesView'); <input type="hidden" value="postview_citiesView" name="action"> Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах