[WordPress] 外掛基礎知識篇 – 外掛開發者都需要來讀一次的文件

本篇文章更新時間:2023/03/22
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


本系列文為 WordPress.org 外掛開發文件的繁體中文化版本。

什麼是「外掛」?

外掛程式是延伸 WordPress 核心功能的程式套件,由 PHP 程式碼組成,可以包含其他資源,如圖像、CSS 和 JavaScript。

透過製作自己的外掛,你可以擴展 WordPress 的功能,即在 WordPress 已經提供的基礎上建立額外的功能。例如,你可以撰寫一個顯示你網站上十篇最新文章連結的外掛。

或者,使用 WordPress 的自訂內容類型,你可以編寫一個外掛,創建一個具有電子郵件通知和有完整功能支援客戶端的工單系統。可能性是無限的!

大部分的 WordPress 外掛都由多個文件組成,但是一個外掛實際上只需要一個主文件,並在標頭加上特定格式的 DocBlock

DocBlock 是一種程式碼註解格式,用於提供程式碼文檔化的注釋說明。

「Hello Dolly」是其中一個最早期的 WordPress 外掛程式之一,只有 100 行程式碼。它可以在 WordPress 後台顯示出著名歌曲的歌詞。(英文內容)這個 PHP 檔案中使用一些 CSS 來控制歌詞的樣式。

作為 WordPress.org 的外掛作者,你有一個難得的機會創建一個外掛,這個外掛將被數百萬 WordPress 用戶安裝、使用和喜愛。你只需要把你的優秀點子變成程式碼即可。外掛手冊將幫助你實現這個目標。

外掛基礎知識

開始入門

在最簡單的情況下,WordPress 外掛是一個帶有 WordPress 外掛標頭註解的 PHP 文件。強烈建議你創建一個目錄來保存外掛,以便所有外掛文件都可以整潔地組織在一個地方。

以下是開始創建新外掛的步驟:

  1. 瀏覽至 WordPress 安裝的 wp-content 目錄。
  2. 開啟 plugins 目錄。
  3. 創建一個新目錄,並以外掛名稱(例如 plugin-name)命名。
  4. 開啟新外掛目錄。
  5. 創建一個新的 PHP 文件(最好以你的外掛命名,例如 plugin-name.php)。

以下是在 Unix 命令行中的過程:

wordpress $ cd wp-content
wp-content $ cd plugins
plugins $ mkdir plugin-name
plugins $ cd plugin-name
plugin-name $ vi plugin-name.php

在上面的例子中,vi 是文字編輯器的名稱。請使用你感到舒適的任何編輯器。

現在你正在編輯新外掛的 PHP 檔案,你需要新增一個外掛註解標頭。這是一個特殊格式的 PHP 區塊註解,包含有關外掛的元數據,例如外掛的名稱、作者、版本、開源授權等。外掛標頭註解必須符合標頭要求,並且至少包含外掛的名稱。

外掛文件夾中只要有一個檔案包含標頭註解,如果外掛有多個 PHP 檔案,只要其中一個檔案有標頭註解就好。

儲存檔案後,你應該能在你的 WordPress 網站上看到你的外掛程式已列在列表中。登入 WordPress 網站,並在左側功能選單的外掛功能。此頁面會顯示你的 WordPress 網站所有外掛程式列表。現在你的新外掛程式應該已經列在那個列表中了!

Hooks 勾點: Actions 事件動作與 Filters 事件過濾器

WordPress hooks 勾點允許你在特定事件點上執行程式,改變 WordPress 的行為方式,而不需要編輯任何核心檔案。

WordPress 中有兩種勾點(hooks):事件動作(actions)和事件過濾器(filters)。事件動作讓你可以新增 WordPress 執行到該事件時的功能,而過濾器可以讓你在載入該事件時,針對事件帶入的參數提供修改內容的彈性。

勾點不僅僅是給外掛開發人員使用,WordPress Core 核心本身也廣泛地使用勾點來提供預設功能。其他的未使用的勾點 則是一種預想的可能進入點設計,當你需要改變 WordPress 的運作方式時可以輕鬆地使用這些勾點。這是 WordPress 極具彈性的原因之一。

基本的勾點

開發外掛時需要使用的三個基本勾點是 「register_activation_hook()register_deactivation_hook()register_uninstall_hook()

分別是:外掛啟用時觸發的事件、外掛停用時觸發的事件 與 外掛移除安裝時觸發的事件。

啟用勾點在啟用外掛時運行。你可以使用此功能來提供一個設置外掛的功能,例如在系統設定資料表 options 中創建一些預設設定值。

「外掛停用時觸發的事件勾點」可以在你停用外掛時運行。你可以使用這個勾點並提供一個函數,清除外掛暫存的任何資料。

這些解除安裝的方法是用來在管理員刪除你的外掛後進行清理的。你會使用這些方法來刪除由你的外掛建立的所有數據,例如新增到設定資料表 options 中的任何設定值。

新增勾點

你可以使用 do_action() 自訂勾點名稱,讓開發者透過傳遞函式來擴充你的外掛。

移除勾點

你也可以使用 remove_action() 來刪除先前定義的函數。例如,如果你的外掛是另一個外掛的附加延伸外掛[1],你可以使用與前一個外掛新增的相同函數名呼叫的 remove_action() 來完成移除。在這些情況下,動作的優先順序很重要,因為 remove_action() 需要在最初的 add_action() 之後運行。

當你從一個勾點中移除一個動作(action)或更改優先權重時應該要小心,因為這些更改可能會影響與使用同一個勾點的其他外掛程式,而這些影響因為可能不易被察覺。我們強烈建議經常進行測試!

你可以在這份手冊的勾點章節中學習更多有關創建勾點和與它們互動的資訊。

[1] 附加延伸外掛: 這概念就像是 WooCommerce 電商外掛之於延伸的金流或是物流業者開發的外掛。

WordPress APIs 應用程式介面

你知道 WordPress 提供多種應用程式介面 (API) 嗎?這些 API 可以大幅簡化你在外掛中需要撰寫的程式碼。特別是當已經有很多人為你完成了很多工作和測試時,你並不希望重新發明輪子。

其中最常見的是 Options API,它可以輕鬆地將數據存儲在外掛的數據庫中。如果你想在你的外掛中使用 cURLHTTP API 可能會對你有用。

由於我們正在談論外掛,你會想學習 Plugin API。它具有多種功能,可以協助你開發外掛。

開發外掛如果要上架 WordPress.org 的外掛儲存庫要注意使用的這些方法是不是以現有的 WordPress API 為主。比方說如果要實作對外請求的服務,就不能使用 cURL 方法,要使用 HTTP API,否則會被拒絕上架。這也是符合一種上架規範。

WordPress 是如何載入外掛的?

當 WordPress 在 WordPress 管理員的外掛頁面載入已安裝外掛列表時,它會搜尋外掛文件夾(和其子文件夾)以查找帶有 WordPress 外掛標頭註解的 PHP 文件。如果你的整個外掛只包含一個 PHP 文件,就像 Hello Dolly 一樣,該文件可以直接位於外掛文件夾的根目錄中。但更常見的是,外掛文件將位於其自己的文件夾中,以外掛名命名。

開源分享你的外掛

有時候你所創建的外掛只是給自己的網站使用。但是許多人喜歡與 WordPress 社群分享他們的外掛。在分享你的外掛之前,你需要做的一件事是選擇一個開源授權協議。這讓使用者知道他們可以如何使用你的程式碼。為了與 WordPress 核心維持相容性,建議你選擇與 GNU 通用公共開源授權協議(GPLv2+) 相容的開源授權協議。

標頭要求

如同在入門指南中所描述的一樣,主要的PHP檔案應包含標頭註解,告知 WordPress 該檔案是一個外掛程式,並提供關於外掛程式的資訊。

最基本要求

一個外掛名稱的註解標頭描述

/*
 * Plugin Name: 你的外掛名稱
 */

其他標頭欄位

可用的標頭欄位:

Plugin Name:(必要)外掛的名稱,將顯示在 WordPress 外掛列表中。
Plugin URI:外掛的主頁面,一組網站網址 URL。不能在這裡使用 WordPress.org 的路徑。
Description:外掛的簡短描述,外掛頁面中顯示用,140 個字以內。
Version:外掛的當前版本號,例如 1.0 或 1.0.3。
Requires at least:外掛可以運行的最低 WordPress 版本。
Requires PHP:最低要求的 PHP 版本。
Author:外掛作者的名字。可以使用逗號列出多個作者。
Author URI:作者的網站或其他網站上的個人檔案,例如 WordPress.org。
License:外掛開源授權的簡短名稱(例如 GPLv2)。有關開源授權的更多資訊可以在 WordPress.org 指南中找到。
License URI:開源授權全文的連結(例如 https://www.gnu.org/licenses/gpl-2.0.html)。
Text Domain:外掛的 gettext 識別域名。有關更多信息,請參見 如何將外掛國際化 頁面上的識別域名部分。
Domain Path:域路徑讓 WordPress 知道如何找到翻譯。有關更多信息,請參見 如何將外掛國際化 頁面上的域路徑部分。
Network:外掛是否只能在多站網路模式下啟用。只能設置為 true,不需要時應略過。
Update URI:允許第三方外掛避免被来自 WordPress.org 外掛目錄的類似名稱外掛的更新意外覆蓋。有關此參數細節,請閱讀相關開發說明。

一個合乎規格的外掛標頭範例:

/*
 * Plugin Name:       My Basics Plugin
 * Plugin URI:        https://example.com/plugins/the-basics/
 * Description:       Handle the basics with this plugin.
 * Version:           1.10.3
 * Requires at least: 5.2
 * Requires PHP:      7.2
 * Author:            John Smith
 * Author URI:        https://author.example.com/
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Update URI:        https://example.com/my-plugin/
 * Text Domain:       my-basics-plugin
 * Domain Path:       /languages
 */

這裡有另一個例子,也允許在檔案中使用 PHPDoc DocBlock 和 WordPress外掛檔案的標頭:

 /**
 * Plugin Name
 *
 * @package           PluginPackage
 * @author            Your Name
 * @copyright         2019 Your Name or Company Name
 * @license           GPL-2.0-or-later
 *
 * @wordpress-plugin
 * Plugin Name:       Plugin Name
 * Plugin URI:        https://example.com/plugin-name
 * Description:       Description of the plugin.
 * Version:           1.0.0
 * Requires at least: 5.2
 * Requires PHP:      7.2
 * Author:            Your Name
 * Author URI:        https://example.com
 * Text Domain:       plugin-slug
 * License:           GPL v2 or later
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Update URI:        https://example.com/my-plugin/
 */

注意:

當給你的外掛指定版本號碼時,請注意 WordPress 使用 PHP 的 version_compare() 函數來比較外掛程式的版本號碼。因此,在發布新版本的外掛程式前,你應該確認這個 PHP 函數將新版本視為「更新(大)」於舊版本。例如,1.02 實際上會比 1.1 更新(大)。

引入一份開源授權協議

大部分的 WordPress 外掛程式都是根據 GPL 授權的,這是 WordPress 本身使用的相同授權。然而,還有其他相容的選項可用。最好清楚地表明你的外掛程式使用的授權。

在「標頭要求」一節中,我們簡要提到了如何在外掛程式標頭註解中標明你的外掛程式授權。另一種常見且受鼓勵的做法是在你的主要外掛程式文件的頂部放置授權區塊註解(與外掛程式頭部註釋相同)。

這個授權區塊註解通常看起來像這樣:

/*
{Plugin Name} is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
any later version.

{Plugin Name} is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with {Plugin Name}. If not, see {URI to Plugin License}.
*/

外掛啟用、停用的勾點

啟動與停用勾點提供了在外掛啟用或停用時執行操作的方法。

在啟用時,外掛可以運行程式來增加重寫規則、增加自定義資料表或設置預設選項值。
在停用時,外掛可以運行程式來刪除暫存資料,如快取和暫存文件和目錄。

停用的勾點有時會被誤解為移除的勾點。移除的勾點適合永久刪除所有資料,例如刪除外掛設定參數和自定義資料表等。

啟用勾點

使用 register_activation_hook() 方法來設定啟用勾點:

register_activation_hook(
    __FILE__,
    'pluginprefix_function_to_run'
);

停用勾點

使用 register_deactivation_hook() 方法來設定停用勾點:

register_deactivation_hook(
    __FILE__,
    'pluginprefix_function_to_run'
);

這些方法中的第一個參數是指你的主要外掛文件,即你放置外掛標頭註解的文件。通常這兩個函數將在主外掛文件內觸發;但是,如果這些函數放置在任何其他文件中,你必須更新第一個參數以正確指向主外掛文件。

範例

啟用勾點(activation hook)最常見的用途之一是當一個外掛註冊自訂內容類型時,用來刷新 WordPress 永久連結(permalinks)以解決 404 錯誤。接下來我們來看看這個範例如何運作:

/**
 * Register the "book" custom post type
 */
function pluginprefix_setup_post_type() {
    register_post_type( 'book', ['public' => true ] ); 
} 
add_action( 'init', 'pluginprefix_setup_post_type' );

/**
 * Activate the plugin.
 */
function pluginprefix_activate() { 
    // Trigger our function that registers the custom post type plugin.
    pluginprefix_setup_post_type(); 
    // Clear the permalinks after the post type has been registered.
    flush_rewrite_rules(); 
}
register_activation_hook( __FILE__, 'pluginprefix_activate' );

如果你還不熟悉註冊自定義內容類型,不用擔心,這將在稍後介紹。使用這個範例只是因為它很常見。

使用上面的範例,以下是如何反轉此過程並停用外掛:

/**
 * Deactivation hook.
 */
function pluginprefix_deactivate() {
    // Unregister the post type, so the rules are no longer in memory.
    unregister_post_type( 'book' );
    // Clear the permalinks to remove our post type's rules from the database.
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'pluginprefix_deactivate' );

如果需要更多有關啟用和停用的勾點資訊,這裡有一些不錯的文件資源參考:

  1. register_activation_hook()
  2. register_deactivation_hook()

解除安裝的勾點

你的外掛在從站點中解除安裝時可能需要進行一些清理工作。

如果使用者在 WordPress 後台中停用了外掛程式,然後點擊刪除連結,該外掛程式就會被視為已解除安裝。當你的外掛被解除安裝時,你會想要清除任何與該外掛特定的選項/或設定,以及其他資料庫的資料表等。

不夠有經驗的開發者有時會犯了使用停用勾點就進行此目的的錯誤。

停用 與 刪除、解除安裝是不同的行為定義。

這個表格說明了停用與解除安裝之間的不同之處。

情境 停用的勾點 解除安裝的勾點
清除快取或暫存
重置永久連結
移除設定資料表內容 {$wpdb->prefix}_options
從 WPDB 中移除資料

方法一: register_uninstall_hook()

使用 register_uninstall_hook() 方法。

register_uninstall_hook(
    __FILE__,
    'pluginprefix_function_to_run'
);

方法二: uninstall.php

要使用這個方法,你需要在外掛的根目錄中創建一個 uninstall.php 檔案。這個神奇的檔案會在使用者刪除外掛時自動運行。

例如: /plugin-name/uninstall.php

注意:在解除安裝外掛(uninstall.php)之前,請務必記得檢查常數 WP_UNINSTALL_PLUGIN,這可防止直接訪問,造成意外清除的問題。且只有在 uninstall.php 執行期間,WordPress 才會定義此常數。當使用 register_uninstall_hook() 進行解除安裝時,不會定義此常數。

這裡提供一個刪除設定選項及刪除資料庫資料表的範例:

// if uninstall.php is not called by WordPress, die
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
    die;
}

$option_name = 'wporg_option';

delete_option( $option_name );

// for site options in Multisite
delete_site_option( $option_name );

// drop a custom database table
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}mytable" );

在多站網路環境下,遍歷所有網誌以刪除選項可能需要耗費大量資源。

最佳實踐

這裡有一些最佳實踐,可以幫助組織你的程式碼,使其能夠與 WordPress 核心和其他 WordPress 外掛良好地互相作用。

避免命名衝突

當你的外掛使用了與其他外掛相同的變數、函數或類別名稱時,就會發生命名衝突。

幸運的是,你可以通過以下方法避免命名衝突。

程序化編碼方法

預設情況下,所有變數、函數和類別都在全域命名空間中定義,這意味著你的外掛可以覆蓋另一個外掛設置的變數、函數和類別,反之亦然。在函數或類別內部定義的變數不受此影響。

所有命名都加上前綴

所有變數、函數和類別都應有一個獨特的前綴,以防其他外掛程式覆寫你的變數,並意外調用你的函數和類別。這也是避免你發生同樣的問題。

檢查現有的實作

PHP 提供了許多函數來驗證變數、函數、類別和常數是否存在,若該實體存在這些函數就會回傳 true。

範例

// Create a function called "wporg_init" if it doesn't already exist
if ( ! function_exists( 'wporg_init' ) ) {
    function wporg_init() {
        register_setting( 'wporg_settings', 'wporg_option_foo' );
    }
}

