add_action внутри функции - возможно ли это?

20 мар. 2012 г., 05:37:49
Просмотры: 18K
Голосов: 6

Я пытаюсь добавить JavaScript в head с помощью add_action('wp_head', 'js_func');, что работает, когда код размещается сразу после функции. Однако мне нужно, чтобы он добавлялся только на соответствующую страницу, а не на все. Я пытаюсь сделать это так:

function things_to_do_on_this_page() {
    add_action('wp_head', 'js_func');
    // другие действия функции
}

Но при таком вызове JavaScript вообще не добавляется, что ломает страницу.

Возможно ли так делать?

2
Комментарии

на каком этапе обработки запроса вы вызываете эту функцию?

Milo Milo
20 мар. 2012 г. 05:55:58

Было бы полезнее, если бы вы переформулировали свой вопрос и спросили как подключить действие условно. Также укажите: при каких условиях вы хотите добавлять этот скрипт?

Chip Bennett Chip Bennett
20 мар. 2012 г. 17:02:08
Все ответы на вопрос 1
2

Если вам нужно определить, находитесь ли вы на определённой странице, записи, в архиве категории и т.д., то в ядре 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>";
}

Но чтобы ответить на ваш вопрос: Да, вы можете вызывать любую глобальную функцию внутри другой функции.

20 мар. 2012 г. 06:00:23
Комментарии

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

Joshua Joshua
20 мар. 2012 г. 07:48:19

@Joshua Возможно, позже ты добавишь ещё js, так что imho это никогда не будет лишним. Если ты используешь плагины вроде Cachify, то файлы собираются и объединяются в один, так что это не имеет значения. Но: Смотри правку.

kaiser kaiser
20 мар. 2012 г. 16:54:09