Поддержка Проблемы и решения AJAX в плагинах и фронт-энде

  • Или я чего-то не понимаю, или в кодексе описаны не все нюансы сабжа…

    Имею в плагине примерно следующее:

    wp_enqueue_script("functions", WP_PLUGIN_URL . "/timetracker/functions.js", array('jquery'), false);
    
    function pm_tt_ajax() {
    
        echo 'Some message here';
    
        exit();
    }
    
    if (is_admin()) {
        add_action('wp_ajax_pm_tt_ajax', 'pm_tt_ajax');
        add_action('wp_ajax_nopriv_pm_tt_ajax', 'pm_tt_ajax');
    }

    в functions.js примерно такое:

    jQuery(document).ready(function() {
    
        jQuery('.pm-user').on('click', function() {
    
            jQuery.ajax({
                type: "post",
                url: '/wp-admin/admin-ajax.php',
                data: {action: 'pm_tt_ajax'},
                success: function(data) {
                    if (data) {
                        alert(data);
                    }
                }
            });
        });
    });

    но при обращении любого пользователя (кроме админа) получаю в ответе от сервера главную страницу. Если под учеткой админа — то все отрабатывает так, как нужно. Что я делаю не так?

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

    (@sergeybiryukov)

    Live and Learn

    1. Не совсем понятно, для чего в первом фрагменте проверка is_admin(). Действия вида wp_ajax_nopriv_* выполняются для неавторизованных пользователей, у которых доступа в админку по определению нет. Если ваш запрос должен выполняться именно в админке, то строка с nopriv не нужна. Если на внешней части сайта — то не нужна проверка is_admin().
    2. Обратите внимание, что функцию wp_enqueue_script() нужно вызывать не в момент загрузки плагина, а в привязке к действию wp_enqueue_scripts (для внешней части сайта) или admin_enqueue_scripts (в админке). Об этом сказано как в англоязычной статье Кодекса, так и в русскоязычной.
    3. Других проблем с вашим кодом я не вижу, у меня он после некоторой адаптации (но без существенных изменений) работает для всех пользователей одинаково. Предполагаю, что проблема в чём-то другом.

    1) да, согласен, is_admin() не нужен, то было в качестве эксперимента, неправильно понял кодекс, но это сути проблемы не меняет — для пользователей НЕ-админов в ответ приходит главная страница. AJAX-запрос должен выполнятся только на Viewer-Facing Side, в админке такого не будет.
    2) За объяснение wp_enqueue_script() спасибо! Действительно упустил, сейчас исправлю.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    для пользователей НЕ-админов в ответ приходит главная страница

    Предполагаю, что установлен плагин, который для всех, кроме администраторов, перенаправляет запросы к /wp-admin/ на другой адрес.

    В частности, такая проблема была с плагином Theme My Profile — там запрос к /wp-admin/admin-ajax.php перенаправлялся на некорректный адрес /profileadmin-ajax.php, который возвращал ошибку 404 (при этом может выдаваться главная страница).

    Theme My Profile больше не поддерживается, его функциональность встроена в Theme My Login (другой плагин того же автора), в котором этой проблемы нет.

    Theme My Profile нет, и Theme My Login тоже нет… Ладно, спасибо в любом случае, буду искать где проблема 🙂

    Оппа! Ваше предположение оказалось верным! Не пускало по адресу /wp-admin/, потому что я сам же и запретил не-админам входить в админку в файле функций темы

    if (is_user_logged_in() && is_admin()) {
        global $current_user;
        get_currentuserinfo();
        $user_info = get_userdata($current_user->ID);
        if ($user_info->user_level == 0) {
            wp_redirect(get_bloginfo('home'), 301);
        }
    }

    потому главную и отдавало… «А слона-то я и не заметил» 🙂 Спасибо!

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Добавьте к условиям проверку константы DOING_AJAX:

    if ( is_user_logged_in() && is_admin() && ! defined( 'DOING_AJAX' ) )

    Отлично! Так и сделаю. Спасибо.

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