Как добавить тег defer = «defer» в плагин javascripts?

29

Я не мог добавить тег отсрочки в плагин javascripts. Тест на скорость страницы для разработчиков Google предлагает мне добавить тег отсрочки в контактную форму 7 javascripts.

Вот как контактная форма 7 включает в заголовок javascript.

add_action( 'wp_enqueue_scripts', 'wpcf7_enqueue_scripts' );

function wpcf7_enqueue_scripts() {
    // jquery.form.js originally bundled with WordPress is out of date and deprecated
    // so we need to deregister it and re-register the latest one
    wp_deregister_script( 'jquery-form' );
    wp_register_script( 'jquery-form', wpcf7_plugin_url( 'jquery.form.js' ),
        array( 'jquery' ), '2.52', true );

    $in_footer = true;
    if ( 'header' === WPCF7_LOAD_JS )
        $in_footer = false;

    wp_enqueue_script( 'contact-form-7', wpcf7_plugin_url( 'scripts.js' ),
        array( 'jquery', 'jquery-form' ), WPCF7_VERSION, $in_footer );

    do_action( 'wpcf7_enqueue_scripts' );
}

Теперь, как добавить тег defer = "defer" в коде выше?

Гири
источник
2
Соответствующий билет: core.trac.wordpress.org/ticket/12009
scribu
1
Хороший вопрос @Viruthagiri.
Ramkumar M

Ответы:

57

На WordPress 4.1 есть фильтр script_loader_tag. Вы можете использовать его, чтобы найти правильный скрипт:

add_filter( 'script_loader_tag', function ( $tag, $handle ) {

    if ( 'contact-form-7' !== $handle )
        return $tag;

    return str_replace( ' src', ' defer="defer" src', $tag );
}, 10, 2 );

Старый ответ

Нет выделенного фильтра ... по крайней мере, я его не вижу. Но …

  • wp_print_scripts() звонки WP_Scripts->do_items()
  • какие звонки WP_Scripts->do_item()
  • который использует esc_url()
  • который делает предлагают фильтр: 'clean_url'.

И здесь мы идем:

function add_defer_to_cf7( $url )
{
    if ( FALSE === strpos( $url, 'contact-form-7' )
      or FALSE === strpos( $url, '.js' )
    )
    { // not our file
        return $url;
    }
    // Must be a ', not "!
    return "$url' defer='defer";
}
add_filter( 'clean_url', 'add_defer_to_cf7', 11, 1 );

Предостережение: не проверено, просто идея. :)

Обновить

Я написал и протестировал плагин с этим кодом. Смотрите https://gist.github.com/1584783

Фуксия
источник
Это также идеально подходит для использования с data-main в requirejs
Никола Пелучетти
Это хороший хак, и все так просто. Я считаю, что было бы хорошо добавить charset = 'utf-8', когда это необходимо!
веб-ПО
Прекрасно
@henrywright WordPress добавить 'с обеих сторон возвращаемой строки, "что приведет к неверному HTML.
fuxia
2
Вероятно, хорошей идеей в том случае, если кто-то захочет включить это для работы с другими сценариями, будет убедиться, что проверка его использования только на конце шрифта, возможно, использование if( ! is_admin() ){}популярных плагинов, таких как ACF, может вызвать головную боль.
Криссока