admin ajax не работает для незалогиненных пользователей

Вопрос или проблема

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

Вот мой код:

$.post('<?php echo admin_url( 'admin-ajax.php' ) ?>', 
    {'action': 'load_posts',
     'offset': offset,
     'author' : <?php echo $uid?>,
     'cat'  : '<?php echo $category->name?>',
     'color': '<?php echo get_cat_color($category->cat_ID)?>' 
    },  function(response){
        if (response.trim() == ""){$("#more_posts_<?php echo $catNoSpace?>").hide();}
           $("#cat<?php echo $catNoSpace?>").append("<div class="newdiv">" + response + "</div>");
        }

И у меня есть обе эти строки:

add_action('wp_ajax_load_posts', 'ng_load_posts');

add_action('wp_ajax_nopriv_load_posts', 'ng_load_posts');

И хорошо работающая функция ng_load_posts().

Я также попытался отключить все установленные мной плагины.

Что я упустил?

Существуют некоторые “волшебные” параметры запроса, которых лучше избегать, в основном все, что можно использовать в качестве имени параметра в URL запроса, но также и что-то вроде “email” (не думаю, что это хорошо задокументировано, и быстрая гугл-поиск не дал хорошей ссылки).

Попробуйте изменить названия ваших параметров, особенно “author” и “cat”, возможно, просто добавьте к ним какой-то префикс.

Ответ или решение

Почему admin-ajax не работает для незарегистрированных пользователей

Проблема с тем, что запросы к admin-ajax.php не обрабатываются для незарегистрированных пользователей, может возникнуть по различным причинам. Давайте подробно рассмотрим ваш код и контекст проблемы, чтобы выявить возможные источники ошибки и пути их решения.

Код

Ваш JavaScript код для отправки AJAX-запроса выглядит правильно:

$.post('<?php echo admin_url( 'admin-ajax.php' ) ?>', 
    {'action': 'load_posts',
     'offset': offset,
     'author': <?php echo $uid?>,
     'cat': '<?php echo $category->name?>',
     'color': '<?php echo get_cat_color($category->cat_ID)?>' 
    }, function(response){
        if (response.trim() == "") {
            $("#more_posts_<?php echo $catNoSpace?>").hide();
        }
        $("#cat<?php echo $catNoSpace?>").append("<div class='newdiv'>" + response + "</div>");
    }
);

А также необходимо убедиться, что вы корректно зарегистрировали обработчики AJAX-запросов:

add_action('wp_ajax_load_posts', 'ng_load_posts');
add_action('wp_ajax_nopriv_load_posts', 'ng_load_posts');

И у вас есть корректная реализация функции ng_load_posts().

Потенциальные проблемы

  1. Параметры запроса:
    Упоминание о том, что "некоторые магические параметры" могут вызвать проблемы, абсолютно справедливо. Рекомендуется изменить названия параметров, чтобы избежать конфликтов. Например, вместо author и cat попробуйте использовать префиксы, например myplugin_author и myplugin_cat.

    {'action': 'load_posts',
    'offset': offset,
    'myplugin_author': <?php echo $uid?>,
    'myplugin_cat': '<?php echo $category->name?>',
    ...
    }
  2. Кросс-доменные запросы:
    Убедитесь, что ваш AJAX-запрос не блокируется политиками безопасности браузеров, особенно если вы работаете на локальном сервере или с различными доменами. Проверьте консоль разработчика на наличие ошибок.

  3. Проблемы с доступом к WP REST API:
    Проверьте, есть ли необходимость в дополнительной авторизации для выполнения AJAX-запросов. Для незарегистрированных пользователей важно убедиться, что ng_load_posts() правильно обрабатывает такие запросы. Добавьте логи или отладочные сообщения для отслеживания выполнения функции.

  4. Конфликты с другими плагинами:
    Несмотря на то, что вы уже пробовали отключать плагины, стоит убедиться, что в вашей теме нет стилей или скриптов, которые могли бы конфликтовать с AJAX-запросами. Временно переключитесь на стандартную тему (например, Twenty Twenty-One), чтобы проверить, сохраняется ли проблема.

  5. Кэширование:
    Если у вас включены плагины кэширования или CDN, попробуйте очистить кэш. Иногда изменения не отражаются из-за проблем с кэшированием.

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

Дополнительные советы

  • Отладка: В функции ng_load_posts() добавьте error_log() для записи ошибок или результатов запроса, чтобы лучше понять, что происходит в процессе обработки запроса.

  • Безопасность: Убедитесь, что вы добавили проверки check_ajax_referer() для защиты от CSRF-атак, что важно, особенно если запросы обрабатываются для незарегистрированных пользователей.

Заключение

Проблемы с AJAX-запросами для незарегистрированных пользователей в WordPress могут быть вызваны несколькими факторами: конфликты имен, кэширование, ошибки в коде и даже проблемы с доступом к API. Я рекомендую внимательно проверить каждое из упомянутых направлений и провести отладку, чтобы понять, в чем именно заключается проблема. В большинстве случаев изменения названий параметров и тщательная отладка функции ng_load_posts() решают проблему.

Оцените материал
Добавить комментарий

Капча загружается...