// Create a function called "wporg_get_foo" if it doesn't already exist
if ( ! function_exists( 'wporg_get_foo' ) ) {
    function wporg_get_foo() {
        return get_option( 'wporg_option_foo' );
    }
}

物件導向開發

解決命名衝突問題的更簡單方法是使用一個類別來撰寫你的外掛程式碼。

你仍需要注意檢查你想要使用的類別名稱是否已被佔用,其餘部分將由 PHP 處理。

範例

if ( ! class_exists( 'WPOrg_Plugin' ) ) {
    class WPOrg_Plugin {
        public static function init() {
            register_setting( 'wporg_settings', 'wporg_option_foo' );
        }

        public static function get_foo() {
            return get_option( 'wporg_option_foo' );
        }
    }

    WPOrg_Plugin::init();
    WPOrg_Plugin::get_foo();
}

檔案組織架構

外掛目錄的根層級應該包含你的 plugin-name.php 檔案,以及選擇性的 uninstall.php 檔案。盡可能將所有其他檔案組織到子資料夾中。

目錄結構

清楚的資料夾結構有助於讓你和其他開發外掛的人將類似的文件放在一起管理。

以下是一個參考用的範本資料夾結構:

/plugin-name
     plugin-name.php
     uninstall.php
     /languages
     /includes
     /admin
          /js
          /css
          /images
     /public
          /js
          /css
          /images

外掛架構

你為外掛選擇的架構或程式碼組織,很可能取決於你設計的外掛大小。

對於和 WordPress 核心、主題或其他外掛交互作用有限的小型單一功能外掛,設計複雜的類別沒有太大好處,除非你知道該外掛將來會大幅擴展。

對於有大量程式碼的大型外掛,建立類別是首要目的。分離樣式和程式,甚至是建構相關文件。這將有助於程式碼架構和外掛的長期維護。

有條件的載入

使用條件式判斷方法 is_admin(),將後端程式碼與前端程式碼分離是有幫助的。 你仍必須執行權限檢查,因為這並不表示使用者已經通過驗證或具有管理員級別的存取權限。可以參考「檢查使用者權限」。

例如:

if ( is_admin() ) {
    // we are in admin mode
    require_once __DIR__ . '/admin/plugin-name-admin.php';
}

可能的架構模式

雖然有許多可能的架構模式,但它們可以大致分為三種變化:

架構模式的解讀

上述較複雜的程式組織具體實作已經有網友撰寫成教學和投影片形式:

起始範本

相較於每次撰寫新的外掛程式時都從零開始,你可能希望從一個「範本」開始。使用範本的一個優點是可以在你自己的外掛程式中保持一致性。如果你使用其他人已經熟悉的範本,那麼其他人也更容易貢獻你的程式碼。

這些還提供了不同但可比較的架構範例。

  • WordPress Plugin Boilerplate:用於 WordPress 外掛程式開發的基礎,旨在提供清晰且一致的指南以建立你的外掛程式。
  • WordPress Plugin Bootstrap:使用 Grunt、Compass、GIT 和 SVN 開發 WordPress 外掛程式的基本啟動器。
  • WP Skeleton Plugin:聚焦於單元測試和使用 Composer 進行開發的骨架外掛程式。
  • WP CLI Scaffold:WP CLI 的 Scaffold 命令可以創建一個帶有 CI 配置文件等選項的骨架外掛程式。

