Вопрос или проблема
Я знаю, что этот вопрос обсуждался много раз, но я думаю, что попробовал большую часть советов.
Вот мой код:
$.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()
.
Потенциальные проблемы
-
Параметры запроса:
Упоминание о том, что "некоторые магические параметры" могут вызвать проблемы, абсолютно справедливо. Рекомендуется изменить названия параметров, чтобы избежать конфликтов. Например, вместоauthor
иcat
попробуйте использовать префиксы, напримерmyplugin_author
иmyplugin_cat
.{'action': 'load_posts', 'offset': offset, 'myplugin_author': <?php echo $uid?>, 'myplugin_cat': '<?php echo $category->name?>', ... }
-
Кросс-доменные запросы:
Убедитесь, что ваш AJAX-запрос не блокируется политиками безопасности браузеров, особенно если вы работаете на локальном сервере или с различными доменами. Проверьте консоль разработчика на наличие ошибок. -
Проблемы с доступом к WP REST API:
Проверьте, есть ли необходимость в дополнительной авторизации для выполнения AJAX-запросов. Для незарегистрированных пользователей важно убедиться, чтоng_load_posts()
правильно обрабатывает такие запросы. Добавьте логи или отладочные сообщения для отслеживания выполнения функции. -
Конфликты с другими плагинами:
Несмотря на то, что вы уже пробовали отключать плагины, стоит убедиться, что в вашей теме нет стилей или скриптов, которые могли бы конфликтовать с AJAX-запросами. Временно переключитесь на стандартную тему (например, Twenty Twenty-One), чтобы проверить, сохраняется ли проблема. -
Кэширование:
Если у вас включены плагины кэширования или CDN, попробуйте очистить кэш. Иногда изменения не отражаются из-за проблем с кэшированием. -
Ошибки в JavaScript:
Проверьте наличие ошибок в консоли разработчика. Любые ошибки в JavaScript могут прервать выполнение запроса, поэтому важно убедиться в отсутствии такой проблемы.
Дополнительные советы
-
Отладка: В функции
ng_load_posts()
добавьтеerror_log()
для записи ошибок или результатов запроса, чтобы лучше понять, что происходит в процессе обработки запроса. -
Безопасность: Убедитесь, что вы добавили проверки
check_ajax_referer()
для защиты от CSRF-атак, что важно, особенно если запросы обрабатываются для незарегистрированных пользователей.
Заключение
Проблемы с AJAX-запросами для незарегистрированных пользователей в WordPress могут быть вызваны несколькими факторами: конфликты имен, кэширование, ошибки в коде и даже проблемы с доступом к API. Я рекомендую внимательно проверить каждое из упомянутых направлений и провести отладку, чтобы понять, в чем именно заключается проблема. В большинстве случаев изменения названий параметров и тщательная отладка функции ng_load_posts()
решают проблему.