Wie füge ich das Tag defer = "defer" in die Java-Skripte des Plugins ein?

28

Ich konnte in Java-Skripten des Plugins kein defer-Tag hinzufügen. Der Pagespeed-Test des Google-Entwicklers schlägt vor, in Kontaktformular 7 javascripts das Tag defer hinzuzufügen .

So enthält das Kontaktformular 7 Javascript in der Kopfzeile.

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

Wie fügt man nun das Tag defer = "defer" im obigen Code hinzu?

Giri
quelle
2
Relevantes Ticket: core.trac.wordpress.org/ticket/12009
scribu
1
Schöne Frage @Viruthagiri.
Ramkumar M

Antworten:

56

Ab Wordpress 4.1 gibt es einen Filter: script_loader_tag. Sie können es verwenden, um das richtige Skript zu finden:

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

Alte Antwort

Es ist kein dedizierter Filter verfügbar. Wenigstens kann ich keinen sehen. Aber …

  • wp_print_scripts() Anrufe WP_Scripts->do_items()
  • welche ruft WP_Scripts->do_item()
  • welche verwendet esc_url()
  • das macht einen Filter bieten:'clean_url' .

Und es geht los:

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

Einschränkung: nicht getestet, nur eine Idee. :)

Aktualisieren

Ich habe ein Plugin mit diesem Code geschrieben und getestet . Siehe https://gist.github.com/1584783

fuxia
quelle
Dies ist auch perfekt für die Verwendung mit Daten-Main in Requiredjs
Nicola Peluchetti
Das ist ein netter Hack und so einfach. Ich denke, es wäre auch gut, wenn Sie bei Bedarf charset = 'utf-8' hinzufügen!
webaware
Großartig, aber warum: Muss ein 'sein, nicht "!?
Henrywright
@henrywright WordPress fügt 'auf beiden Seiten des zurückgegebenen Strings ein, "was zu ungültigem HTML führen würde.
fuxia
2
Wahrscheinlich ist eine gute Idee für den Fall, dass jemand dies für die Arbeit mit anderen Skripten verwenden möchte, sicherzustellen, dass es nur für die Verwendung am Ende der Schriftart gültig ist. Vielleicht if( ! is_admin() ){}bereitet Ihnen die Verwendung beliebter Plugins wie ACF Kopfzerbrechen.
Crissoca