現在許多 WordPress 網站都開始講要正確載入 jQuery 、 Javascript 和 CSS 到你的 WordPress 網站。之前也分享過一篇用 wp_enqueue_script() 和 wp_enqueue_style() 載入指令碼與樣式提高效率的文章。今天來一篇更詳細講解如何使用 WordPress 官方推薦的方式來載入指令碼/ CSS 的文章。

有兩種常用的 add_action 鉤子可以載入 指令碼和 CSS 到 WordPress:

  • init: 確保始終為您的網站頭部載入指令碼和 CSS(如果使用 home.php,index.php 或一個模板檔案),以及其他 「前端」 文章、頁面和模板樣式。
  • wp_enqueue_scripts:「適當」 的鉤子方法,並不總是有效的,根據你的 WordPress 設定。

下面的所有例子都在 WordPress 多站點模式、 WordPress 3.4.2 透過測試 (如果不支援後續版本,請留言告知)

載入外部 jQuery 庫和主題自定義的指令碼、樣式

下面這個例子在 add_action 鉤子中使用 init 。使用 init 有兩個原因,一是因為我們正在登出 WordPress 預設的 jQuery 庫,然後載入谷歌的 jQuery 庫;二是確保在 WordPress 的頭部就載入指令碼和 CSS 。

使用 if ( !is_admin() ) 是為了確保這些指令碼和 css 只在前端載入,不會再後臺管理介面載入。

/** Google jQuery Library, Custom jQuery and CSS Files */
function myScripts() {
        wp_register_script( 'google', 'http://googleajax.admincdn.com/ajax/libs/jquery/1.8.2/jquery.js' );
        wp_register_script( 'default', get_template_directory_uri() . '/jquery.js' );
        wp_register_style( 'default', get_template_directory_uri() . '/style.css' );
    if ( !is_admin() ) { /** Load Scripts and Style on Website Only */
        wp_deregister_script( 'jquery' );
        wp_enqueue_script( 'google' );
        wp_enqueue_script( 'default' );
        wp_enqueue_style( 'default' );
    }
}
add_action( 'init', 'myScripts' );

載入 WP 預設 jQuery 庫和主題自定義的指令碼、樣式

第 3 行:使用 array(『jquery』) 是為了告訴 WordPress 這個 jquery.js 是依賴 WordPress 的 jQuery 庫檔案,從而使 jquery.js 在 WordPress jQuery 庫檔案後載入。

/** Add Custom jQuery and CSS files to a Theme */
function myScripts() {
        wp_register_script( 'default', get_template_directory_uri() . '/jquery.js', array('jquery'), '' );
        wp_register_style( 'default', get_template_directory_uri() . '/style.css' );
    if ( !is_admin() ) { /** Load Scripts and Style on Website Only */
        wp_enqueue_script( 'default' );
        wp_enqueue_style( 'default' );
    }
}
add_action( 'init', 'myScripts' );

載入 print.css 到你的 WordPress 主題

第 3 行:最後的 『print』 是媒體螢幕呼叫,確保 print.css 在網站的印表機中的檔案載入時才載入。

/** Adding a Print Stylesheet to a Theme */
function myPrintCss() {
        wp_register_style( 'print', get_template_directory_uri() . '/print.css', '', '', 'print' );
    if ( !is_admin() ) { /** Load Scripts and Style on Website Only */
        wp_enqueue_style( 'print' );
    }
}
add_action( 'init', 'myPrintCss' );

使用 wp_enqueue_scripts 替換 init

如果你要在文章或頁面載入唯一的指令碼,那就應該使用 wp_enqueue_scripts 替換 init 。使用 wp_enqueue_scripts 僅僅只會在前臺載入指令碼和 CSS,不會在後臺管理介面載入,所以沒必要使用 !is_admin() 判斷。

使用 is_single() 只在文章載入指令碼或 CSS

第 3 行的 # 替換為文章的 ID 就可以讓指令碼和 css 只載入到那篇文章。當然,如果直接使用 is_single()(不填 ID),就會在所有文章載入指令碼和 CSS 。

