wok
  • 0
Учитель

Это плохая реализация wp_enqueue_script для условного использования?

  • 0

Условное включение скриптов, будь то js или css, в заголовке документа xhtml… было, как правило, сложной задачей, особенно если вы хотите поставить что-то в очередь на основе шорткода, пользовательского метаполя или виджета.

Если вы точно знаете, что вам нужен ваш скрипт, вы просто сделаете то, что предлагает Кодекс WordPress, используя wp_enqueue_script со следующими хуками:

* init
* template_redirect
* admin_print_scripts

Но иногда вам требуется более тонкое включение скрипта или таблицы стилей. Включение скриптов на основе, например, шорткодов. Проблема с короткими кодами заключается в том, что вы не можете точно определить, использовался ли короткий код, если только вы не примените strpos() к содержимому. Причина этого в том, что хуки «init» + «template_redirect» + «admin_print_scripts» срабатывают до того, как объект WP_Query установлен, я полагаю. Таким образом, условное включение сценариев для шорткодов и других триггеров может оказаться сложным.

Чтобы обойти это, вы можете использовать strpos() с хуком ‘the_posts’, который срабатывает до wp_head. Но одним из недостатков является то, что это дополнительный проход по данным.

Обсуждается на http://beerpla.net/2010/01/13/wordpress-plugin-development-how-to-include-css-and-javascript-conditionally-and-only-when-needed-by-the-posts/

Кроме того, я не видел примеров этих сценариев постановки в очередь, когда этот хук мог бы вводить js или css в заголовок документа.

Scribu предлагает использовать переменную флага и отправлять ее в нижний колонтитул, http://scribu.net/wordpress/optimal-script-loading.html… но это невозможно для таблиц стилей css, которые должны быть включены в голову часть документа

Я обдумывал наилучший компромисс и хотел узнать ваше мнение. в основном, я выбираю хук wp_head, потому что у меня есть доступ к объекту WP_Query, если мне нужно найти шорткод, или использовать условный тег, или даже обнаружение использования виджета. Если я знаю, что мне нужно внедрить css или js, то я могу просто вызвать функцию wp_print_scripts() после выяснения, нужны ли странице мои js или css.

Вот структура для включения скрипта в WP 3.1… я успешно использовал ее для включения js. Еще не пробовал его для CSS, но я подозреваю, что он будет работать так же.

add_action("wp_head","add_conditional_scripts", 20);
function add_conditional_scripts() {
   global $posts, $wp_scripts;

    foreach ($posts as $post) { 
        if ( condition_gets_met == true ) : 
            wp_enqueue_script( "scripthandle" , get_home_url().'/js/scriptfilename.js, array('jcycle'), '1.0', true);   // This will add to the $wp_scripts variable
        endif;
    }

   wp_print_scripts(); // This uses the $wp_script object, will print, out the newly enqueue script
}

Обратите внимание, что *condition_gets_met заменяет проверку strpos, условный тег или проверку custom_meta_field.

Любая обратная связь или критика по этому поводу были бы замечательными.

Share
  1. Чтобы обойти это, вы можете использовать хук strpos() with the_posts, который срабатывает до wp_head. Но одним из недостатков является то, что это дополнительный проход по данным.

    По сути, вы делаете то же самое внутри обратного вызова, к которому вы подключаетесь wp_head, я не вижу разницы.. (пожалуйста, уточните, если вы думаете иначе)..

    Независимо от того, подключаетесь ли вы the_posts или wp_head продолжаете повторять одни и те же данные массива, т.е. $posts ..

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

    На самом деле я использую этот подход в плагине, который я жду, чтобы выпустить, и я также понял, что метод, о котором сообщил Scribu, на самом деле не работает, когда вы используете CSS, который не может идти в ногу. Scribu упомянул, что возможно внедрение CSS в голову с помощью JS, но лично я нахожу это несколько хакерским (мое личное мнение).

    У меня есть функция, the_posts которая работает так.

    public function on_the_posts( $posts ) {
    
        if( empty( $posts ) || $this->has_tabs )
            return $posts;
    
        // trimmed code not relevant to the example
    
        foreach( $posts as $post ) {
            if( !stripos( $post->post_content, '[end_tabset]' ) )
                continue;
            $this->has_tabs = true;
        }
    
        return $posts;
    }
    

    Как это будет отличаться внутри обратного вызова wp_head, мне все равно нужно будет повторить итерацию $posts, не так ли?

    Это плохая реализация wp_enqueue_script для условного использования?

    Нет, лично я так не думаю.

    • 0
    • Я верю, что вы правы, кажется, я все еще перебираю переменную $posts в своей ситуации. Мне нравится метод scribu, но я предпочитаю выводить свои скрипты и css вверху документа. Внедрение css через js для меня немного запутано. Итак, мой метод, кажется, работает на данный момент, просто хотел посмотреть, есть ли потенциальные подводные камни…

      • 0
    • Я попробовал wp_enqueue_scripts вместо wp_head, и по какой-то причине не смог заставить его выводить мои скрипты.

      • 0
    • @Wok его не следует использовать для вывода, его следует использовать для постановки в очередь, чтобы WP сам выводил ваши материалы немного позже.

      • 0
    • Я не вывожу вручную, я использую wp_enqueue_scripts в моем примере кода выше. У меня есть случаи, когда я хочу только условно поставить скрипт в очередь после того, как выясню, использовался ли шорткод. Но он не будет выводиться в html, если я использую wp_enqueue_scripts после установки объекта WP_Query. Если у вас есть пример кода с использованием wp_enqueue_scripts, я мог бы попробовать, это было бы здорово.

      • 0
    • @Wok Я имел в виду вывод, как при вызове wp_print_scripts(), чего обычно делать не следует.

      • 0
  2. Для таких вещей есть wp_enqueue_scripts действие, которое срабатывает рано (приоритет 1) внутри wp_head . Это достаточно поздно для любых условий, которые могут вам понадобиться для работы, но раньше, чем выводятся в очередь сценарии/стили.

    • 0
  3. Просто чтобы добавить к другим ответам, если пользователь включает ваш шорткод в файлы своих тем с помощью этой do_shortcode функции, ваши скрипты/css не будут загружаться.

    • 0

Оставить ответ

You must login to add an answer.