Como adicionar a marca defer = "adiar" nos javascripts do plugin?

29

Não pude adicionar a tag deferir nos javascripts do plug-in. O teste de velocidade da página do desenvolvedor do Google sugere que eu adicione a tag deferida no formulário de contato 7 javascripts.

É assim que o formulário de contato 7 inclui javascript no cabeçalho.

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' );
}

Agora, como adicionar a marca defer = "defer" no código acima?

Giri
fonte
2
Ticket relevante: core.trac.wordpress.org/ticket/12009
scribu 9/01/12
1
Boa pergunta @Viruthagiri.
Ramkumar M

Respostas:

57

A partir do WordPress 4.1, há um filtro: script_loader_tag. Você pode usá-lo para encontrar o script correto:

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 );

Resposta antiga

Não há filtro dedicado disponível ... pelo menos não consigo ver um. Mas …

  • wp_print_scripts() chamadas WP_Scripts->do_items()
  • que chama WP_Scripts->do_item()
  • que usa esc_url()
  • que faz oferecer um filtro: 'clean_url'.

E aqui vamos nós:

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 );

Advertência: não testado, apenas uma idéia. :)

Atualizar

Eu escrevi e testei um plugin com este código. Consulte https://gist.github.com/1584783

fuxia
fonte
Isto é perfeito também para usar com dados principal em RequireJS
Nicola Peluchetti
É um truque agradável e simples. Eu acho que seria bom também adicionar charset = 'utf-8' quando necessário!
Webaware
Ótimo, mas por que: deve ser um ', não "!?
henrywright
@henrywright WordPress adicionar 'nos dois lados da string retornada, "resultaria em HTML inválido.
Fuxia
2
Provavelmente, uma boa idéia, caso alguém queira que isso funcione com outros scripts, será validar para usá-lo apenas no final da fonte, talvez usando if( ! is_admin() ){}plugins populares como o ACF possa causar dor de cabeça.
Crissoca 28/04