Làm cách nào để thêm thẻ defer = hung defer trong thẻ javascripts?


28

Tôi không thể thêm thẻ defer trong plugin javascripts. Kiểm tra tốc độ trang của nhà phát triển Google đề nghị tôi thêm thẻ trì hoãn trong biểu mẫu liên hệ 7 javascripts.

Đây là cách liên hệ mẫu 7 bao gồm javascript trong tiêu đề.

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

Bây giờ làm thế nào để thêm thẻ defer = "defer" trong đoạn mã trên?



1
Câu hỏi hay @Viruthagiri.
Ramkumar M

Câu trả lời:


56

Kể từ WordPress 4.1, có một bộ lọc : script_loader_tag. Bạn có thể sử dụng nó để tìm tập lệnh chính xác:

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

Câu trả lời cũ

Không có bộ lọc chuyên dụng có sẵn, ít nhất tôi không thể nhìn thấy một bộ lọc. Nhưng …

  • wp_print_scripts() cuộc gọi WP_Scripts->do_items()
  • mà gọi WP_Scripts->do_item()
  • sử dụng esc_url()
  • không đưa ra một bộ lọc: 'clean_url'.

Và ở đây chúng tôi đi:

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

Hãy cẩn thận: không được thử nghiệm, chỉ là một ý tưởng. :)

Cập nhật

Tôi đã viết và thử nghiệm một plugin với mã này. Xem https://gist.github.com/1584783


Điều này cũng hoàn hảo để sử dụng với dữ liệu chính trong các yêu cầu
Nicola Peluchetti

Đó là một bản hack hay và đơn giản. Tôi cho rằng nó cũng tốt khi thêm bộ ký tự = 'utf-8' khi cần thiết!
web biết

Tuyệt vời, nhưng tại sao: Phải là một ', không phải "!?
henrywright

@henrywright WordPress thêm 'vào cả hai phía của chuỗi được trả về, một "kết quả sẽ dẫn đến HTML không hợp lệ.
fuxia

2
Có lẽ một ý tưởng tốt trong trường hợp ai đó muốn biến điều này thành hoạt động với các tập lệnh khác sẽ là đảm bảo xác thực để chỉ sử dụng nó ở đầu phông chữ có thể sử dụng if( ! is_admin() ){}các plugin phổ biến như ACF có thể khiến bạn đau đầu.
crissoca
Licensed under cc by-sa 3.0 with attribution required.