WordPress plugin development 外掛 開發
PHP WordPress

WordPress plugin development 外掛開發

商業,創業,業務,職涯,美食,葡萄酒,閱讀,網路科技。

從 Larry 創業以及商業的經驗,希望以白話的口吻,介紹給大家這個商業的世界。

FB粉專會頻繁地更新 Larry 對於商業、社會、人生的觀察與心得,歡迎大家追蹤互動~

圖片來源 https://wordpress.org

https://codex.wordpress.org/Writing_a_Plugin
https://developer.wordpress.org/plugins/plugin-basics/

WordPress 的 plugin (外掛) 放在 wp-content/plugins, 官方文件提到,開發 plugin 第一件事情就是想名稱,plugin 的名稱要有獨一性。即使你的 plugin 沒上架,也要考慮 plugin 名稱的獨一性,如果名稱跟其他 plugin 有重複時,會造成升級時的混淆。

官方建議名稱可以取 mycompanyname-fabulous-functionality (前置你的公司名稱,用 dash 分隔)。每個 plugin 至少要有一支 php, 官方建議檔名跟資料夾一致,也就是 mycompanyname-fabulous-functionality.php

但實務上不一定要加公司名 (很多官方出的外掛也沒有冠 Automattic, 裡面的 PHP 檔名也沒有跟資料夾一致)

plugin 裡每支 php 應該第一行是 defined('ABSPATH') or die();
以確保你的每支 php 是在 WordPress core system 裡面。

plugin 裡的其中一支 (而且只能有一支) PHP 要加上 header, 其中只有 plugin name 是 required.
https://developer.wordpress.org/plugins/the-basics/header-requirements/

基本上有三個 action hook 是一定要的,在這支有 header 的 PHP 加上

register_activation_hook( __FILE__, 'your_activation_function')
register_deactivation_hook( __FILE__, 'your_deactivation_function')
register_uninstall_hook( __FILE__, 'your_uninstall_function')

可以很直覺的看出來,分別是啟用時調用、停用時調用,和解除安裝時調用。通常這三個 action hook 是寫在這支 PHP 裡 (暫稱之為 main plugin file), 但是也可以寫在其他 PHP 裡。如果寫在其他 PHP,記得 __FILE__ 要換成 main plugin file 的路徑。

https://developer.wordpress.org/plugins/the-basics/uninstall-methods/
deactivate 跟 uninstall hooks 官方文件特別提了,deactivation hook 處理的是移除 temp files/folders, flush permalinks 等,uninstall hook 處理的是移除你新加的 options, DB tables, 也就是復原系統。不要把 deactivate 跟 uninstall hooks 搞混了。

https://developer.wordpress.org/plugins/the-basics/best-practices/
多個外掛時,很有可能變數名, 函數名, class名稱可能會衝到。官方文件提供了一些好的 coding practice, 分析的很漂亮,相信很多有工程背景的朋友也會覺得這篇官方文件很讚。

1. Procedural

– 所有變數, 函數, class名稱加上 prefix
– check for existence, 尤其是 functions
Variables: isset() (includes arrays, objects, etc.)
Functions: function_exists()
Classes: class_exists()
Constants: defined()

2. OOP

將外掛子模組的 code 包成 class.

3. File Organization

外掛裡的檔案要有檔案結構,而不是都擺在同一層。

4. Plugin Architecture

– Conditional Loading, 把 admin code 跟 public code 分開,調用時用 is_admin() 來區分。
– Architecture Patterns.

5. Boilerplate Starting Points

上方文件建議開發者「不要」每次都從 0 開始寫 plugin,而是要建立自己的樣板,這樣你所有開發的 plugin 才會有一致性 (consistency)。上方文件並提供一些 template 可以參考。

除了 activation, deactivation, uninstall 三個 action, 整個 WP 其實是 action (用軟體工程比較通用的說法是 event) 驅動的一個框架,底下是 WP 的 action reference, 包含前後台每次 request 的 action 順序
https://codex.wordpress.org/Plugin_API/Action_Reference

提一下 form submission 的部分…
https://codex.wordpress.org/Plugin_API/Action_Reference/admin_post_(action)
在 WP 寫表單時,首先要定義一個 hidden field

<input type="hidden" name="action" value="your_post_action_name">

your_post_action_name 請自行選擇,注意這個 action 跟 <form> action 無關。<form> 一般是

<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">

然後註冊你的 handler

add_action( 'admin_post_your_post_action_name', your_handler_function );

這個 action 就是你的 your_post_action_name 前面直接黏上 admin_post_

如果你是給前台沒登入的用戶 submit form

add_action( 'admin_post_nopriv_your_post_action_name', your_handler_function );

就是 admin_post_ 改成 admin_post_nopriv_, 後面一樣黏 your_post_action_name

結論

WP 的開發眉眉角角很多,而且很多是實務的經驗 (其實 larry 不是很建議初學 web 的工程師以 WP 當做第一個學習框架)。以上只是就大的框架走過一遍,後續有空再跟大家分享吧 ~

商業,創業,業務,職涯,美食,葡萄酒,閱讀,網路科技。

從 Larry 創業以及商業的經驗,希望以白話的口吻,介紹給大家這個商業的世界。

FB粉專會頻繁地更新 Larry 對於商業、社會、人生的觀察與心得,歡迎大家追蹤互動~