WordPress引入css/js方法總結


WordPress引入css/js方法很多,條件很多。如何全局加載,或僅在某些頁面精准加載,什么時候需要先注冊腳本再加載,本文希望找到最簡單的方式,並給出探索更多方法的途徑。

 

在前台加載css/js

wp_enqueue_script()函數加載js,用wp_enqueue_style()加載css,加載資源的位置(action)只有一個——wp_enqueue_scripts

用wp_enqueue_系列函數可以更好的處理腳本樣式表的依賴關系,防止重復加載,以twentyfifteen主題為例。

function twentyfifteen_scripts() {
     
    //全局加載一般的樣式表
    wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.2' );
 
    //全局加載主樣式表
    wp_enqueue_style( 'twentyfifteen-style', get_stylesheet_uri() );
 
    //全局加載僅用於IE的樣式表
    wp_enqueue_style( 'twentyfifteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfifteen-style' ), '20141010' );
    wp_style_add_data( 'twentyfifteen-ie', 'conditional', 'lt IE 9' );
 
    //全局加載js腳本
    wp_enqueue_script( 'twentyfifteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20141212', true );
     
    //給js腳本傳遞變量,解決腳本中不能調用php的問題
    wp_localize_script( 'twentyfifteen-script', 'screenReaderText', array(
        'expand'   => '<span class="screen-reader-text">' . __( 'expand child menu', 'twentyfifteen' ) . '</span>',
        'collapse' => '<span class="screen-reader-text">' . __( 'collapse child menu', 'twentyfifteen' ) . '</span>',
    ) );
}
add_action( 'wp_enqueue_scripts', 'twentyfifteen_scripts' );

若僅在某些頁面加載,利用WordPress的Conditional Tags即可。

什么時需要先注冊css/js

即何時需要使用wp_register_script()wp_register_style()函數。

當css/js很多,並且要分情況加載時,使用wp_register_script()可以更好的管理資源,避免重復勞動。下面的示例代碼中,先在init action上把所有需要用到樣式表都注冊一遍,之后不管想在哪里引入,都可以簡單的用wp_enqueue_style( $handle )來加載。

// 在init action處注冊腳本,可以與其它邏輯代碼放在一起
function my_init(){
    $url = get_template_directory_uri();
    // 注冊樣式表
    $styles = array(
        'style1' => $url . '/css/style1.css',
        'style2' => $url . '/css/style2.css',
        'style3' => $url . '/css/style3.css'
    );
 
    foreach( $styles as $k => $v ){
        wp_register_style( $k, $v, false );
    }
 
    // 注冊腳本
     
    // 其它需要在init action處運行的腳本
}
add_action( 'init', 'my_init' );

注冊腳本時需要運行$wp_scripts->add( $handle, $src, $deps, $ver );,若腳本沒有注冊直接使用wp_enqueue_script,需要先調用add方法,也就是說重復enqueue一個腳本就會運行多次add方法,降低了程序的效率。

在WordPress登錄頁面加載

將action替換為login_enqueue_scripts即可,例如

function enqueue_for_login(){
    wp_enqueue_style( 'core', 'style.css', false );
    wp_enqueue_script( 'my-js', 'filename.js', false );
}
add_action( 'login_enqueue_scripts', 'enqueue_for_login' );

如果想了解其它方式,可以仔細閱讀wp-login.php。

在后台全局加載

同理,將action改為admin_enqueue_scripts

function my_enqueue() {
    wp_enqueue_script( 'my_custom_script', plugin_dir_url( __FILE__ ) . 'myscript.js' );
}
add_action( 'admin_enqueue_scripts', 'my_enqueue' );

想了解更多方法,請閱讀wp-admin/admin-header.php。

在后台按需加載

僅用於后台某些頁面的資源只在這些頁面加載就好,不要到處使用,可以減少不必要的沖突。

1. $hook_suffix

首先我們可以根據admin_enqueue_scripts這個action傳遞的$hook_suffix參數來判斷所處的頁面,例如僅在edit.php加載,代碼如下

function my_enqueue( $hook_suffix ) {
    if ( 'edit.php' == $hook_suffix ) {
       wp_enqueue_script( 'my_custom_script', plugin_dir_url( __FILE__ ) . 'myscript.js' );
    }   
}
add_action( 'admin_enqueue_scripts', 'my_enqueue' );

edit.php就是post、page或者custom post type的列表頁面,編輯頁面是post.php,新建頁面是post-new.php,可以在不同頁面打印$hook_suffix來了解它的使用方法。但由此也可看出它不能區分現在是在哪種post頁面,需要借助更多的全局變量來判斷。

2. $typenow

全局變量$typenow可以告訴我們當前的post type,例如僅在post的列表頁面加載可以這樣來判斷

function my_enqueue( $hook_suffix ) {
    global $typenow;
    if ( 'edit.php' == $hook_suffix && $typenow == 'post' ) {
       wp_enqueue_script( 'my_custom_script', plugin_dir_url( __FILE__ ) . 'myscript.js' );
    }   
}
add_action( 'admin_enqueue_scripts', 'my_enqueue' );

3. get_current_screen()

上述兩個全局變量可以區分大多數情況,若區分不了,可以試試使用get_current_screen()函數,該函數返回當前頁面的post type、ID、base等信息,只能在admin_init之后使用,具體可以參考官方文檔。

4. $pagenow

全局變量$pagenow的返回值與$hook_suffix類似,只是它在前台后台都可以訪問,定義的更早,例如前三者在admin_init處沒有值,但$pagenow卻有。

它定義在wp-includes/vars.php中,該文件還定義了瀏覽器、服務器全局變量,例如$is_winIE、$is_apache,wp_is_mobile()函數也在這里出現。

上述全局變量和函數能區分大多數情況,但依然有無力的時候,這時可以借助$_REQUEST來判斷。上述變量的值也是從$_REQUEST獲取,但多一層值是否存在的檢查,所以能用它們解決的就不要用$_REQUEST或者$_GET。

出處:http://www.solagirl.net/wordpress-ways-to-load-js-css.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM