add_action внутри функции - возможно ли это?
Я пытаюсь добавить JavaScript в head с помощью add_action('wp_head', 'js_func');
, что работает, когда код размещается сразу после функции. Однако мне нужно, чтобы он добавлялся только на соответствующую страницу, а не на все. Я пытаюсь сделать это так:
function things_to_do_on_this_page() {
add_action('wp_head', 'js_func');
// другие действия функции
}
Но при таком вызове JavaScript вообще не добавляется, что ломает страницу.
Возможно ли так делать?
Если вам нужно определить, находитесь ли вы на определённой странице, записи, в архиве категории и т.д., то в ядре WordPress для этого есть Условные теги.
Если вы хотите подключить определение js-скрипта, то лучше сделать это следующим образом:
// Предполагаем, что вы помещаете свой js-код в отдельный файл, а не просто между тегами <script>
// 1-й шаг: Регистрация во время хука init
function add_my_script()
{
wp_register_script( $name, $url, $dependency, filemtime( $path ), true )
}
add_action( 'init', 'add_my_script' );
// 2-й шаг: Добавление в очередь во время хука enqueue
function enqueue_my_script()
{
// Выберите свои условия:
// В админке проверяем через "global $hook_suffix, $pagenow, $typenow"
if ( 'post-new.php' !== $typenow )
return;
// На публичных страницах выбираем условия из списка Условных тегов
// Пример: Только на страницах
if ( ! is_page() )
return;
// ...На странице входа ничего не делаем
// Выводим скрипт на экран
wp_enqueue_script( $name );
}
// Выбираем, где он нужен
add_action( 'wp_enqueue_scripts', 'enqueue_my_script' );
add_action( 'admin_enqueue_scripts', 'enqueue_my_script' );
add_action( 'login_enqueue_scripts', 'enqueue_my_script' );
РЕДАКТИРОВАНИЕ
Вы можете объединить/собрать все свои небольшие функции, которые где-то подключаются, и поместить вызовы add_action
в функцию, которая загружается при первом доступном для тем хуке: after_setup_theme
. Важно, что сначала загружается functions.php дочерней темы, затем родительской темы, а затем хук after_setup_theme
. Таким образом, вы оставляете возможность изменять вещи из родительской или дочерней темы.
function theme_bootstrap_fn()
{
add_action( 'wp_head', 'js_func' );
// другие функциональные вещи
}
add_action( 'after_setup_theme', 'theme_bootstrap_fn' );
// Определяем вашу функцию:
function js_func()
{
echo "
<script type='text/javascript'>
// делаем что-то
// Добавляем переменные вот так:
{$some_var}
</script>";
}
Но чтобы ответить на ваш вопрос: Да, вы можете вызывать любую глобальную функцию внутри другой функции.

У меня есть скрипт, это просто "отдельный" кусок кода, который я хочу добавить для отображения и скрытия div'ов в зависимости от чекбокса, так что мне не нужно подключать все скрипты, а просто поместить его на страницу, когда вызывается эта конкретная функция.
