Jump to content
  • 0

ajax + wordpress


Lemming
 Share

Question

Здравствуйте, столкнулся с такой проблемой при создании сайта на 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()

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

Edited by Lemming
Link to comment
Share on other sites

21 answers to this question

Recommended Posts

  • 0

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

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

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

Edited by hedgehog
Link to comment
Share on other sites

  • 0

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

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

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

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

Link to comment
Share on other sites

  • 0

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

Странно, где-то видел хорошие статьи на русском по использованию 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. Вряд ли это нужно для простого отображения постов.

Edited by hedgehog
  • Like 1
Link to comment
Share on other sites

  • 0

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

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

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

  • 0

В корне сайта лежит 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 где и прописаны эти экшены. Пробывал заменить на фильтры, проблема не решилась.

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

  • 0

Так а сам код с редиректами тоже в 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>

Link to comment
Share on other sites

  • 0
Так а сам код с редиректами тоже в 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
Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

  • 0

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

Нет, уже сюда: ../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 можно убрать.

Link to comment
Share on other sites

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

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

?action=my_action

убрал.

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

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

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

Link to comment
Share on other sites

  • 0
Отправляю в 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

Link to comment
Share on other sites

  • 0

Добрый день. Возникла проблема, не могу понять где лужа.
Есть набор статей. Выпадающим выводится список, далее я получаю 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 происходит нормально, но какая-то фигня с данными которые должны выводиться в алерте?

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

  • 0

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

 

add_action('wp_ajax_postview_citiesView', 'citiesView');

<input type="hidden" value="postview_citiesView" name="action">
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy