โครงสร้างหลักของการพัฒนา WordPress Plugin
ทุก WordPress Plugin ที่ใช้งานได้เริ่มต้นจากไฟล์หลักหนึ่งไฟล์ ไฟล์หลักนี้เป็นจุดเริ่มต้นของ Plugin ทั้งหมด จำเป็นต้องปฏิบัติตามข้อกำหนดการตั้งชื่อและคำอธิบายเฉพาะ เพื่อให้ WordPress สามารถระบุและเปิดใช้งานได้ วิธีการทั่วไปคือการสร้างโฟลเดอร์ที่ตั้งชื่อตามชื่อของ Plugin ในไดเรกทอรี /wp-content/plugins/ เช่น /my-first-plugin/จากนั้นสร้างไฟล์หลักในโฟลเดอร์นั้น
ไฟล์หลักมีหัวใจสำคัญคือคำอธิบายส่วนหัวของปลั๊กอิน นี่คือบล็อกคำอธิบายรูปแบบเฉพาะที่วางไว้ด้านบนสุดของไฟล์ PHP ตัวอย่างคำอธิบายส่วนหัวของปลั๊กอินพื้นฐานมีดังนี้:
/**
* Plugin Name: 我的第一个插件
* Plugin URI: https://example.com/my-first-plugin
* Description: 这是一个用于演示 WordPress 插件开发的简单插件。
* Version: 1.0.0
* Author: 你的名字
* Author URI: https://example.com
* License: GPL v2 or later
* Text Domain: my-first-plugin
* Domain Path: /languages
*/ บล็อกคำอธิบายนี้บอก WordPress ถึงข้อมูลเมตาทั้งหมดเกี่ยวกับปลั๊กอิน โดยที่ Plugin Name เป็นข้อมูลที่ต้องกรอก หากไม่มี WordPress จะไม่สามารถระบุปลั๊กอินของคุณในรายการปลั๊กอินในแถบหลังบ้านได้Text Domain ใช้สำหรับสากลนิยม เป็นตัวระบุสำคัญสำหรับการเพิ่มการสนับสนุนหลายภาษาให้กับปลั๊กอินในภายหลัง
แนะนำให้อ่าน เริ่มต้นจากศูนย์: คู่มือฉบับสมบูรณ์และบทเรียนปฏิบัติจริงสำหรับการพัฒนา WordPress Plugin。
ในการจัดระเบียบโค้ดของไฟล์หลัก เพื่อรักษาความชัดเจนและหลีกเลี่ยงความขัดแย้งในการตั้งชื่อ ขอแนะนำอย่างยิ่งให้ใช้วิธีการเชิงวัตถุ (OOP) ในการพัฒนา โดยการกำหนดคลาสเพื่อห่อหุ้มฟังก์ชันทั้งหมดของปลั๊กอิน โครงสร้างคลาสมาตรฐานเริ่มต้นดังแสดงด้านล่าง:
if ( ! defined( 'ABSPATH' ) ) {
exit; // 防止直接访问文件
}
class My_First_Plugin {
/**
* 构造函数,用于初始化插件的主要钩子和功能
*/
public function __construct() {
$this->define_constants();
$this->init_hooks();
}
/**
* 定义插件常量
*/
private function define_constants() {
define( 'MFP_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
define( 'MFP_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'MFP_VERSION', '1.0.0' );
}
/**
* 初始化所有挂载点(Hooks)
*/
private function init_hooks() {
// 在这里添加动作钩子和过滤器钩子
add_action( 'init', array( $this, 'load_textdomain' ) );
add_action( 'admin_menu', array( $this, 'add_admin_menu' ) );
}
// 其他方法将在这里定义...
}
// 实例化插件类
new My_First_Plugin(); โครงสร้างนี้แยกประเด็นที่สนใจออกอย่างชัดเจน ทำให้โค้ดง่ายต่อการบำรุงรักษาและขยาย การกำหนดค่าคงที่ (เช่น MFP_PLUGIN_PATH) จัดเตรียมจุดอ้างอิงที่ใช้งานได้ทั่วโลกสำหรับเส้นทางไฟล์, URL และเวอร์ชัน การโต้ตอบทั้งหมดกับแกนหลักของ WordPress เชื่อมต่อผ่านการกระทำและตัวกรอง (เรียกรวมกันว่า "hooks") ที่กำหนดไว้ใน init_hooks เมธอด
ทำความเข้าใจกับ Action และ Filter Hooks ให้ลึกซึ้ง
WordPress ระบบตะขอเป็นรากฐานของการขยายได้ ช่วยให้นักพัฒนาสามารถ “แฮงก์” รหัสที่กำหนดเองของพวกเขาเข้าไปในจุดเวลาที่เฉพาะเจาะจงของการดำเนินการของ WordPress core, ธีม หรือปลั๊กอินอื่น ๆ โดยไม่ต้องแก้ไขไฟล์ดั้งเดิม ตะขอแบ่งออกเป็นสองประเภทหลัก: ตะขอการกระทำ (Action Hooks) และตะขอตัวกรอง (Filter Hooks)
ตะขอการกระทำจะทำงานเมื่อเหตุการณ์เฉพาะเกิดขึ้น ใช้สำหรับเพิ่มหรือปรับเปลี่ยนฟังก์ชันการทำงาน ตัวอย่างเช่น เมื่อโพสต์ถูกเผยแพร่ (publish_post), เมนูผู้ดูแลระบบถูกแสดงผล (admin_menu) หรือสคริปต์จำเป็นต้องโหลด (wp_enqueue_scripts) เมื่อใดก็ตามที่ดำเนินการ จะทริกเกอร์ action hook งานของนักพัฒนาคือเขียนฟังก์ชัน callback และ “hook” มันเข้ากับ hook ที่เหมาะสม
ตัวอย่างเช่น การสร้างหน้าตั้งค่าอย่างง่ายสำหรับปลั๊กอิน จำเป็นต้อง hook เข้ากับ admin_menu hooks:
แนะนำให้อ่าน เริ่มต้นจากศูนย์: คู่มือและบทปฏิบัติการพัฒนาปลั๊กอิน WordPress แบบครบวงจร。
public function add_admin_menu() {
add_options_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 权限能力
'my-plugin-settings', // 菜单Slug
array( $this, 'render_settings_page' ) // 回调函数
);
} ต่างจาก action hook, filter hook ใช้สำหรับปรับเปลี่ยนข้อมูล มันรับค่า (หรือชุดของค่า) อนุญาตให้ฟังก์ชัน callback ปรับเปลี่ยน แล้วส่งคืนค่าที่แก้ไขแล้ว WordPress Core เต็มไปด้วย filter ตัวอย่างเช่น the_content ใช้สำหรับกรองเนื้อหาโพสต์widget_title ใช้สำหรับการแก้ไขชื่อของวิดเจ็ต
สมมติว่าเราต้องการเพิ่มข้อความลิขสิทธิ์อัตโนมัติท้ายทุกบทความ เราสามารถใช้ the_content ตัวกรอง:
public function append_copyright( $content ) {
if ( is_single() && in_the_loop() && is_main_query() ) {
$copyright_text = '<p><em>ลิขสิทธิ์ของบทความนี้เป็นของเว็บไซต์ของเรา การนำไปเผยแพร่ต่อโปรดระบุแหล่งที่มา</em></p>';
$content .= $copyright_text;
}
return $content;
}
// 在 init_hooks 方法中挂载: add_filter( 'the_content', array( $this, 'append_copyright' ) ); ปลั๊กอินที่เสถียรและมีฟีเจอร์หลากหลายจะใช้ฮุกจำนวนมาก การใช้ฮุกอย่างถูกต้องไม่เพียงช่วยให้มีฟังก์ชันการทำงานที่ทรงพลัง แต่ยังช่วยให้ปลั๊กอินของคุณเข้ากันได้กับปลั๊กอินหรือธีมอื่นๆ การเข้าใจลำดับการทำงานและบริบทของฮุกหลักเป็นทักษะสำคัญในการพัฒนาปลั๊กอินอย่างมีประสิทธิภาพ
การพัฒนาอินเทอร์เฟซหลังบ้านและตัวเลือกการตั้งค่าของปลั๊กอิน
สำหรับปลั๊กอินที่ต้องการให้ผู้ใช้กำหนดค่า การจัดเตรียมอินเทอร์เฟซการตั้งค่าบนหลังบ้านที่เป็นมิตรเป็นสิ่งสำคัญอย่างยิ่ง โดยทั่วไปจะเกี่ยวข้องกับการสร้างหน้าตั้งค่าหนึ่งหน้าหรือมากกว่า และบันทึกตัวเลือกที่ผู้ใช้ป้อนอย่างปลอดภัย
WordPress มี Settings API ที่ทรงพลังเพื่อทำให้ขั้นตอนนี้ง่ายขึ้น โดยจัดการงานที่ซับซ้อนต่างๆ เช่น การแสดงผลหน้า การตรวจสอบความถูกต้องของฟิลด์ การรักษาความปลอดภัยด้วย nonce และการบันทึกตัวเลือก การสร้างหน้าตั้งตามักแบ่งออกเป็นสามขั้นตอน: การลงทะเบียนการตั้งค่า การเพิ่มพื้นที่ตั้งค่าและฟิลด์ และการแสดงผลหน้า
ขั้นแรก ลงทะเบียนกลุ่มตั้งค่าและฟิลด์ในฮุคเริ่มต้น:
แนะนำให้อ่าน คู่มือเริ่มต้นการพัฒนา WordPress Plugin: จากพื้นฐานสู่การเผยแพร่ในตลาดเต็มกระบวนการ。
public function register_settings() {
register_setting(
'mfp_settings_group', // 设置组名,与 settings_fields() 调用对应
'mfp_plugin_options', // 存储在 wp_options 表中的选项名
array( $this, 'sanitize_settings' ) // 可选的回调,用于清理输入
);
add_settings_section(
'mfp_main_section', // 区域ID
'主要设置', // 区域标题
array( $this, 'render_section_desc' ), // 区域描述回调
'my-plugin-settings' // 所属页面的Slug
);
add_settings_field(
'api_key_field', // 字段ID
'API密钥', // 字段标题
array( $this, 'render_api_key_field' ), // 字段输入框渲染回调
'my-plugin-settings', // 页面Slug
'mfp_main_section' // 区域ID
);
} จากนั้น คุณต้องเขียนฟังก์ชันแสดงผลสำหรับแต่ละฟิลด์ ตัวอย่างเช่น สร้างช่องป้อนข้อมูลสำหรับฟิลด์คีย์ API ข้างต้น:
public function render_api_key_field() {
$options = get_option( 'mfp_plugin_options' );
$value = isset( $options['api_key'] ) ? esc_attr( $options['api_key'] ) : '';
echo '<input type="password" id="api_key" name="mfp_plugin_options[api_key]" value="' . $value . '" class="regular-text" />';
echo '<p class="description">กรุณากรอกคีย์ API ของบริการของคุณ</p>';
} สุดท้าย สร้างฟังก์ชันสำหรับเรนเดอร์หน้าการตั้งค่าทั้งหมด ฟังก์ชันนี้จะถูกเรียกโดย add_options_page พารามิเตอร์คอลแบ็กของ:
public function render_settings_page() {
// 检查用户权限
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
?>
<div class="wrap">
<h1><?php echo esc_html( get_admin_page_title() ); ?></h1>
<form action="/th/options.php/" method="post" data-trp-original-action="options.php">
<?php
// 输出安全相关字段
settings_fields( 'mfp_settings_group' );
// 输出具体的设置区域和字段
do_settings_sections( 'my-plugin-settings' );
// 输出提交按钮
submit_button( '保存设置' );
?>
<input type="hidden" name="trp-form-language" value="th"/></form>
</div>
<?php
} ฟอร์มที่สร้างผ่าน Settings API ข้อมูลจะถูกประมวลผลผ่าน options.php โดยอัตโนมัติและบันทึกอย่างปลอดภัยลงใน wp_options ในตารางข้อมูล วิธีนี้ปลอดภัยและเป็นมาตรฐานมากกว่าการจัดการด้วยมือ $_POST ข้อมูลมีความปลอดภัยและเป็นมาตรฐานมากกว่า
แนวทางปฏิบัติที่ดีที่สุดสำหรับความปลอดภัย ประสิทธิภาพ และความเป็นสากลของปลั๊กอิน
การพัฒนา WordPress plugin ที่มืออาชีพนั้น ไม่เพียงแต่เป็นการทำให้ฟังก์ชันการทำงานเป็นจริงเท่านั้น ความปลอดภัย ประสิทธิภาพ และความเป็นสากลเป็นปัจจัยสำคัญที่กำหนดว่าปลั๊กอินจะถูกนำไปใช้อย่างกว้างขวางและได้รับการบำรุงรักษาในระยะยาวได้หรือไม่
ในด้านความปลอดภัย หลักการแรกคือ “อย่าเชื่อถือข้อมูลที่ผู้ใช้ป้อนเข้ามา” ข้อมูลทั้งหมดที่มาจากผู้ใช้หรือแหล่งภายนอก (เช่น $_GET、$_POST、$_COOKIE), ก่อนที่จะนำไปใช้ในการสืบค้นฐานข้อมูล, แสดงผลบนหน้าเว็บ หรือดำเนินการกับไฟล์ ต้องได้รับการตรวจสอบ, ทำความสะอาด หรือหนีออก
- การหนีออกของผลลัพธ์: ใช้ฟังก์ชันที่ WordPress จัดเตรียมไว้ เช่น esc_html()、esc_attr()、esc_url() 和 wp_kses_post() เพื่อให้แน่ใจว่าข้อมูลที่แสดงผลใน HTML นั้นปลอดภัย
- เตรียมการสืบค้นฐานข้อมูล: ใช้ $wpdb วิธีการที่ให้โดยคลาส เช่น $wpdb->prepare()เพื่อป้องกันการโจมตีด้วย SQL injection
- ตรวจสอบสิทธิ์: ก่อนดำเนินการจัดการหรือเข้าถึงข้อมูลที่ละเอียดอ่อน ต้องใช้ current_user_can() ตรวจสอบความสามารถของผู้ใช้ (Capability)
- ใช้ Nonce: สำหรับการส่งแบบฟอร์มหรือคำขอ Ajax ให้ใช้ wp_nonce_field()、wp_create_nonce() 和 wp_verify_nonce() เพื่อป้องกันการโจมตีแบบข้ามไซต์ (CSRF)
การปรับปรุงประสิทธิภาพก็มีความสำคัญเช่นกัน ปลั๊กอินที่เทอะทะจะทำให้เว็บไซต์ทั้งหมดช้าลง หลักปฏิบัติที่สำคัญ ได้แก่:
1. โหลดทรัพยากรตามความต้องการ: ใช้ฟังก์ชัน wp_enqueue_script() 和 wp_enqueue_style() และโหลดไฟล์ JavaScript และ CSS เฉพาะในหน้าที่ต้องการ (ผ่านการตรวจสอบเงื่อนไขเช่น is_admin()หรือฮุคเฉพาะ) เท่านั้น
2. ปรับปรุงการสืบค้นฐานข้อมูล: หลีกเลี่ยงการสืบค้นในลูป ใช้ประโยชน์จากแคชอ็อบเจ็กต์ของ WordPress และ Transients API เพื่อแคชผลการสืบค้นที่ใช้เวลานานหรือข้อมูลจากการร้องขอ API ระยะไกล ตัวอย่างเช่น การใช้ set_transient() 和 get_transient() สามารถแคชข้อมูลได้อย่างง่ายดาย
- การเพิ่มประสิทธิภาพของฮุค: ติดตั้งเฉพาะฮุคที่จำเป็น และเมื่อปลั๊กอินถูกปิดใช้งาน ให้ดำเนินการ register_deactivation_hook() การล้างข้อมูลเพื่อลบตารางฐานข้อมูลหรือตัวเลือกที่กำหนดเอง
สุดท้าย การทำให้เป็นสากล (i18n) ช่วยให้ปลั๊กอินของคุณสามารถใช้งานได้ทั่วโลก โดยใช้ __()、_e()、_x() ใช้ฟังก์ชันการแปลเพื่อดำเนินการ ขั้นตอนเฉพาะมีดังนี้:
1. 用 __('文本', 'my-first-plugin') ห่อหุ้มสตริงที่ผู้ใช้มองเห็นทั้งหมดText Domain ต้องตรงกับที่ระบุในคอมเมนต์ส่วนหัวของปลั๊กอิน
2. 使用 load_textdomain() หรือที่ทันสมัยกว่า load_plugin_textdomain() ฟังก์ชันเพื่อโหลดไฟล์การแปล โดยทั่วไปจะทำในฟังก์ชัน callback ที่ติดตั้งใน init ฮุค
public function load_textdomain() {
load_plugin_textdomain( 'my-first-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
} 3. 使用 Poedit 等工具生成 .pot ไฟล์เทมเพลตสำหรับนักแปลในการสร้าง .po 和 .mo ไฟล์ และเก็บไว้ในไดเรกทอรีปลั๊กอิน /languages/ ไดเรกทอรีอย่างถูกต้องหรือไม่
การปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเหล่านี้ ไม่เพียงแต่จะช่วยยกระดับคุณภาพของปลั๊กอินอย่างมากเท่านั้น แต่ยังทำให้กระบวนการตรวจสอบในไดเรกทอรีปลั๊กอินอย่างเป็นทางการของ WordPress เป็นไปอย่างราบรื่นยิ่งขึ้น
สรุป
ผ่านคู่มือนี้ เราได้สำรวจกระบวนการพัฒนาปลั๊กอิน WordPress อย่างเป็นระบบ เริ่มตั้งแต่การสร้างโครงสร้างไฟล์หลักที่ตรงตามมาตรฐาน ไปจนถึงการทำความเข้าใจและใช้ประโยชน์จากระบบฮุคการดำเนินการและตัวกรองอันทรงพลังของ WordPress จากนั้นไปจนถึงการใช้ Settings API ในการสร้างอินเทอร์เฟซการตั้งค่าบนแผงควบคุมที่ปลอดภัยและน่าเชื่อถือ และสุดท้ายครอบคลุมแนวทางปฏิบัติที่ดีที่สุดที่สำคัญเพื่อให้มั่นใจว่าปลั๊กอินมีความปลอดภัย มีประสิทธิภาพ และรองรับหลายภาษา ทุกขั้นตอนเป็นรากฐานสำคัญในการสร้างปลั๊กอินที่สมบูรณ์และสามารถบำรุงรักษาได้ จำไว้ว่าการพัฒนาปลั๊กอินที่ดีไม่ใช่แค่การเขียนโค้ดที่ทำงานได้ แต่ยังเกี่ยวกับการปฏิบัติตามมาตรฐานของชุมชน การให้ความสำคัญกับประสบการณ์ผู้ใช้และความปลอดภัย นำหลักการเหล่านี้ไปปฏิบัติ คุณจะสามารถมีส่วนร่วมในการขยายฟังก์ชันการทำงานคุณภาพสูงให้กับระบบนิเวศของ WordPress
คำถามที่พบบ่อย (FAQ)
การพัฒนา WordPress ปลั๊กอินต้องใช้พื้นฐานการเขียนโปรแกรมแบบใด?
การพัฒนา WordPress ปลั๊กอินต้องมีความรู้พื้นฐาน PHP ที่มั่นคง เนื่องจากตรรกะหลักของปลั๊กอินเขียนด้วย PHP นอกจากนี้ ยังต้องมีความเข้าใจพื้นฐานเกี่ยวกับ HTML, CSS และ JavaScript เพื่อสร้างและตกแต่งอินเทอร์เฟซส่วนหน้าและปฏิสัมพันธ์ ความคุ้นเคยกับแนวคิดพื้นฐานและการดำเนินการของฐานข้อมูล MySQL (เช่น CRUD) ก็มีประโยชน์สำหรับการจัดการข้อมูล ที่สำคัญที่สุดคือต้องเข้าใจแนวคิดหลักของ WordPress เช่น ฮุค (Hooks), ลูป (The Loop) และโครงสร้างลำดับชั้นของเทมเพลต
วิธีการดีบั๊กปลั๊กอิน WordPress ที่พัฒนาขึ้นเอง?
การดีบั๊กปลั๊กอิน WordPress มีหลายวิธีที่มีประสิทธิภาพ ประการแรก ควรเปิดใช้งาน wp-config.php ของคุณ โดยตั้งค่า WP_DEBUG เป็น trueซึ่งจะแสดงข้อผิดพลาด คำเตือน และการแจ้งเตือนของ PHP บนหน้าจอ ประการที่สอง ใช้ฟังก์ชัน error_log() หรือ WP_DEBUG_LOG บันทึกข้อมูลการดีบักลงในไฟล์บันทึกของเซิร์ฟเวอร์ เพื่อหลีกเลี่ยงการรบกวนการแสดงผลที่ส่วนหน้า สำหรับตรรกะที่ซับซ้อน สามารถใช้เครื่องมือดีบัก PHP ระดับมืออาชีพ เช่น Xdebug ร่วมกับ IDE (เช่น PhpStorm, VS Code) เพื่อทำการดีบักแบบเบรกพอยต์ นอกจากนี้ การแสดงค่าตัวแปรชั่วคราวในโค้ด (ในสภาพแวดล้อมการพัฒนา) ก็เป็นวิธีทั่วไปในการระบุปัญหาอย่างรวดเร็ว
ปลั๊กอินที่ฉันพัฒนาจะส่งไปยังไดเรกทอรีปลั๊กอินอย่างเป็นทางการของ WordPress ได้อย่างไร
ก่อนส่งปลั๊กอินไปยังไดเรกทอรีทางการ โปรดตรวจสอบให้แน่ใจว่ามันปฏิบัติตามมาตรฐานการเข้ารหัสของ WordPress อย่างเคร่งครัด และผ่านการตรวจสอบจาก PHP_CodeSniffer 与 WordPress-Coding-Standards คุณต้องมีบัญชี WordPress.org จากนั้นส่งปลั๊กอินในแผงควบคุม “ผู้พัฒนา” กระบวนการนี้รวมถึงการกรอกข้อมูลปลั๊กอินโดยละเอียด (README) ตรวจสอบให้มั่นใจว่าโค้ดมีความปลอดภัยและไม่มีอันตราย ให้คำประกาศความเข้ากันได้ และเตรียมไอคอนและภาพแบนเนอร์ที่ตรงตามข้อกำหนดของไดเรกทอรี หลังจากส่ง ฝ่ายตรวจสอบปลั๊กอินจะทำการตรวจสอบด้วยตนเอง ซึ่งกระบวนการนี้อาจใช้เวลาหลายสัปดาห์ หลังจากผ่านการตรวจสอบแล้ว ปลั๊กอินของคุณจะสามารถถูกค้นหาและติดตั้งโดยผู้ใช้ทั่วโลกได้
ควรสร้างและลบตารางฐานข้อมูลที่กำหนดเองในปลั๊กอินเมื่อใด
เวลาที่ดีที่สุดในการสร้างตารางฐานข้อมูลแบบกำหนดเองคือเมื่อปลั๊กอินถูกเปิดใช้งาน คุณควรใช้ฟังก์ชัน register_activation_hook() เพื่อเชื่อมโยงฟังก์ชันเรียกกลับ ซึ่งภายในฟังก์ชันนี้ให้ใช้ฟังก์ชัน dbDelta() เพื่อสร้างหรืออัปเดตโครงสร้างตารางอย่างปลอดภัยdbDelta() ต้องการรูปแบบคำสั่ง SQL ที่เข้มงวดมาก การลบตารางแบบกำหนดเองควรทำเมื่อปลั๊กอินถูกลบออก ไม่ใช่เมื่อปิดการใช้งาน เพราะผู้ใช้อาจเพียงแค่ปิดการใช้งานปลั๊กอินชั่วคราว คุณสามารถทำได้ใน uninstall.php เขียนตรรกะการล้างข้อมูลในไฟล์ ไฟล์นี้จะถูกดำเนินการเฉพาะเมื่อผู้ใช้คลิก “ลบ” ปลั๊กอินผ่าน WordPress แดชบอร์ด เพื่อป้องกันการลบข้อมูลผู้ใช้โดยไม่ได้ตั้งใจ
ขั้นต่อไป ฉันควรทำอย่างไรต่อไป
อ่านเพิ่มเติมและรับความรู้ที่มีประโยชน์
下面这些内容与本文主题相关,适合继续深入阅读。优先从与你当前问题最接近的文章开始看,再逐步扩展到周边主题,效果通常会更好。
- วิธีการเลือกและปรับแต่งธีม WordPress ที่สมบูรณ์แบบสำหรับคุณ
- คู่มือการพัฒนา WordPress Plugin: สร้างปลั๊กอินที่กำหนดเองตัวแรกของคุณตั้งแต่เริ่มต้น
- เป็นนักพัฒนา WordPress Plugin: คู่มือฉบับสมบูรณ์จากศูนย์ถึงหนึ่ง
- จากศูนย์สู่วันที่หนึ่ง: คู่มือฉบับสมบูรณ์และเทคนิคปฏิบัติจริงในการสร้างเว็บไซต์ระดับมืออาชีพด้วย WordPress
- คู่มือการพัฒนา WordPress Plugin อย่างสมบูรณ์: จากพื้นฐานสู่ระดับเชี่ยวชาญในการสร้างส่วนขยายมืออาชีพ