Làm cách nào để thêm crossorigin và tính toàn vẹn cho wp_register_style? (Phông chữ tuyệt vời 5)


10

Tôi đang nâng cấp Font Awesome 4 lên phiên bản 5, giới thiệu cả thuộc tính toàn vẹn và thuộc tính chéo cho <link rel="stylesheet">đánh dấu.

Hiện tại, tôi đang sử dụng:

wp_register_style('FontAwesome', 'https://example.com/font-awesome.min.css', array(), null, 'all' );
wp_enqueue_style('FontAwesome');

Đầu ra nào là:

<link rel="stylesheet" id="FontAwesome-css" href="https://example.com/font-awesome.min.css" type="text/css" media="all" />

Với Font Awesome 5, nó giới thiệu hai thuộc tính và giá trị mới ( integritycrossorigin), vd:

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">

Vì vậy, tôi cần tìm hiểu làm thế nào tôi có thể thêm cả tính toàn vẹn và chéo cho wp_register_style, tôi đã thử nhưng những nỗ lực sử dụng của tôi wp_style_add_datađã thất bại, có vẻ như phương pháp này chỉ hỗ trợ conditional, rtlsuffix, alttitle.



Cảm ơn @JacobPeattie, câu hỏi hơi khác một chút nhưng câu trả lời có thể được áp dụng trong trường hợp này. Tuy nhiên, nó bắt đầu từ năm 2016, có lẽ bây giờ có một cách có vẻ ít hack hơn ...
Pipo

@Pipo Tôi là một nhà phát triển WordPress và đã tạo ra một vài plugin WordPress, tôi sử dụng style_loader_tag và script_loader_tag rất nhiều để thực hiện tải tùy chỉnh. Thậm chí thêm defer và async vào thẻ script của tôi. Xem một trong những plugin nguồn mở của tôi: github.com/Remzi1993/wp-jquery-manager
Remzi Cavdar

@Pipo Bạn cũng đúng. Các bài đăng khác đã lỗi thời và nó sẽ không hoạt động nữa. Trong ví dụ đầu tiên của tôi, tôi đã trình bày cách bạn có thể làm điều này với một chuỗi thay thế đơn giản. Tôi cũng đã cung cấp thêm một chút thông tin để người khác có thể sử dụng thông tin này
Remzi Cavdar

@JacobPeattie Bạn có thể xem qua không? Tôi có thể có một số lỗi ngữ pháp, tiếng Anh là ngôn ngữ thứ hai của tôi
Remzi Cavdar

Câu trả lời:


15

style_loader_tag
style_loader_tag là một API WordPress chính thức, xem tài liệu: https://developer.wordpress.org/reference/hooks/style_loader_tag/

apply_filters( 'style_loader_tag', $html, $handle, $href, $media )
Lọc thẻ liên kết HTML theo kiểu mê hoặc.


Trước tiên hãy liệt kê biểu định kiểu của bạn, xem tài liệu: https://developer.wordpress.org/reference/fifts/wp_enqueue_style/

wp_enqueue_style( 'font-awesome-5', 'https://use.fontawesome.com/releases/v5.5.0/css/all.css', array(), null );

Các $handle'font-awesome-5'
tôi làm nullnhư vậy là không có số phiên bản. Bằng cách này, nó sẽ được lưu trữ.

Chuỗi
đơn giản Một chuỗi thông số đơn giản là đủ để đạt được những gì bạn muốn, xem ví dụ dưới đây

function add_font_awesome_5_cdn_attributes( $html, $handle ) {
    if ( 'font-awesome-5' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU' crossorigin='anonymous'", $html );
    }
    return $html;
}
add_filter( 'style_loader_tag', 'add_font_awesome_5_cdn_attributes', 10, 2 );


Thêm các thuộc tính khác nhau
Bên dưới một ví dụ để thêm các thuộc tính khác nhau cho (nhiều) biểu định kiểu khác nhau

function add_style_attributes( $html, $handle ) {

    if ( 'font-awesome-5' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU' crossorigin='anonymous'", $html );
    }

    if ( 'another-style' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='blajbsf' example", $html );
    }

    if ( 'bootstrap-css' === $handle ) {
        return str_replace( "media='all'", "media='all' integrity='something-different' crossorigin='anonymous'", $html );
    }

    return $html;
}
add_filter( 'style_loader_tag', 'add_style_attributes', 10, 2 );


Thêm thuộc tính cho tất cả các kiểu
Bên dưới một ví dụ để thêm các thuộc tính giống nhau cho nhiều hơn một biểu định kiểu

function add_attributes_to_all_styles( $html, $handle ) {

        // add style handles to the array below
        $styles = array(
            'font-awesome-5',
            'another-style',
            'bootstrap-css'
        );

        foreach ( $styles as $style ) {
            if ( $style === $handle ) {
                return str_replace( "media='all'", "media='all' integrity='sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU' crossorigin='anonymous'", $html );
            }
        }

        return $html;
}
add_filter( 'style_loader_tag', 'add_attributes_to_all_styles', 10, 2 );




script_loader_tag
Tôi cũng muốn giải thích về script_loader_tag, bởi vì điều này cũng tiện dụng, nhưng API này hoạt động kết hợp với wp_enqueue_script .

API script_loader_tag gần như giống nhau, chỉ có một số khác biệt nhỏ, xem tài liệu: https://developer.wordpress.org/reference/hooks/script_loader_tag/

apply_filters( 'script_loader_tag', $tag, $handle, $src )
Lọc thẻ tập lệnh HTML của tập lệnh được xử lý.


Dưới đây là một ví dụ để trì hoãn một tập lệnh

