
functions.php 是 WordPress 主題裡的一個檔案,可以用程式碼替網站加上小功能,很多時候不用為了一個小需求就裝一個外掛。
這篇是 2015 年版本的全面更新:原本收錄的程式碼有好幾段在新版 WordPress 或 PHP 8 上已經會讓網站直接當機,下面都換成現在可以安全使用的寫法,最後也列出被淘汰的舊程式碼與原因。
程式碼要放在哪裡?
不要直接改主題本身的 functions.php,主題一更新,你加的程式碼就會消失。建議用下面兩種方式之一:
- 子主題(Child Theme)的 functions.php:適合熟悉主題結構的人。
- Code Snippets 外掛:到後台「外掛 → 安裝外掛」搜尋 Code Snippets,每段程式碼可以單獨開關,寫錯了也比較好救。
寫錯了、網站變白畫面怎麼辦?
WordPress 5.2 之後有「復原模式」,網站出錯時會寄一封信到管理員信箱,照信裡的連結登入後台就能停用出錯的外掛或主題。收不到信的話,用 FTP 把剛才改的檔案換回備份,或把 Code Snippets 外掛的資料夾暫時改名,網站就會恢復。
1. 隱藏 WordPress 版本號
網頁原始碼預設會顯示 WordPress 的版本號,讓有心人知道你用的是哪個版本、有哪些已知漏洞:
remove_action( 'wp_head', 'wp_generator' );
add_filter( 'the_generator', '__return_empty_string' );第二行連 RSS 裡的版本資訊也一起拿掉。更完整的做法請看真正隱藏去除 WordPress 版本號。
2. 限制文章修訂版本的數量
每次存檔 WordPress 都會留一份修訂版本,文章改久了資料庫會越來越大。這行要加在網站根目錄的 wp-config.php(不是 functions.php),放在「That's all, stop editing!」那一行的上面:
define( 'WP_POST_REVISIONS', 5 );數字是每篇文章最多保留幾個版本。舊版文章寫成小寫的 wp_POST_REVISIONS,常數名稱要全部大寫才有作用。
3. 延後文章出現在 RSS 的時間
文章發佈後常常才發現錯字,但訂閱 RSS 的人已經收到了。這段讓文章發佈 10 分鐘後才出現在 RSS:
add_filter( 'posts_where', function ( $where, $query ) {
global $wpdb;
if ( $query->is_feed() ) {
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_date_gmt < %s",
gmdate( 'Y-m-d H:i:s', time() - 10 * MINUTE_IN_SECONDS )
);
}
return $where;
}, 10, 2 );把 10 * MINUTE_IN_SECONDS 改成 HOUR_IN_SECONDS 就是延後一小時。
4. 站內搜尋也搜得到自訂文章類型
WordPress 內建搜尋預設只找文章。如果網站有商品、作品集這類自訂文章類型,要加上:
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$query->set( 'post_type', array( 'post', 'page', 'product' ) );
}
} );array() 裡面換成你要搜尋的文章類型名稱(product 是 WooCommerce 的商品)。
5. RSS 也包含自訂文章類型
add_filter( 'request', function ( $vars ) {
if ( isset( $vars['feed'] ) && ! isset( $vars['post_type'] ) ) {
$vars['post_type'] = array( 'post', 'product' );
}
return $vars;
} );6. 精簡後台首頁的小工具
後台「控制台」有很多用不到的區塊,交給客戶使用的網站常會拿掉一些,畫面比較清爽:
add_action( 'wp_dashboard_setup', function () {
remove_meta_box( 'dashboard_primary', 'dashboard', 'side' ); // WordPress 活動及新聞
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' ); // 快速草稿
remove_meta_box( 'dashboard_activity', 'dashboard', 'normal' ); // 近期動態
} );7. 上傳的中文檔名自動改成日期
用中文檔名上傳圖片,網址會變成一長串編碼,有些主機或外掛還會出錯。這段會把含有中文等非英數字的檔名,自動改成日期加亂數:
add_filter( 'sanitize_file_name', function ( $filename ) {
$info = pathinfo( $filename );
$ext = empty( $info['extension'] ) ? '' : '.' . strtolower( $info['extension'] );
$name = $info['filename'];
if ( preg_match( '/[^\x20-\x7E]/', $name ) ) {
$name = gmdate( 'Ymd-His' ) . '-' . wp_rand( 100, 999 );
}
return $name . $ext;
} );英文檔名維持不變。圖片的替代文字(alt)還是要記得用中文寫清楚,那才是搜尋引擎看的。
8. 關閉 XML-RPC
XML-RPC 是舊的遠端發文介面,現在很少用到,卻常被拿來暴力破解密碼:
add_filter( 'xmlrpc_enabled', '__return_false' );注意:如果你有用 Jetpack 外掛,或用手機 App 發文,它們可能需要 XML-RPC,關閉前先確認。
9. 不載入 Emoji 程式
WordPress 會在每一頁載入一段 Emoji 轉換程式,現在的瀏覽器都能直接顯示 Emoji,可以省掉:
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' );
remove_action( 'admin_enqueue_scripts', 'wp_enqueue_emoji_styles' );10. 登入頁的 Logo 連回自己的網站
後台登入頁的 Logo 預設連到 WordPress 官網,做給客戶的網站通常會改成連回首頁:
add_filter( 'login_headerurl', function () {
return home_url( '/' );
} );這些舊程式碼請不要再用
這篇文章 2015 年的版本收錄了下面幾段,現在都不建議使用:
- 用
create_function()開啟 GZIP 壓縮:create_function在 PHP 8 已經移除,放進去網站會直接當機。壓縮請交給主機或.htaccess處理,做法請看網站 GZIP、Brotli 壓縮總整理。 - 改從 Google 載入 jQuery 1.7.1:版本太舊有安全漏洞,而且會跟新版外掛衝突,請使用 WordPress 內建的 jQuery。
- 圖片上傳時自動銳化:用的是舊的圖片處理函式,新版 WordPress 已經改寫圖片處理流程,這段不會正常運作。
- 取消預設小工具(
unregister_widget):原本的類別名稱大小寫寫錯了,實際上沒有作用;而且新版 WordPress 已改用區塊小工具。 - 在「設定」選單加上「All Settings」:會打開所有底層設定,改錯一個值可能讓網站無法運作,不建議開放。
延伸閱讀
- .htaccess 用法大全:轉址、HTTPS、安全防護、壓縮與快取常用設定(WordPress 適用)
- WordPress 顯示文章閱讀次數:不用外掛的程式碼寫法(含快取網站解法)
- WordPress「更新失敗。回應不是有效的 JSON 回應」怎麼解決?6 個原因與處理方法
網站功能越加越多、程式碼越堆越亂的時候,整理一次往往比繼續補更省事。正威網路行銷是 25 年經驗的基隆網頁設計工作室,也提供網站維護託管,歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。