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