2013-07-17 2 views
17

Я знаком с использованием ajax обычным способом с помощью jQuery.
Я играл вокруг него некоторое время, но не понимаю, что Wordpress должен заставить его работать ...
Что я здесь делаю из урока или статьи.
Это в functions.php (в детской теме):Как загрузить Ajax в Wordpress

// code to load jquery - working fine 

// code to load javascript file - working fine 

// ENABLE AJAX : 
function add_ajax() 
{ 
    wp_localize_script(
    'function', 
    'ajax_script', 
    array('ajaxurl' => admin_url('admin-ajax.php'))); 
} 

$dirName = get_stylesheet_directory(); // use this to get child theme dir 
require_once ($dirName."/ajax.php"); 

add_action("wp_ajax_nopriv_function1", "function1"); // function in ajax.php 

add_action('template_redirect', 'add_ajax'); 

Сам Jquery загружается и работает нормально.

Я попробовал некоторые основные Ajax, как следующее:

jQuery(document).ready(function($){ 
    $('a.link').click(function(){ 
     $.ajax({ 
       url:  ajax_script.ajaxurl, 
       data: ({action : 'function1'}), 
       success: function(data){ 
        $('#result').html(data); 
       } 
     }); 
     return false; 
    }); 
}); 

Помимо этого, я не знаю, как я могу проверить, чтобы увидеть, если он даже загружен правильно, чтобы начать с ...

Любая помощь здесь будет оценена по достоинству.

EDIT:
В поджигатель эта ошибка:

ReferenceError: ajax_script is not defined 
     url: ajax_script.ajaxurl, 
+0

http://stackoverflow.com/questions/10807368/how-to-use -wordpress-functions-in-a-ajax-call – zod

ответ

40

По вашему запросу я поставил это в ответ на вас.

Как предложил Hieu Nguyen в своем ответе, вы можете использовать переменную javascript ajaxurl для ссылки на файл admin-ajax.php. Однако эта переменная не объявлена ​​на интерфейсе. Это просто объявить на переднем конце, поставив следующее в header.php вашей темы.

<script type="text/javascript"> 
    var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>"; 
</script> 

Как описано в документации Wordpress AJAX, у вас есть два различных крючков - wp_ajax_ (действие), и wp_ajax_nopriv_ (действие). Разница между ними:

  • wp_ajax_ (action): Это срабатывает, если вызов ajax выполняется из панели администратора.
  • wp_ajax_nopriv_ (action): Это срабатывает, если вызов ajax выполняется из передней части веб-сайта.

Все остальное описано в документации, указанной выше. Счастливое кодирование!

P.S. Вот пример, который должен работы. (Я не проверял)

Передняя:

<script type="text/javascript"> 
    jQuery.ajax({ 
     url: ajaxurl, 
     data: { 
      action: 'my_action_name' 
     }, 
     type: 'GET' 
    }); 
</script> 

Назад конец:

<?php 
    function my_ajax_callback_function() { 
     // Implement ajax function here 
    } 
    add_action('wp_ajax_my_action_name', 'my_ajax_callback_function'); // If called from admin panel 
    add_action('wp_ajax_nopriv_my_action_name', 'my_ajax_callback_function'); // If called from front end 
?> 

UPDATE Несмотря на то, что это старый ответ, он кажется, продолжает получать большие пальцы от людей - whic h отлично! Я думаю, что это может быть полезно для некоторых людей.

WordPress имеет функцию wp_localize_script. Эта функция принимает массив данных в качестве третьего параметра, предназначенного быть переводами, как следующее:

var translation = { 
    success: "Success!", 
    failure: "Failure!", 
    error: "Error!", 
    ... 
}; 

Так что это просто загружает объект в HTML головной метки. Это может быть использовано следующим образом:

Backend:

wp_localize_script('FrontEndAjax', 'ajax', array(
    'url' => admin_url('admin-ajax.php') 
)); 

Преимущество этого метода заключается в том, что он может быть использован в обоих тем и плагинов, так как вы не жесткого кодирования Аякса URL-адрес в теме.

На переднем конце URL-адрес теперь доступен через ajax.url, а не просто ajaxurl в предыдущих примерах.

+0

