посоветуйте хороший пример его использования
http://codex.wordpress.org/AJAX_in_Plugins
Сколько перерыл инфы, но так и не удалось по-нормальному сделать — постоянно что-то не работает.
Если есть конкретные вопросы — задавайте.
Спасибо за ответ!
http://codex.wordpress.org/AJAX_in_Plugins
Это конечно же тоже смотрел. Но там преймущественно раскрыто использование AJAX в админпанели.
Если конкретней, то что у меня есть на данный момент:
В главном файле плагина пишу:
add_shortcode('my_search', 'wp_my_search');
function wp_my_search()
{
require_once('search.php');
}
То есть на страницах, где будет встречаться [my_search] будет вызываться код из search.php
Далее в search.php пишу:
<?php
wp_enqueue_script('inkthemes', plugins_url( '/search.js' , __FILE__ ) , array( 'jquery' ));
wp_localize_script( 'inkthemes', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php')));
function get_test_count()
{
global $wpdb;
$test_count = $wpdb->get_var(
"SELECT COUNT(*) FROM $wpdb->options;"
);
die($test_count);
}
add_action('wp_ajax_get_test_count', 'get_test_count');
add_action('wp_ajax_nopriv_get_test_count', 'get_test_count');
?>
<input type="button" value="search_btn1" name="search_btn1" id="search_btn1"/>
и search.js:
jQuery(document).ready(function()
{
jQuery("#search_btn1").click(function()
{
jQuery.ajax({
type: 'POST',
url: MyAjax.ajaxurl,
data: {"action": "get_test_count"},
success: function(data){
alert(data);
}
});
});
});
В результате я получаю alert с текстом 0.
Такую структуру файлов пытаюсь наперед сделать, чтобы не писать все в одном файле, т.к. функций и модулей много. Может быть еще в этом что-то не так.
url: '/wp-admin/admin-ajax.php'
// на странице
<script>
function Send_data(result_id,form_id) {
jQuery.ajax({
url: '/wp-admin/admin-ajax.php',
type: 'POST',
dataType: 'html',
data: jQuery('#'+form_id).serialize(),
success: function(response) {document.getElementById(result_id).innerHTML = response;},
error: function(response) {document.getElementById(result_id).innerHTML = 'Что-то пошло не так, попробуем еще раз';}});}
</script>
<div id="result_div"></div>
<form method="post" id="form_data">
<input type="hidden" name="action" value="my_action">
<input type="button" value="Отправить" onclick="Send_data('result_div', 'form_data')">
</form>
// в плагине
function show_data(){
echo 'здесь делаем что нужно и выводим данные';
die();}
add_action('wp_ajax_my_action', 'show_data');
add_action('wp_ajax_nopriv_my_action', 'show_data');
svg, пробовал оба варианта — не получается. Не пойму, что я не так делаю. Уже больше десятка примеров перепробовал — ну никак не хочет работать. ВОзможно дело в неправильном расположении моих файлов. Вы не могли бы приложить zip-архив с файалми плагина, который 100% работает?
И то что я написал выше — тоже не работает?
svg, да, не работает. Но я подозреваю что я неправильно расположил файлы, или прописал include. Сейчас еще раз все с нуля повторю и проверю.
указать правильный путь из директории плагина к /wp-admin/admin-ajax.php
svg, спасибо получилось найти причину. Я хотел, чтобы файл search.php подключался только когда сработает определенная мной функция:
То есть, я создал отдельный файл с функциями для модуля поиска, а из главного файла плагина вызывал:
function wp_my_search(){
require_once('/modules/search.php');
}
add_shortcode('my_search', 'wp_my_search');
Файл search.php и все что в нем вызывался один раз. А потом когда нужно было вызвать функцию через ajax которая находится в нем, WordPress ее просто не находил. Получается так нельзя делать?
Получается, файл search.php со всеми функциями нужно инклудить даже когда эти функции не нужны?
url: '/wp-admin/admin-ajax.php'
Этот вариант не будет работать, если WordPress расположен в подкаталоге.
С MyAjax.ajaxurl
всё было верно, проблема не в этом.
Проблема в том, что этот фрагмент выполняется только при обработке шорткода:
function get_test_count()
{
global $wpdb;
$test_count = $wpdb->get_var(
"SELECT COUNT(*) FROM $wpdb->options;"
);
die($test_count);
}
add_action('wp_ajax_get_test_count', 'get_test_count');
add_action('wp_ajax_nopriv_get_test_count', 'get_test_count');
Нужно вынести его в основной файл плагина.
Получается, файл search.php со всеми функциями нужно инклудить даже когда эти функции не нужны?
Весь файл — нет, но функции, которые возвращают результаты через AJAX, должны подключаться всегда, не только при обработке шорткода.
Огромное спасибо вам за помощь. Теперь ситуация с ajax прояснилась.