當然,你可以選取這些和其他項目的不同方面,創建自己的客製化範本。

區分外掛與內容的目錄

當撰寫 WordPress 外掛時,你經常需要引用 WordPress 安裝過程中的各種文件和文件夾,例如外掛或佈景主題。

WordPress 提供了多個函數來輕鬆判斷指定文件或目錄的位置。在你的外掛中,總是使用這些函數來引用,而不是硬寫死(hard-coding)引用 wp-content 目錄或使用 WordPress 的內部常數。

WordPress allows users to place their wp-content directory anywhere they want and rename it whatever they want. Never assume that plugins will be in wp-content/plugins, uploads will be in wp-content/uploads, or that themes will be in wp-content/themes.

WordPress 允許使用者將他們的 wp-content 內容目錄放置在任何地方並進行任意更名。請勿假設外掛一定會在 wp-content/plugins,或上傳檔案會在 wp-content/uploads ,或是佈景主題會在 wp-content/themes

PHP’s FILE magic-constant resolves symlinks automatically, so if the wp-content or wp-content/plugins or even the individual plugin directory is symlinked, hardcoded paths will not work correctly.

PHP 的 __FILE__ 特別常數會自動解析符號連結(symlinks)。如果 wp-contentwp-content/plugins,甚至是個別的外掛目錄,被設置成符號連結,寫死的路徑就會無法正確運作。

一般常見使用

如果你的外掛中包含 JavaScript、CSS 文件或其他外部文件,那麼你很有可能需要這些文件的 URL 路徑,用來將它們加載到頁面中。為此,你應該使用 plugins_url() 函數,像這樣:

plugins_url( 'myscript.js', __FILE__ );

此段程式碼會回傳 myscript.js 的完整 URL,例如 example.com/wp-content/plugins/myplugin/myscript.js

要將外掛的 JavaScript 或 CSS 加載到頁面上,你應該使用 wp_enqueue_script()wp_enqueue_style(),並分別將 plugins_url() 的結果作為檔案URL傳遞。

適合使用的一些方法

WordPress 包括許多其他功能,用於確定插件、佈景主題和 WordPress 內部文件或目錄的路徑或 URL 網址。請參閱每個功能的個別 DevHub 頁面,以獲取有關其使用的完整資訊。

外掛用

plugins_url()
plugin_dir_url()
plugin_dir_path()
plugin_basename()

主題用

get_template_directory_uri()
get_stylesheet_directory_uri()
get_stylesheet_uri()
get_theme_root_uri()
get_theme_root()
get_theme_roots()
get_stylesheet_directory()
get_template_directory()

取得網站連結

home_url()
get_home_path()

WordPress 核心相關

admin_url()
site_url()
content_url()
includes_url()
wp_upload_dir()

多站網路相關

get_admin_url()
get_home_url()
get_site_url()
network_admin_url()
network_site_url()
network_home_url()

系統常數

WordPress 使用以下常數來確定內容和外掛目錄的路徑。這些常數不應直接被插件或佈景主題使用,但在此列出以供完整性考量。

WP_CONTENT_DIR  // 內容檔案路徑,無最後斜線,僅完整路徑
WP_CONTENT_URL  // 內容完整 URL 網址
WP_PLUGIN_DIR  // 外掛完整路徑,無最後斜線
WP_PLUGIN_URL  // 完整 URL 網址,無斜線

// Available per default in MS, not set in single site install
// Can be used in single site installs (as usual: at your own risk)
UPLOADS // (If set, uploads folder, relative to ABSPATH) (for e.g.: /wp-content/uploads)

路徑關係表

home_url() Home URL http://www.example.com
site_url() Site directory URL http://www.example.com or http://www.example.com/wordpress
admin_url() Admin directory URL http://www.example.com/wp-admin
includes_url() Includes directory URL http://www.example.com/wp-includes
content_url() Content directory URL http://www.example.com/wp-content
plugins_url() Plugins directory URL http://www.example.com/wp-content/plugins
wp_upload_dir() Upload directory URL (returns an array) http://www.example.com/wp-content/uploads

Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon