Как проверить находимся ли мы в админке или во фронтенде?
Как проверить находимся ли мы в админке или во фронтенде?
Я хочу добавить add_action не в админке, а только во фронтенде.

Ознакомьтесь с is_admin()
условным тегом:
function wpse106895_dummy_func() {
if ( ! is_admin() ) {
// выполняем нужные действия
}
}
add_action( 'some-hook', 'wpse106895_dummy_func' );
is_admin()
возвращает true, если запрашивается URL в админ-панели / wp-admin. Следовательно, его отрицание (через оператор not) возвращает true для фронтенда.
Обновление, см. комментарии ниже:
function wpse106895_dummy_func() {
// выполняем нужные действия
}
if ( ! is_admin() ) add_action( 'some-hook', 'wpse106895_dummy_func' );
Это поможет снизить нагрузку.

if ( is_admin() ) add_action()
. Не заполняйте массив фильтров значениями, которые вам никогда не понадобятся.

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

! is_admin()
возвращает true для wp-admin
и wp-login.php
, так что это не проверка для фронтенда

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

В продолжение того, что упомянул @janw, настоящая проверка фронтенда будет выглядеть так ( ! is_admin() || wp_doing_ajax() ) && ! wp_doing_cron()

Бэкенд и фронтенд в современном вебе — это скорее состояние сознания, чем строгое разделение по URL-шаблонам или коду. Отнесение конкретной страницы к бэкенду или фронтенду может меняться в зависимости от типа пользователя, который её просматривает.
В контексте WordPress вопрос можно переформулировать как "Я хочу добавить действие при генерации HTML темы" (что может охватывать или не охватывать всю генерацию фронтенда в вашем конкретном случае). Для этого лучше всего использовать хук template_redirect
, который срабатывает непосредственно перед тем, как WordPress решает, какой шаблон темы использовать для генерации HTML.

К сожалению, функция is_admin()
не работает корректно, если вам нужно проверить в Widget::widget()
, выполняется ли код на фронтенде или в админке.
Из-за этого возникает проблема с различием отображения виджета на блоге и на подстранице админки widget.php
. На странице виджетов widgets.php
в админке превью виджета выводится через HTML-тег <iframe>
, поэтому is_admin()
не является хорошим решением в данном случае.
Так как в WordPress нет функции is_front_end()
, интересным решением будет создать функцию, которая проверяет, были ли вызваны функции get_header()
и get_footer()
в текущем запросе. Простая функция.
<?php
function is_front_end() {
if ( did_action( 'get_header' ) || did_action( 'get_footer' ) )
return true;
}
?>
Идея благодаря ответу @TheDeadMedic:
