is_admin () возвращает true при использовании admin-ajax.php из скрипта переднего конца

Была ситуация сегодня, когда я использовал adminajax.php из скрипта переднего конца. Насколько я понимаю, это способ wp для создания ajax-вызовов (регистрация моей функции с помощью wp_ajax_nopriv_myfunction)

Мне кажется, что, поскольку admin-ajax.php находится на стороне администратора, is_admin () возвращает true, тогда как мой скрипт вызывает его с передней стороны.

Это вызывает проблему с плагином, который я использую, что делает вещи по-разному на передней и административной стороне вещей.

Поэтому мне было интересно, что я делаю что-то неправильно

есть ли способ использовать ajax в интерфейсе wp и иметь is_admin () для возврата false?

надеюсь, я мог бы понять себя

WordPress устанавливает is_admin() в true для всех запросов ajax (front-end или admin-side). (См. Код ).

Там нет далеко от этого (и вы не должны так или иначе). Если ваш запрос ajax может быть запущен как с интерфейсной, так и с административной стороны, тогда вы можете указать, является ли он «администратором» или нет, когда вы публикуете данные. Но без каких-либо подробностей о «проблемах», связанных с вашим подключаемым модулем, трудно предложить работу-aroudn.

Я знаю, что это старо, но на случай, если кто-нибудь еще споткнется об этом …

то, что я обычно делаю, это установить какой-то флаг в моих интерфейсных формах, чтобы обозначить, что входящий запрос является ajax.

 <input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" /> 

Первоначально это значение установлено в значение «false», после чего я переключается на «true», когда начинает обрабатывать ajax.

 $('#my_ajax_flag').val('true'); // example using jQuery 

затем в админке моего кода, я проверяю этот параметр, а затем либо включаю в себя мои ajax-крючки, либо выполняю обычные регулярные атрибуты администратора, отличные от ajax. Так, например:

 if ( isset( $_REQUEST['my_ajax_flag'] ) && $_REQUEST['my_ajax_flag'] == 'true' ) { add_action('wp_ajax_my_ajax_function', 'my_ajax_function'); add_action('wp_ajax_no_priv_my_ajax_function', 'my_ajax_function'); } else { // regular non-ajax stuff } 

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

Другая рекомендация, которая может быть удобной, – это установить в ваших формах атрибут «noheader» WordPress.

 <input type="hidden" name="noheader" value="true" /> 

при обработке бэкэнд, что в конечном итоге приводит к переадресации (рекомендуется избегать опасного представления двойной формы), в редких случаях, когда вам нужно получить доступ к wp-крючкам, которые обычно возникают после «уже отправленных заголовков».