SlideShare a Scribd company logo
5 年後還是新手
WordPress Plugin 開發大冒險
The Levels - Agenda
- 故事背景
Background
- 新手村
Why, and how to start your own plugin?
- 打怪
Here comes the users
- 打大佬
Gutenberg, Modern Admin UI, Security
Background - About me
Fullstack developer; Game Developer
Tech lead, Liker Land
Be open source!
Background - Our plugin and products
LikeCoin:
blockchain for content creators and
publishing
LikerLand:
Writing NFTs and bookstore
Web3Press:
Web3 plugin for WordPress users
Introduction - Why make a plugin?
Site owners:
- Enable and disable plugin easily
- Track the actual changes all in one place
- WordPress upgrade doesn’t break your change
Developer:
- Share your code and functionalities
Business:
- Sell your product!
Overview - How to make a plugin?
Plugin Handbook - 新手指南
https://developer.wordpress.org/plugins/
- Hooks
- Change the post content on publish “content”
- Add a Google Analyics in your site header “hook_header”
- APIs
- Post your post to https://matters.town as a draft
- Send your url to Internet Archive for snapshot
Overview - Code Setup
WordPress runs on:
Basic (oldschool) setup
- PHP - Pages, Logic, where hook happen
- Javascript - Browser interactions, update UI and calls
API
- CSS - Style your UI
Protip: Start with a boiler plate
- wp scaffold plugin
- https://github.com/devinvinson/WordPress-Plugin-Boil
erplate
Overview - Code best pratices
https://developer.wordpress.org/plugins/plugin-basics/best-practices/
e.g. WordPress PHP codes are all in one global namespace
If you function has a 公廁名 then it will either overwrite someone else’s stuff,
or get overwritten.
Prefix your functions (likecoin_foo) vs Objects (still has to be unique in class
name)
Overview - License
- WordPress is GPLv2
- Infective open source license
- Pick anything GPLv2 compatible, say
GPLv2
- Remember to add file headers!
- https://developer.wordpress.org/plugin
s/plugin-basics/including-a-software-lic
ense/
Overview - Done? Ship it!
- GPLv2 compatible
- Code must be human
readable, or come with
source map/source code
- Plugin slug approved by
wordpress.org
- Push version to SVN
- Profit!
You can always view code of
any plugin on wordpress.org
SVN
Now the true adventure begins
Hey I use PHP 5.2 and your
site breaks
https://github.com/likecoin/likecoin-wordpress/pull/28
Hey I use PHP (insert legacy version here)
- WordPress can run on PHP 5.2 - 8.0
- https://make.wordpress.org/core/handboo
k/references/php-compatibility-and-wordp
ress-versions/
- Newer syntax won’t work on sites with
newer PHP
- Dev: Always prefer older syntax
- Define minimum support PHP version in
your plugin
- Site owner: Try to upgrade PHP!
Hey can it also be in
Spanish
This one is from discord
Hey can it also has a (insert language here) version?
Internationalization problem - i18n
Meet translate.wordpress.org
Meet translate.wordpress.org
Keys are the original string
Anyone can propose translation for any string and locale
How do I make sure my strings show up?
PHP:
__( 'Hello, dear user!', 'plugin-slug’ );
Javascript:
Legacy: wp_localize_script() and pass string from PHP
Modern: @wordpress/i18n
https://codex.wordpress.org/I18n_for_WordPress_Developers
Polyglot team, i.e. You don’t own your i18n!
- Making the plugin does not automatically makes you a approved translator
- Try get approved as PTE for your plugin, per locale basis
https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/pte-re
quest/
How You can help
- Help translate WordPress Core
- Help translate any plugin you use/like
Q: Hey I use AMP, your
iframe broken
https://github.com/likecoin/likecoin-wordpress/pull/51
Hey I use AMP, …
- Many sites enable AMP for SEO
- AMP plugin https://wordpress.org/plugins/amp/
- When AMP is active, not only style get simplified, e.g.
iframe get sandboxed
- In our case, add attribute we need from
https://developer.mozilla.org/en-US/docs/Web/HTML/
Element/iframe#sandbox
- In PHP, test for AMP mode using
is_amp_endpoint() / amp_is_request()
- Always test the AMP version!
Hey I want to use
shortcode!
https://github.com/likecoin/likecoin-wordpress/pull/54
Hey I want to use shortcode!
What is shortcode?
[likecoin]
In fact easy to support parameter too
[likecoin liker-id=ckxpress]
Turns out it is simple to implement in “content” filter with
add_shortcode()
Hard to document though!
Hey your plugin throw JS
error after upgrade!
https://github.com/likecoin/likecoin-wordpress/pull/140
Hey your plugin upgrade does not upgrade
- Generally a hard to debug issue
- In this particular case, Javascript was cached
- Most sites has some kind of CDN cache for all js, css files
- Oldschool way
$ver = plugin version in wp_enqueue_script() and wp_enqueue_style()
- Modern way:
@wordpress/script build and index.asset.php
Here are only two hard things in Computer Science: cache invalidation and
naming things
Hey your stuff doesn’t show
properly in my theme
https://github.com/likecoin/likecoin-wordpress/pull/88
Hey your stuff doesn’t show properly in my theme
- Normally this one is very hard
- All the themes with different DOM and
CSS => can’t fit all
- Turns out just wrapping our iframe in
<figure> does wonder
- This is due to blocks are mostly
wrapped with <p> or <figure>, modern
themes are designed to handle them
properly
Did we just mention blocks?
The Bosses
Gutenberg
Modern block editor
Gutenberg
- Block based editor
- Full site editing
- Released as default in WordPress 5.0
- Now the old editor is a plugin called
“Classic Editor”
What does that mean for plugin?
- Editor sidebar support
- Block support
Editor Sidebar - metabox is now outdated
Editor Sidebar - metabox is now outdated
Editor Sidebar - metabox is now outdated
Metabox in its simplest form, is just extra fields in HTML <form>
- Submit post => Submit fields in metabox => Updates data with post
Sidebar is a complex web app
- On publish, Gutenberg does a XHR instead of refresh
- Your sidebar is expected to listen to events and does XHR too
- Maybe also multitab JavaScript based navigation, like a full blown SPA
- In fact it is a React SPA!
Blocks - shortcode is now outdated
Remember shortcode [likecoin liker-id=ckxpress]?
How about a UI to list all shortcodes, configure their parameters, and maybe also
a preview?
Blocks - shortcode is now outdated
- Add your own blocks for site
- block.json defines all the metadata
- edit.js and save.js defines different behaviour, in
editor vs in actual post view
- Make variants for blocks that has common attributes
https://developer.wordpress.org/block-editor/
@wordpress/data
Modern admin UI and its data
- PHP renders HTML
- PHP GET => Fill data with HTML
- What about JavaScript? Write another AJAX API in PHP
- Write AJAX API => Need to check admin yourself
- So two set of codes for same thing
PHP: data are written directly into HTML (We call that SSR nowadays)
Javascript + AJAX API: data are fetched with XHR and updated by
JavaScript (Hydration!)
- This sound suspiciously like “reinventing my own next.js/nuxt.js for every form
input”...
Before @wordpress/data
After @wordpress/data
Redux-like syntax abstract all the API calls and authentication behind a selector
const isCurrentPostPublished = select('core/editor').isCurrentPostPublished()
const postDate = select('core/editor').getEditedPostAttribute('modified_gmt')
Cool!
But… in no where are the available data fields clearly documented!
Security!
How many CVE are from plugin instead of core?
Why a plugin breach affect the whole site?
- WordPress code runs in a global space
- No effective isolation between plugins, or actually, everything
- Horrible in security sense
i.e.
You can write a plugin to change any user/admin data
You can write a plugin to change data used by other plugin
- Actually thats how plugin for plugins work
e.g. woocommence, woocommence plugins, woocommence plugins pro
version, which is a paid plugin for woocommence plugin
How can plugin developer prevent this?
- Sanitize all input and output
Why both? Don’t trust any data to be safe
sanitize_*, esacpe_*
洗手洗手洗手
- Use WordPress provided function instead of PHP or writing
your own
wp_remote_get()
- Wordpress coding standard linter warns all unsantized output
https://developer.wordpress.org/plugins/security/
How can site owner prevent this?
Disable unneeded plugin
- Disabling plugin disable many of its hook and API, reducing attack surfaces
Uninstall unneeded plugin
- Plugin can hook on install, uninstall and upgrade
Try to understand what data and option are created by your plugin, and does it
clean them up after uninstall?
- WordPress does not record these on install, devs can be lazy or don’t even
know they should clean up data
There’s more…
Like 200 more things about
- Really silly APIs
- Subtle non-documented functions
- Stupid mistakes we made (mostly this)
… that I can talk about, but let’s not dig too
deep into this here.
Hey it’s Q&A
Now it’s your chance to contribute content to this slide!

More Related Content

PPT
Making the Most of Plug-ins - WordCamp Toronto 2008
PDF
WordCamp Belfast DevOps for Beginners
PPT
WordPress Plugin Development- Rich Media Institute Workshop
PDF
Modern Web Application Development Workflow - web2day 2014
PPTX
Advanced WordPress Tooling: By InstaWP.com
PPTX
WP REST API - Building a simple Web Application
PDF
WordPress Plugin Development 201
PDF
5 Steps to Develop a WordPress Plugin From Scratch.pdf
Making the Most of Plug-ins - WordCamp Toronto 2008
WordCamp Belfast DevOps for Beginners
WordPress Plugin Development- Rich Media Institute Workshop
Modern Web Application Development Workflow - web2day 2014
Advanced WordPress Tooling: By InstaWP.com
WP REST API - Building a simple Web Application
WordPress Plugin Development 201
5 Steps to Develop a WordPress Plugin From Scratch.pdf

Similar to 5 年後還是新手 - WordPress Plugin 開發大冒險 - GOTY (20)

PDF
Modern Web Application Development Workflow - EclipseCon France 2014
PPTX
Faster WordPress Workflows
PDF
Plugin development demystified 2017
PDF
Using the new WordPress REST API
PDF
Developers, Be a Bada$$ with WP-CLI
PPTX
Vue micro frontend implementation patterns
PDF
Webpack: from 0 to 2
PDF
Profiling PHP with Xdebug / Webgrind
PPTX
PHP on Windows
PPTX
PHP on Windows
PDF
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
PDF
WPDay Bologna 2013
PDF
Modern Web Application Development Workflow - EclipseCon Europe 2014
PPTX
1 pluginable laravel cms
PDF
Building Mobile Friendly APIs in Rails
PPT
Setting up the hyperledger composer in ubuntu
PPTX
WordPress Optimization & Security - LAC 2013, London
PPTX
AD113 Speed Up Your Applications w/ Nginx and PageSpeed
PPTX
A glance at the Rust SWC
DOCX
unit1 part 1 sem4 php.docx
Modern Web Application Development Workflow - EclipseCon France 2014
Faster WordPress Workflows
Plugin development demystified 2017
Using the new WordPress REST API
Developers, Be a Bada$$ with WP-CLI
Vue micro frontend implementation patterns
Webpack: from 0 to 2
Profiling PHP with Xdebug / Webgrind
PHP on Windows
PHP on Windows
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
WPDay Bologna 2013
Modern Web Application Development Workflow - EclipseCon Europe 2014
1 pluginable laravel cms
Building Mobile Friendly APIs in Rails
Setting up the hyperledger composer in ubuntu
WordPress Optimization & Security - LAC 2013, London
AD113 Speed Up Your Applications w/ Nginx and PageSpeed
A glance at the Rust SWC
unit1 part 1 sem4 php.docx

More from William Chong (15)

PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
AI 殺到埋來九龍新界無得避 - A sharing on ways to leverage AI
PDF
賣女孩救火柴 - Can I solo a game jam with the help of AI? - Global Game Jam Hong K...
PDF
SEO 門外漢入門
PDF
Disneyland: details in imagineering
PDF
Writing NFT - POAP for Content
PDF
Game Design 9up
PDF
Expecto Patronum! Stable Diffusion!
PDF
Introduction to data visualization
PDF
Introducing Vtuber LikeCoin chan - Vtuber culture and how to
PDF
Road to cloud hero
PDF
HKOSCON 2020 - Open by default
PDF
LikeCoin SDK and API sharing
PDF
LikeCoin SDK 及 API 分享
PDF
Intro to Github Actions @likecoin
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
AI 殺到埋來九龍新界無得避 - A sharing on ways to leverage AI
賣女孩救火柴 - Can I solo a game jam with the help of AI? - Global Game Jam Hong K...
SEO 門外漢入門
Disneyland: details in imagineering
Writing NFT - POAP for Content
Game Design 9up
Expecto Patronum! Stable Diffusion!
Introduction to data visualization
Introducing Vtuber LikeCoin chan - Vtuber culture and how to
Road to cloud hero
HKOSCON 2020 - Open by default
LikeCoin SDK and API sharing
LikeCoin SDK 及 API 分享
Intro to Github Actions @likecoin

Recently uploaded (20)

PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Modernizing your data center with Dell and AMD
PPTX
MYSQL Presentation for SQL database connectivity
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PDF
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
PPTX
Cloud computing and distributed systems.
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Approach and Philosophy of On baking technology
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
NewMind AI Monthly Chronicles - July 2025
Diabetes mellitus diagnosis method based random forest with bat algorithm
Modernizing your data center with Dell and AMD
MYSQL Presentation for SQL database connectivity
NewMind AI Weekly Chronicles - August'25 Week I
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
Advanced methodologies resolving dimensionality complications for autism neur...
20250228 LYD VKU AI Blended-Learning.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
Cloud computing and distributed systems.
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Approach and Philosophy of On baking technology
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
The Rise and Fall of 3GPP – Time for a Sabbatical?

5 年後還是新手 - WordPress Plugin 開發大冒險 - GOTY

  • 2. The Levels - Agenda - 故事背景 Background - 新手村 Why, and how to start your own plugin? - 打怪 Here comes the users - 打大佬 Gutenberg, Modern Admin UI, Security
  • 3. Background - About me Fullstack developer; Game Developer Tech lead, Liker Land Be open source!
  • 4. Background - Our plugin and products LikeCoin: blockchain for content creators and publishing LikerLand: Writing NFTs and bookstore Web3Press: Web3 plugin for WordPress users
  • 5. Introduction - Why make a plugin? Site owners: - Enable and disable plugin easily - Track the actual changes all in one place - WordPress upgrade doesn’t break your change Developer: - Share your code and functionalities Business: - Sell your product!
  • 6. Overview - How to make a plugin? Plugin Handbook - 新手指南 https://developer.wordpress.org/plugins/ - Hooks - Change the post content on publish “content” - Add a Google Analyics in your site header “hook_header” - APIs - Post your post to https://matters.town as a draft - Send your url to Internet Archive for snapshot
  • 7. Overview - Code Setup WordPress runs on: Basic (oldschool) setup - PHP - Pages, Logic, where hook happen - Javascript - Browser interactions, update UI and calls API - CSS - Style your UI Protip: Start with a boiler plate - wp scaffold plugin - https://github.com/devinvinson/WordPress-Plugin-Boil erplate
  • 8. Overview - Code best pratices https://developer.wordpress.org/plugins/plugin-basics/best-practices/ e.g. WordPress PHP codes are all in one global namespace If you function has a 公廁名 then it will either overwrite someone else’s stuff, or get overwritten. Prefix your functions (likecoin_foo) vs Objects (still has to be unique in class name)
  • 9. Overview - License - WordPress is GPLv2 - Infective open source license - Pick anything GPLv2 compatible, say GPLv2 - Remember to add file headers! - https://developer.wordpress.org/plugin s/plugin-basics/including-a-software-lic ense/
  • 10. Overview - Done? Ship it! - GPLv2 compatible - Code must be human readable, or come with source map/source code - Plugin slug approved by wordpress.org - Push version to SVN - Profit! You can always view code of any plugin on wordpress.org SVN
  • 11. Now the true adventure begins
  • 12. Hey I use PHP 5.2 and your site breaks https://github.com/likecoin/likecoin-wordpress/pull/28
  • 13. Hey I use PHP (insert legacy version here) - WordPress can run on PHP 5.2 - 8.0 - https://make.wordpress.org/core/handboo k/references/php-compatibility-and-wordp ress-versions/ - Newer syntax won’t work on sites with newer PHP - Dev: Always prefer older syntax - Define minimum support PHP version in your plugin - Site owner: Try to upgrade PHP!
  • 14. Hey can it also be in Spanish This one is from discord
  • 15. Hey can it also has a (insert language here) version? Internationalization problem - i18n Meet translate.wordpress.org
  • 16. Meet translate.wordpress.org Keys are the original string Anyone can propose translation for any string and locale
  • 17. How do I make sure my strings show up? PHP: __( 'Hello, dear user!', 'plugin-slug’ ); Javascript: Legacy: wp_localize_script() and pass string from PHP Modern: @wordpress/i18n https://codex.wordpress.org/I18n_for_WordPress_Developers
  • 18. Polyglot team, i.e. You don’t own your i18n! - Making the plugin does not automatically makes you a approved translator - Try get approved as PTE for your plugin, per locale basis https://make.wordpress.org/polyglots/handbook/plugin-theme-authors-guide/pte-re quest/
  • 19. How You can help - Help translate WordPress Core - Help translate any plugin you use/like
  • 20. Q: Hey I use AMP, your iframe broken https://github.com/likecoin/likecoin-wordpress/pull/51
  • 21. Hey I use AMP, … - Many sites enable AMP for SEO - AMP plugin https://wordpress.org/plugins/amp/ - When AMP is active, not only style get simplified, e.g. iframe get sandboxed - In our case, add attribute we need from https://developer.mozilla.org/en-US/docs/Web/HTML/ Element/iframe#sandbox - In PHP, test for AMP mode using is_amp_endpoint() / amp_is_request() - Always test the AMP version!
  • 22. Hey I want to use shortcode! https://github.com/likecoin/likecoin-wordpress/pull/54
  • 23. Hey I want to use shortcode! What is shortcode? [likecoin] In fact easy to support parameter too [likecoin liker-id=ckxpress] Turns out it is simple to implement in “content” filter with add_shortcode() Hard to document though!
  • 24. Hey your plugin throw JS error after upgrade! https://github.com/likecoin/likecoin-wordpress/pull/140
  • 25. Hey your plugin upgrade does not upgrade - Generally a hard to debug issue - In this particular case, Javascript was cached - Most sites has some kind of CDN cache for all js, css files - Oldschool way $ver = plugin version in wp_enqueue_script() and wp_enqueue_style() - Modern way: @wordpress/script build and index.asset.php Here are only two hard things in Computer Science: cache invalidation and naming things
  • 26. Hey your stuff doesn’t show properly in my theme https://github.com/likecoin/likecoin-wordpress/pull/88
  • 27. Hey your stuff doesn’t show properly in my theme - Normally this one is very hard - All the themes with different DOM and CSS => can’t fit all - Turns out just wrapping our iframe in <figure> does wonder - This is due to blocks are mostly wrapped with <p> or <figure>, modern themes are designed to handle them properly
  • 28. Did we just mention blocks?
  • 31. Gutenberg - Block based editor - Full site editing - Released as default in WordPress 5.0 - Now the old editor is a plugin called “Classic Editor” What does that mean for plugin? - Editor sidebar support - Block support
  • 32. Editor Sidebar - metabox is now outdated
  • 33. Editor Sidebar - metabox is now outdated
  • 34. Editor Sidebar - metabox is now outdated Metabox in its simplest form, is just extra fields in HTML <form> - Submit post => Submit fields in metabox => Updates data with post Sidebar is a complex web app - On publish, Gutenberg does a XHR instead of refresh - Your sidebar is expected to listen to events and does XHR too - Maybe also multitab JavaScript based navigation, like a full blown SPA - In fact it is a React SPA!
  • 35. Blocks - shortcode is now outdated Remember shortcode [likecoin liker-id=ckxpress]? How about a UI to list all shortcodes, configure their parameters, and maybe also a preview?
  • 36. Blocks - shortcode is now outdated - Add your own blocks for site - block.json defines all the metadata - edit.js and save.js defines different behaviour, in editor vs in actual post view - Make variants for blocks that has common attributes https://developer.wordpress.org/block-editor/
  • 38. - PHP renders HTML - PHP GET => Fill data with HTML - What about JavaScript? Write another AJAX API in PHP - Write AJAX API => Need to check admin yourself - So two set of codes for same thing PHP: data are written directly into HTML (We call that SSR nowadays) Javascript + AJAX API: data are fetched with XHR and updated by JavaScript (Hydration!) - This sound suspiciously like “reinventing my own next.js/nuxt.js for every form input”... Before @wordpress/data
  • 39. After @wordpress/data Redux-like syntax abstract all the API calls and authentication behind a selector const isCurrentPostPublished = select('core/editor').isCurrentPostPublished() const postDate = select('core/editor').getEditedPostAttribute('modified_gmt') Cool! But… in no where are the available data fields clearly documented!
  • 40. Security! How many CVE are from plugin instead of core?
  • 41. Why a plugin breach affect the whole site? - WordPress code runs in a global space - No effective isolation between plugins, or actually, everything - Horrible in security sense i.e. You can write a plugin to change any user/admin data You can write a plugin to change data used by other plugin - Actually thats how plugin for plugins work e.g. woocommence, woocommence plugins, woocommence plugins pro version, which is a paid plugin for woocommence plugin
  • 42. How can plugin developer prevent this? - Sanitize all input and output Why both? Don’t trust any data to be safe sanitize_*, esacpe_* 洗手洗手洗手 - Use WordPress provided function instead of PHP or writing your own wp_remote_get() - Wordpress coding standard linter warns all unsantized output https://developer.wordpress.org/plugins/security/
  • 43. How can site owner prevent this? Disable unneeded plugin - Disabling plugin disable many of its hook and API, reducing attack surfaces Uninstall unneeded plugin - Plugin can hook on install, uninstall and upgrade Try to understand what data and option are created by your plugin, and does it clean them up after uninstall? - WordPress does not record these on install, devs can be lazy or don’t even know they should clean up data
  • 44. There’s more… Like 200 more things about - Really silly APIs - Subtle non-documented functions - Stupid mistakes we made (mostly this) … that I can talk about, but let’s not dig too deep into this here.
  • 45. Hey it’s Q&A Now it’s your chance to contribute content to this slide!