/** Adding Scripts To A Unique Post */
function myScripts() {
    if ( is_single(#) ) { /** Load Scripts and Style on Posts Only */
        /** Add jQuery and/or CSS Enqueue */
    }
}
add_action( 'wp_enqueue_scripts', 'myScripts' );

使用 is_page() 只在頁面載入指令碼或 CSS

第 3 行的 # 替換為頁面的 ID 就可以讓指令碼和 css 只載入到那個頁面。當然,如果直接使用 is_single()(不填 ID),就會在所有頁面載入指令碼和 CSS 。

/** Adding Scripts To A Unique Page */
function myScripts() {
    if ( is_page(#) ) { /** Load Scripts and Style on Pages Only */
        /** Add jQuery and/or CSS Enqueue */
    }
}
add_action( 'wp_enqueue_scripts', 'myScripts' );

使用 admin_enqueue_scripts 載入指令碼到後臺

這個例子將在整個後臺管理介面載入指令碼和 CSS 。這個方法不推薦用在外掛上,除非外掛重建了整個後臺管理區。

第 10 行使用 admin_enqueue_scripts 替換了 init 或 wp_enqueue_scripts

第 5 、 6 行,如果你要自定義後臺管理區,你可以需要停用預設的 WordPress CSS 呼叫。

/** Adding Scripts To The WordPress Admin Area Only */
function myAdminScripts() {
    wp_register_script( 'default', get_template_directory_uri() . '/jquery.js', array('jquery'), '' );
    wp_enqueue_script( 'default' );
    //wp_deregister_style( 'ie' ); /** removes ie stylesheet */
    //wp_deregister_style( 'colors' ); /** disables default css */
    wp_register_style( 'default', get_template_directory_uri() . '/style.css',  array(), '', 'all' );
    wp_enqueue_style( 'default' );
}
add_action( 'admin_enqueue_scripts', 'myAdminScripts' );

載入指令碼和 CSS 到 WordPress 登入介面

第 6 行:我無法弄清楚如何在在登入頁面註冊/排序 CSS 檔案,所以這行手動新增樣式表。

第 10-14 行:用來移除 WordPress 預設的樣式表。

/** Adding Scripts To The WordPress Login Page */
function myLoginScripts() {
    wp_register_script( 'default', get_template_directory_uri() . '/jquery.js', array('jquery'), '' );
    wp_enqueue_script( 'default' );
?>
    <link rel='stylesheet' id='default-css' href='<?php echo get_template_directory_uri() . '/style.css';?>' type='text/css' media='all' />
<?php }
add_action( 'login_enqueue_scripts', 'myLoginScripts' );
/** Deregister the login css files */
function removeScripts() {
    wp_deregister_style( 'wp-admin' );
    wp_deregister_style( 'colors-fresh' );
}
add_action( 'login_init', 'removeScripts' );

載入指令碼和 CSS 到 WordPress 外掛

WordPress 外掛載入指令碼和 CSS 也是常見的。主要的不同之處在於檔案的 URL 。主題使用的是 get_template_directory_uri ,而外掛應該用 plugins_url ,因為檔案是從外掛目錄進行載入的。

從外掛載入指令碼和 CSS

這個例子將在整個網站前端載入指令碼和 CSS 。

/** Global Plugin Scripts for Outside of Website */
function pluginScripts() {
    wp_register_script( 'plugin', plugins_url( 'jquery.js' , __FILE__ ), array('jquery'), '' );
    wp_register_style( 'plugin', plugins_url( 'style.css' , __FILE__ ) );
    if ( !is_admin() ) { /** Load Scripts and Style on Website Only */
        wp_enqueue_script( 'plugin' );
        wp_enqueue_style( 'plugin' );
    }
}
add_action( 'init', 'pluginScripts' );

從外掛載入指令碼和 CSS 到後臺管理區

如果你需要在整個後臺管理區載入指令碼和 CSS,就使用 admin_enqueue_scripts 替換 init 。

/** Global Plugin Scripts for The WordPress Admin Area */
function pluginScripts() {
    wp_register_script( 'plugin', plugins_url( 'jquery1.js' , __FILE__ ), array('jquery'), '' );
    wp_enqueue_script( 'plugin' );
    wp_register_style( 'plugin', plugins_url( 'style1.css' , __FILE__ ) );
    wp_enqueue_style( 'plugin' );
}
add_action( 'admin_enqueue_scripts', 'pluginScripts' );

從外掛載入指令碼和 CSS 到外掛設定頁面

例子只會載入所需的指令碼和 CSS 到外掛設定頁面,不會在管理區的其他頁面載入。

第 3 行:自定義 page= 後面的值為你的外掛設定頁面

/** Adding Scripts On A Plugins Settings Page */
function pluginScripts() {
    if ( $_GET['page'] == "plugin_page_name.php" ) {
        wp_register_script( 'plugin', plugins_url( 'jquery.js' , __FILE__ ), array('jquery'), '' );
        wp_enqueue_script( 'plugin' );
        wp_register_style( 'plugin', plugins_url( 'style.css' , __FILE__ ) );
        wp_enqueue_style( 'plugin' );
    }
}
add_action( 'admin_enqueue_scripts', 'pluginScripts' );

將 jQuery 庫移動到頁尾

你不能將 WordPress 預設的 jQuery 庫移動到頁面底部,但是你可以將自定義的 jQuery 或其他外部 jQuery 庫 (比如 Google 的) 移動到底部。不要將 CSS 移動到頁面底部。

第 3 、 4 行:最後的 『true』 告訴 WordPress 在頁面底部載入這些指令碼。

/** Moves jQuery to Footer */
function footerScript() {
        wp_register_script('jquery', ("http://googleajax.admincdn.com/ajax/libs/jquery/1.8.2/jquery.js"), false, '', true );
        wp_register_script( 'default', get_template_directory_uri() . '/jquery.js', false, '', true );
    if ( !is_admin() ) { /** Load Scripts and Style on Website Only */
        wp_deregister_script( 'jquery' );
        wp_enqueue_script( 'jquery' );
        wp_enqueue_script( 'default' );
    }
}
add_action( 'init', 'footerScript' );

根據不用的使用者角色和功能載入 jQuery 和 CSS

如果你的網站有作者、編輯和其他管理員,你可能需要透過 jQuery 來為他們顯示不同的資訊。你需要使用 current_user_can 確定登入的使用者的角色和功能 。

下面三個例子中,如果使用者已經登入,將在整個網站載入這些指令碼和 CSS 。使用 !is_admin() 包裝 enqueue_script 確保只在前臺載入,或者在 add_action 使用 admin_enqueue_scripts 就可以確保只在後臺管理區載入。

為可以 「編輯文章」 的管理員載入指令碼和 CSS

只對超級管理員和網站管理員生效

/** Add CSS & jQuery based on Roles and Capabilities */
function myScripts() {
    if ( current_user_can('edit_posts') ) {
        /** Add jQuery and/or CSS Enqueue */
    }
}
add_action( 'init', 'myScripts' );

為所有登入使用者載入指令碼和 CSS

/** Admins / Authors / Contributors /  Subscribers */
function myScripts() {
    if ( current_user_can('read') ) {
        /** Add jQuery and/or CSS Enqueue */
    }
}
add_action( 'init', 'myScripts' );

為管理員以外的已登入使用者載入指令碼和 CSS

/** Disable for Super Admins / Admins enable for Authors / Contributors /  Subscribers */
function myScripts() {
    if ( current_user_can('read') && !current_user_can('edit_users') ) {
        /** Add jQuery and/or CSS Enqueue */
    }
}
add_action( 'init', 'myScripts' );

最後的提示

上面的很多例子如果使用相同的 add_action,就可以被合併成一個單一的函式。

換句話說,您可以使用多個 if 語句在一個函式中分裂了你的指令碼和 CSS 呼叫,如:if_admin!if_admin,is_page,is_single 和 current_user_can 的,因為每次使用相同的 add_action 的 init 。

參考原文 (有刪改):http://technerdia.com/1789_include-jquery-css.html