web-dev-qa-db-fra.com

Comment ajouter la balise defer = "defer" dans les javascripts de plugins?

Je ne pouvais pas ajouter de tag différé dans les javascripts de plugins. Le test pagespeed des développeurs Google me suggère d’ajouter une étiquette de report dans formulaire de contact 7 javascripts.

C'est ainsi que le formulaire de contact 7 inclut le javascript dans l'en-tête.

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

Maintenant, comment ajouter defer = "defer" tag dans le code ci-dessus?

27
Giri

Depuis WordPress 4.1, il existe un filtre: script_loader_tag . Vous pouvez l'utiliser pour trouver le bon script:

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

Ancienne réponse

Il n'y a pas de filtre dédié disponible… au moins je ne peux pas en voir un. Mais …

  • wp_print_scripts() appelle WP_Scripts->do_items()
  • qui appelle WP_Scripts->do_item()
  • qui utilise esc_url()
  • qui fait offre un filtre: 'clean_url'.

Et c'est reparti:

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

Mise en garde: pas testé, juste une idée. :)

Mettre à jour

J'ai écrit et testé un plugin avec ce code. Voir https://Gist.github.com/1584783

54
fuxia