Откуда ошибка AjaxURL has NOT been defined при поиске в wordpress?
Доброго дня!
Ковыряюсь с адаптацией поиска на сайте. Сделал нехитрую сортировку результатов по категориям через
<?php ip_search_filter_item_class('post'); ?>" href="<?php echo home_url(); ?>?s=<?php echo get_search_query(); ?>&cat=1"> |
<?php ip_search_filter_item_class('post'); ?>" href="<?php echo home_url(); ?>?s=<?php echo get_search_query(); ?>&cat=1">
Всё работает. Но! Есть забавный глюк. Все запросы ищутся нормально, но если поискать фразу "Бухгалтерия" или "Бухгалтерия 8", то вылезает ошибка "AjaxURL has NOT been defined".
Подскажите пожалуйста, о чём это вообще говорит и почему только такой запрос вызывает глюки? Кстати, ошибка вылезает только если ты в админке. Если из админки выходишь, то почему-то меняется разметка страницы и срабатывает поисковый запрос.
П.с.: Нашёл как избавиться от ошибки. Нужен такой код, определяющий урл.
<? /*defined ajax url*/ add_action('wp_head', 'wordpress_frontend_ajaxurl'); function wordpress_frontend_ajaxurl() { echo '<script type="text/javascript"> var ajaxurl = "' . admin_url('admin-ajax.php') . '"; </script>'; }?> |
<? /*defined ajax url*/ add_action('wp_head', 'wordpress_frontend_ajaxurl'); function wordpress_frontend_ajaxurl() { echo '<script type="text/javascript"> var ajaxurl = "' . admin_url('admin-ajax.php') . '"; </script>'; }?>
Но вопрос остался)) Ошибка пропала но плывёт разметка страницы. Именно при ЭТОМ запросе. Как спасаться? :)
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка
AjaxURL has NOT been definedозначает, что какой-то JavaScript ожидает глобальную переменнуюajaxurlилиAjaxURL, но она не была объявлена на странице. В админке WordPress переменнаяajaxurlобычно есть, а на фронте её нужно передавать самостоятельно. Если ошибка появляется только при конкретном запросе, вероятно, в выдачу попадает блок/скрипт, который использует AJAX и подключается не всегда.Правильный способ передать URL AJAX на фронт:
add_action('wp_enqueue_scripts', function () { wp_enqueue_script( 'site-search', get_template_directory_uri() . '/assets/js/search.js', ['jquery'], '1.0', true ); wp_localize_script('site-search', 'SiteAjax', [ 'url' => admin_url('admin-ajax.php'), ]); });
В JS используйте переданный объект:
jQuery.post(SiteAjax.url, { action: 'my_search', query: searchQuery });jQuery.post(SiteAjax.url, { action: 'my_search', query: searchQuery });
Если старый скрипт требует именно
AjaxURL, можно временно добавить совместимость:wp_localize_script('site-search', 'AjaxURL', admin_url('admin-ajax.php'));
Но лучше привести код к одному формату. Также проверьте, не ломает ли запрос «Бухгалтерия» HTML-разметку: кириллица в URL должна проходить через
urlencode()илиadd_query_arg(), а не склеиваться вручную. Ссылку поиска формируйте так:echo esc_url(add_query_arg([ 's' => get_search_query(), 'cat' => 1, ], home_url('/')));
И ещё проверьте регистр имени переменной.
ajaxurl,AjaxURLиajaxURLдля JavaScript являются разными именами. Если один скрипт создаётajaxurl, а другой ждётAjaxURL, ошибка останется. Быстрее всего это видно в консоли: выполнитеtypeof ajaxurlиtypeof AjaxURLна проблемной странице.