Поскольку мой вопрос просто хотел получить ответ ajax, работающий в WP, я отмечаю это как правильное и полезное для понимания. Для всех, кто читает: если это не работает для запроса db (который я haven – grai

7

Во-первых, вы должны прочитать эту страницу тщательно http://codex.wordpress.org/AJAX_in_Plugins

Во-вторых, ajax_script не определен, так что вы должны изменить, чтобы: url: ajaxurl. Я не вижу ваш function1() в приведенном выше коде, но вы уже можете определить его в другом файле.

И, наконец, узнайте, как отлаживать вызов ajax, используя вкладку Firebug, network и console будут вашими друзьями. На стороне PHP, print_r() или var_dump() станут твоими друзьями.

+0

Уже использовал firebug, как сказано в начале моего вопроса. И знакомы с print_r и var_dump. Я продолжаю работать над этим сам, но просто отправил в надежде, что кто-то может обнаружить что-то неправильно с кодом выше (если есть) или предложить альтернативный метод. Я внес изменения в предложенный вами URL-адрес, но ничего не изменил - все еще сказал, что он не определен. Моя функция1() находится в файле ajax.php, но это не делает ничего особенного. На данный момент я просто хочу получить ответ. Спасибо за ввод. – grai

+0

что именно сейчас не определено? если он жалуется, что 'ajax_script не определен', то у вас есть это где-то еще. –

+0

ReferenceError: ajaxurl не определен url: ajaxurl, ..... Просто вставил это из firebug. – grai

-2

Я думал, что поскольку файл js уже был загружен, мне не нужно было загружать/вставлять его снова в отдельную функцию add_ajax.
Но это должно быть необходимо, или я сделал это, и теперь он работает.

Надеюсь, это поможет кому-то еще.

Вот исправленный код от вопроса:

// code to load jquery - working fine 

// code to load javascript file - working fine 

// ENABLE AJAX : 
function add_ajax() 
{ 
    wp_enqueue_script(
     'function', 
     'http://host/blog/wp-content/themes/theme/js.js', 
     array('jquery'), 
     '1.0', 
     1 
    ); 

    wp_localize_script(
     'function', 
     'ajax_script', 
     array('ajaxurl' => admin_url('admin-ajax.php'))); 
} 

$dirName = get_stylesheet_directory(); // use this to get child theme dir 
require_once ($dirName."/ajax.php"); 

add_action("wp_ajax_nopriv_function1", "function1"); // function in ajax.php 

add_action('template_redirect', 'add_ajax'); 
+1

Это неверно несколько способов. У вас есть крючки для функций, которые не используются, t в вашем коде –

2

Лично я предпочитаю делать ajax в wordpress так же, как и делать ajax на любом другом сайте. Я создаю процессорный php-файл, который обрабатывает все мои запросы ajax и просто использует этот URL. Так вот, из-за htaccess не совсем возможно в wordpress, поэтому я делаю следующее.

1.in мой файл Htaccess, который живет в моем в.ч.-содержимое папки я добавить это ниже того, что уже есть

<FilesMatch "forms?\.php$"> 
Order Allow,Deny 
Allow from all 
</FilesMatch> 

В этом случае мой файл процессор называется forms.php - вы бы это в вашем wp-content/themes/themeName вместе со всеми вашими другими файлами, такими как header.php footer.php и т. д., он просто живет в вашем корне.

2.) В моем коде я АЯКС может использовать мой адрес как этот

$.ajax({ 
    url:'/wp-content/themes/themeName/forms.php', 
    data:({ 
     someVar: someValue 
    }), 
    type: 'POST' 
}); 

, очевидно, вы можете добавить в любой из ваших раньше, успеха или типа ошибки вещей, которые вы хотели бы ... но да это (я считаю) более простой способ сделать это, потому что вы избегаете всей глупости говорить wordpress в 8 разных местах, что произойдет, и это также позволит вам избежать других вещей, которые вы видите, когда люди делают, где они помещают js-код на страницу чтобы они могли окунуться в php, где я предпочитаю хранить файлы js отдельно.

+0

У WordPress уже есть соответствующие механизмы - зачем заново изобретать колесо? – Shane

+3

Я лично считаю, что их путь чрезвычайно неуклюж - как разработчик i скорее всего, будет иметь доступ к любым файлам, которые я хочу, содержащим логику. –

+0

Обычно я создаю папку с библиотекой различных файлов конечных точек ajax, которые возвращают строку json. Должен ли я добавить новое правило исключения файлов в .htaccess для каждого файла или есть способ «гибридизировать» обычный метод с помощью метода WordPress, используя один файл обработки с неограниченными функциями и вызывать функцию внутри файл обработки? – TARKUS

2

Используйте wp_localize_script и передать URL есть:

wp_localize_script(some_handle, 'admin_url', array('ajax_url' => admin_url('admin-ajax.php'))); 

затем внутри JS, вы можете называть его

admin_url.ajax_url 
Смежные вопросы