Поддержка Плагины Оправдано ли использование AJAX в плагине

  • Решено Action2013

    (@action2013)


    У меня есть веб-приложение, которое я пытаюсь сделать плагином для WordPress. Вкратце, суть — юзер вводит данные, кликает на кнопку, приложение обращается к БД, получает данные, обрабатывает и на странице ниже выводит результаты. Как лучше сделать в плагине? Оправдано ли использование AJAX в этом случае?
    Главный критерий — нагрузка на сервер и скорость работы. Делал через AJAX, т.к. не нужно перезагружать страницу, да и запрос к БД может выполнятся секунд 5-10, а в это время на экране ничего не будет.
    Если использование AJAX все же есть преймуществом, посоветуйте хороший пример его использования (можно готовый плагин, где можно посмотреть код) где это грамотно сделано. Сколько перерыл инфы, но так и не удалось по-нормальному сделать — постоянно что-то не работает.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    посоветуйте хороший пример его использования

    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 со всеми функциями нужно инклудить даже когда эти функции не нужны?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    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');

    Нужно вынести его в основной файл плагина.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Получается, файл search.php со всеми функциями нужно инклудить даже когда эти функции не нужны?

    Весь файл — нет, но функции, которые возвращают результаты через AJAX, должны подключаться всегда, не только при обработке шорткода.

    Огромное спасибо вам за помощь. Теперь ситуация с ajax прояснилась.

Просмотр 12 ответов — с 1 по 12 (всего 12)
  • Тема «Оправдано ли использование AJAX в плагине» закрыта для новых ответов.