function add_defer_jquery( $tag, $handle ) {
    if ( 'jquery' === $handle ) {
        return str_replace( "src", "defer src", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_defer_jquery', 10, 2 );


Dưới đây là một ví dụ để trì hoãn nhiều hơn một tập lệnh

function add_defer_attribute( $tag, $handle ) {

    // add script handles to the array below
    $scripts_to_defer = array(
        'jquery',
        'jquery-migrate',
        'bootstrap-bundle-js'
    );

    foreach ( $scripts_to_defer as $defer_script ) {
        if ( $defer_script === $handle ) {
            return str_replace( "src", "defer src", $tag );
        }
    }

    return $tag;
}
add_filter( 'script_loader_tag', 'add_defer_attribute', 10, 2 );

Vì vậy, tôi đã giải thích cả API style_loader_tagscript_loader_tag. Và tôi đã đưa ra một số ví dụ cho cả hai API. Tôi hy vọng rằng điều này hữu ích cho nhiều người ngoài kia. Tôi có kinh nghiệm với cả hai API.


CẬP NHẬT
@CKMacLeod Cảm ơn bạn đã cập nhật, điều này làm rõ mọi thứ. Chúng tôi chủ yếu trên cùng một trang. Như tôi đã nói, tôi là nhà phát triển WordPress và nếu bạn muốn xuất bản một chủ đề và / hoặc plugin trên https://wordpress.org về cơ bản bạn buộc phải tuân theo " Tiêu chuẩn mã hóa WordPress " hoặc họ sẽ từ chối chủ đề và / hoặc plugin.

Đó là lý do tại sao tôi khuyến khích các nhà phát triển ngoài kia sử dụng "cách WordPress". Tôi hiểu rằng đôi khi không có sự khác biệt nào, nhưng đó cũng là sự tiện lợi. Như bạn đã nói, bạn có thể tải xuống Font Awesome và đưa nó vào chủ đề và / hoặc plugin của mình, bằng cách này, bạn chỉ cần xóa chức năng style_loader_tag và sửa đổi chức năng wp_enqueue_style của bạn.

Và một điều cuối cùng, trong quá khứ (5 năm trước) một số bộ đệm, kết hợp và rút gọn các plugin không hoạt động và hầu hết mọi lúc tôi sẽ tìm hiểu lý do tại sao những nhà phát triển tạo ra chủ đề chỉ đơn giản là đặt mọi thứ vào chủ đề và / hoặc lặp lại chúng. Hầu hết các plugin lưu đệm, những người cũng (hầu hết thời gian) cung cấp các tùy chọn để kết hợp, giảm thiểu và trì hoãn thực thi các tập lệnh trở nên thông minh hơn và tốt hơn trong việc phát hiện mã xấu và làm việc xung quanh chúng. Nhưng điều này không được ưa thích. Đó là lý do tại sao tôi khuyến khích mọi người viết mã với các tiêu chuẩn / quy ước trong tâm trí.

Là một nhà phát triển, bạn luôn cần xem xét những gì mọi người có thể làm với mã của bạn và chú ý đến tính tương thích. Vì vậy, không dùng giải pháp dễ dàng nhưng giải pháp tối ưu tốt nhất. Tôi hy vọng tôi đã làm rõ quan điểm của tôi.

EDIT
@CKMacLeod Cảm ơn bạn về cuộc tranh luận (kỹ thuật), tôi hy vọng rằng bạn nhận ra tầm quan trọng của việc này (sử dụng API của WordPress trong sự phát triển của chính bạn). Một lần nữa, tôi đã tìm kiếm xung quanh và thậm chí bây giờ nếu tôi nhìn vào các plugin minify phổ biến nhất của FAQ, tôi thường thấy cách này hay cách khác, ví dụ:

Câu hỏi: Tại sao một số tệp CSS và JS không được hợp nhất?
Trả lời: Plugin chỉ xử lý các tệp JS và CSS được sử dụng bằng phương pháp API chính thức của WordPress - https://developer.wordpress.org/theme/basics/including-css-javascript/ -as cũng như các tệp từ cùng một tên miền (trừ khi được chỉ định trên cài đặt).

Xem Câu hỏi thường gặp: https://wordpress.org/plugins/fast-velocity-minify/


@Pipo Bạn được chào đón :)
Remzi Cavdar

RC - Tôi nghĩ rằng câu trả lời của bạn có thể là thực hành WordPress tốt hơn so với của tôi (mặc dù tôi sẽ muốn thực hiện một số nghiên cứu thêm về việc thu hút các tập lệnh và tệp được lưu trữ bên ngoài). Tuy nhiên, tôi nghĩ rằng chúng ta nên rõ ràng về các biện minh của mình, và không giám sát chúng, và cũng thừa nhận rằng câu trả lời đúng cho việc kết hợp các dịch vụ của bên thứ 3 có thể khác nhau trong các bối cảnh khác nhau. Về lưu ý này, nhân tiện, cả hai chúng tôi đều không nghĩ đến việc sử dụng một trình cắm tốt - như Better Font Awesome cho FA, vì chúng có thể xử lý tốt việc cập nhật và các tác vụ khác.
CK MacLeod

Vâng, bạn đã đúng khi sử dụng plugin cho FA. Tôi chỉ không biết nếu điều này cũng được ưa thích khi các nhà phát triển tạo chủ đề WP. Thông thường, bạn sẽ muốn bao gồm mọi thứ trong chủ đề của mình và sử dụng ít plugin nhất có thể ra khỏi hộp.
Remzi Cavdar

Kiểm tra các giải pháp này, stackoverflow.com/questions/44827134/
Ấn

0

Việc xem xét script_ và style_loader_tag của @Remzi Cavdar rất thú vị, nhưng, có nguy cơ gây ra sự phẫn nộ nào đó, và hy vọng ai đó có thể nhắc nhở tôi rằng lợi thế của việc sử dụng hàng đợi WP sẽ như thế nào trong trường hợp như thế này, tôi sẽ khuyên bạn nên sử dụng lối thoát dễ dàng và tải biểu định kiểu của Fontawgie qua hook.

/* ADD FONTAWESOME 5.5.0 via action hook */
add_action( 'wp_head', 'sewpd_add_fontawesome' );

function sewpd_add_fontawesome() {

echo '
<!--FONTAWESOME 5.5.0 added via functions.php -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<!--END FONTAWESOME -->
'; 

}

Một số người thậm chí có thể lập luận rằng, nếu bạn chỉ sử dụng FA cho một số biểu tượng trong phần chân trang chủ đề hoặc trong các bài đăng, bạn nên thêm nó thấp hơn, trong phần thân của trang, vì cách đó sẽ không xuất hiện dưới dạng chặn kết xuất, nhưng tôi thú nhận rằng tôi chưa bao giờ làm điều đó ... Và tôi sẽ không đi xa đến mức khuyên bạn nên thêm nó trực tiếp vào một tệp tiêu đề.php hoặc tệp mẫu khác. Điều đó sẽ sai. ;)

CẬP NHẬT

Remzi Cavdar rất tốt bụng khi trả lời yêu cầu nhắc nhở của tôi về lý do tại sao chỉ cần thêm một Fontawgie hoặc thẻ tương tự thông qua hook wp_head () có thể ít được mong muốn hơn so với sử dụng hàng đợi WordPress. Nói chung, ông đề cập đến khái niệm về các thực tiễn tốt nhất và cụ thể hơn là ý tưởng rằng các plugin lưu đệm có thể cần để có thể truy cập biểu định kiểu thông qua hàng đợi.

Trước khi đi vào chi tiết, tôi sẽ nói rằng, mặc dù tôi thực sự không biết về bất kỳ lời biện minh cụ thể nào khác ngoài đó là "Cách thức của WordPress", tôi thích cách tiếp cận của đồng chí Cavdar và có thể sử dụng nó trong tương lai .

Tuy nhiên, những tuyên bố khác của ông cho nó không thuyết phục được tôi. Có lẽ anh ấy hoặc người khác có thể thêm vào chúng. Nếu vậy, tôi là tất cả tai. Tóm lại, theo như tôi có thể nói, sau khi chạy hơn 20 bài kiểm tra trên Pingdom và GTMetrix so sánh "thêm qua hàng đợi" so với "thêm qua đầu" trên blog thử nghiệm, không có sự khác biệt đáng kể và nhất quán về hiệu suất được phân loại, tổng số yêu cầu trang hoặc thời gian tải (ví dụ: "Sơn đầu tiên", "Sơn nội dung đầu tiên" và "OnLoad" tại GTMetrix) giữa hai cách tiếp cận.

Về bộ nhớ đệm cụ thể, các plugin lưu đệm không thể làm được gì nhiều với các tệp được lưu trữ bên ngoài, cho dù chúng có được thêm vào hàng đợi WP hay không. Bản thân các tệp sẽ không bị ảnh hưởng và trang của bạn vẫn sẽ tạo một yêu cầu cho từng tệp.

Tổng quát hơn, tôi đã thấy một loạt các cách tiếp cận khác nhau để tải tập lệnh và kiểu. Một số trong số họ sẽ bỏ qua một phần hoặc toàn bộ hàng đợi WP. Chắc chắn có thể hiểu rằng sẽ có các trường hợp - một chức năng sử dụng một loạt các thẻ điều khiển kiểu trong khi ngăn chúng được tải trên các trang cụ thể, giả sử - trong đó có Fontawemme hoặc Thẻ bên thứ 3 khác được liệt kê sẽ hữu ích một chút và việc triển khai ban đầu hai các chức năng - enqueueing và lọc - thực sự sẽ trở nên khó hiểu hơn là chỉ đơn giản là tải một.

Trong trường hợp FA, biểu định kiểu đã được thu nhỏ và được tải thông qua CDN của FA. Tuy nhiên, tác động nội tại của nó đối với hiệu suất sẽ là tối thiểu, dù được tải qua wp_head () hoặc qua hàng đợi, nó vẫn sẽ đăng ký các điểm dừng ở nhiều điểm trên các trình phân loại hiệu suất - giống như các thông tin chi tiết về tốc độ trang của Google và GTMetrix và Pingdom đã nói ở trên, sẽ gắn cho bạn một điểm hiệu suất để không lưu một vài byte (thậm chí không kilobyte) tối ưu hóa lại một hoặc một tệp hình ảnh khác.

Tải qua wp_head chứ không phải hàng đợi có thể kiểm tra "thứ tự chính xác của tập lệnh và kiểu" (mặc dù người khác sẽ xếp hạng bạn cao hơn để tải tệp được lưu trữ bên ngoài sau khi được lưu trữ cục bộ), nhưng, nếu bạn thực sự lo lắng về việc tải FA theo cách tốt nhất có thể cho trang web của bạn, sau đó bạn sẽ thử lưu trữ cục bộ các tệp và tệp phụ của nó, cả kiểu dáng và phông chữ mà biểu định kiểu của nó gọi thông qua @ font-face. Trong trường hợp đó, bạn có thể liệt kê biểu định kiểu giống như bất kỳ tệp cục bộ nào khác, nối và kết hợp nó thông qua một plugin tối ưu hóa hoặc trực tiếp "bằng tay". Bạn thậm chí có thể thực hiện các sửa đổi tuyệt vời của riêng bạn về Fontawgie và tích hợp chúng với biểu định kiểu và chủ đề của bạn. Hoặc (như đã đề cập ngắn gọn trước đó), bạn có thể thử một số chiến thuật tối ưu hóa hiệu suất kỳ lạ hơn như thêm nội tuyến CSS ngay trước khi cần trong cấu trúc của một trang cụ thể.

Dù sao, bạn sẽ không cần phải lo lắng về các thẻ "toàn vẹn" và "nguồn gốc chéo" mới, và bạn cũng sẽ không phải lo lắng nếu một ngày nào đó Fontawemme quên thanh toán hóa đơn CDN của mình.

Hoặc bạn có thể đang làm việc trên một trang web đã bị lộn xộn hoàn toàn, với các bảng định kiểu và tập lệnh được tải theo mọi cách, và có thể dễ dàng hơn khi có phần bổ sung mới nhất của bạn ở đầu tệp tin.php để bạn hoặc nhà phát triển tiếp theo có thể định vị lại một cách dễ dàng ...


Tôi cũng tò mò, nhược điểm của việc làm theo cách này hoặc trực tiếp thêm nó vào một tệp chủ đề là gì?
Jersh

Cảm ơn bạn đã đưa ra quan điểm của bạn, điều duy nhất là giải pháp của bạn sẽ làm nản lòng rất nhiều plugin và bộ nhớ đệm. Giống như: wordpress.org/plugins/fast-velocity-minify , wordpress.org/plugins/wp-fastest-cache và vân vân ....
Remzi Cavdar

1
Các plugin khác có thể thao tác các bảng định kiểu và tập lệnh nếu chúng được xử lý đúng, nếu bạn đặt mã trực tiếp vào đầu, các plugin này sẽ không thể thu nhỏ, kết hợp và xây dựng bộ đệm theo thứ tự propper.
Remzi Cavdar

Remzi Cavdar: Cảm ơn bạn đã trả lời, nhưng, trước khi tôi chỉnh sửa câu trả lời của mình và giải quyết các vấn đề bạn nêu chi tiết, tôi tự hỏi liệu bạn có bất kỳ ví dụ nào về chúng cụ thể liên quan đến Fontawemme hoặc nói chung liên quan đến các bảng định kiểu khác như nó không, như trong đã được thu nhỏ và lưu trữ bên ngoài.
CK MacLeod

1
"Cách wordpress" đảm bảo khả năng tương thích tối đa với các plugin. Cho dù đó là để tìm nạp mọi thứ từ CDN, hoặc xóa liên kết cho một số trang cụ thể, theo cách của bạn, điều đó sẽ không thể thực hiện được nếu không thực sự chỉnh sửa mã. +1 để thể hiện sự tin tưởng của bạn nhưng như một câu trả lời ở đây, đó là -1
Mark Kaplun 27/11/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.