การเตรียมการและการตั้งค่าสภาพแวดล้อม
ก่อนที่จะพัฒนา WordPress plugin การสร้างสภาพแวดล้อมการพัฒนาท้องถิ่นที่เสถียรเป็นสิ่งสำคัญมาก นี่จะช่วยให้คุณสามารถทดสอบและแก้ไขข้อบกพร่องได้โดยไม่กระทบกับเว็บไซต์ออนไลน์
การเลือกและการกำหนดค่าสภาพแวดล้อมการพัฒนาท้องถิ่น
ขั้นตอนหลักที่สำคัญที่สุดคือการตั้งค่าเซิร์ฟเวอร์ท้องถิ่นที่รวม PHP, MySQL และ Apache/Nginx คุณสามารถเลือกMAMP、XAMPPซอฟต์แวร์ชุดรวมดังกล่าว ซึ่งให้วิธีการติดตั้งที่สะดวกสำหรับ Windows และ macOS สำหรับผู้ใช้ระดับสูง การใช้Dockerการทำให้สภาพแวดล้อมการพัฒนาของคุณเป็นแบบ Containerized เป็นแนวทางปฏิบัติที่ดีที่สุดในปัจจุบัน ซึ่งช่วยให้มั่นใจได้ว่าสภาพแวดล้อมมีความสม่ำเสมอและทำซ้ำได้ง่าย ไม่ว่าคุณจะเลือกวิธีใด โปรดตรวจสอบให้แน่ใจว่าเวอร์ชัน PHP ของคุณเข้ากันได้กับเวอร์ชันหลักที่ปลั๊กอินคาดหวังให้ทำงาน (เช่น PHP 7.4 ขึ้นไป) และเปิดใช้งานส่วนขยาย PHP ที่จำเป็น เช่น MySQLi หรือ PDO
ติดตั้งและกำหนดค่า WordPress
หลังจากที่สภาพแวดล้อมเซิร์ฟเวอร์ท้องถิ่นพร้อมแล้ว คุณจำเป็นต้องติดตั้ง WordPress Core ดาวน์โหลดเวอร์ชันล่าสุดที่เสถียรจากเว็บไซต์ WordPress.org แล้วแยกไฟล์ไปยังโฟลเดอร์ในไดเรกทอรีรากเว็บของเซิร์ฟเวอร์ของคุณ (เช่นhtdocs或www) หลังจากนั้น เข้าถึงโฟลเดอร์นั้นผ่านเบราว์เซอร์และทำตามขั้นตอนการติดตั้ง “ห้านาที” ที่มีชื่อเสียงเพื่อดำเนินการตั้งค่าให้เสร็จสิ้น แนะนำให้สร้างฐานข้อมูลเฉพาะสำหรับการพัฒนาปลั๊กอิน และจดชื่อฐานข้อมูล ชื่อผู้ใช้ และรหัสผ่านไว้ หลังการติดตั้ง เข้าสู่แผงควบคุม WordPress และตั้งค่าโครงสร้างลิงก์ถาวรเป็นรูปแบบที่ไม่ใช่ค่าเริ่มต้น เช่น “ชื่อโพสต์” ซึ่งจะช่วยในการทดสอบความเข้ากันได้ของปลั๊กอินกับลิงก์ถาวร
แนะนำให้อ่าน การพัฒนา WordPress Theme สำหรับผู้เริ่มต้น: สร้างธีมที่กำหนดเองชิ้นแรกของคุณตั้งแต่เริ่มต้น。
เครื่องมือพัฒนาที่จำเป็นแนะนำ
การพัฒนาอย่างมีประสิทธิภาพขาดไม่ได้ซึ่งเครื่องมือที่เหมาะสม ก่อนอื่นคุณต้องมีโปรแกรมแก้ไขโค้ด เช่นVisual Studio Codeซึ่งฟรีและทรงพลัง ติดตั้งปลั๊กอินสำหรับ PHP, WordPress และการรับรู้โค้ดอัจฉริยะ เครื่องมือควบคุมเวอร์ชันGitเป็นเครื่องมือที่จำเป็นสำหรับการจัดการการเปลี่ยนแปลงโค้ดและย้อนดูประวัติ เครื่องมือนักพัฒนาของเบราว์เซอร์ (Chrome DevTools หรือ Firefox Developer Edition) สำคัญอย่างยิ่งสำหรับการดีบั๊กด้านฟรอนท์เอนด์ สุดท้าย พิจารณาติดตั้งเครื่องมือตรวจสอบคุณภาพโค้ด เช่นPHP_CodeSnifferจับคู่กับWordPress-Coding-Standardsชุดกฎ ซึ่งจะช่วยให้คุณปฏิบัติตามมาตรฐานการเข้ารหัสอย่างเป็นทางการของ WordPress
โครงสร้างพื้นฐานของปลั๊กอินและไฟล์หลัก
ปลั๊กอิน WordPress มาตรฐานมีโครงสร้างไดเรกทอรีและไฟล์เฉพาะ การปฏิบัติตามข้อกำหนดเหล่านี้เป็นพื้นฐานที่ระบบจะจดจำและจัดการปลั๊กอินได้อย่างมีประสิทธิภาพ
องค์ประกอบพื้นฐานและหน้าที่ของไฟล์หลัก
ทุกปลั๊กอินต้องมีไฟล์ PHP หลัก ซึ่งทำหน้าที่เป็นจุดเข้าใช้งานของปลั๊กอิน คอมเมนต์ส่วนหัวของไฟล์นี้มีข้อมูลเมตาของปลั๊กอิน และเป็นกุญแจสำคัญที่ WordPress ใช้ในการจดจำปลั๊กอิน ต่อไปนี้คือไฟล์หลักของปลั๊กอินที่พื้นฐานที่สุดmy-first-plugin.phpตัวอย่าง:
<?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
*/
// 防止直接文件访问
if ( ! defined( 'ABSPATH' ) ) {
exit;
} Plugin Nameเป็นฟิลด์เดียวที่จำเป็น ใช้สำหรับแสดงในรายการปลั๊กอินในแถบหลังบ้าน แนะนำให้กำหนดABSPATHตรวจสอบเพื่อป้องกันผู้ใช้ที่มุ่งร้ายจากการเข้าถึงไฟล์หลักของปลั๊กอินโดยตรง
เพิ่มโค้ดหลักสำหรับฟังก์ชันการทำงานให้กับปลั๊กอิน
หลังจากส่วนความคิดเห็นส่วนหัวแล้ว คุณสามารถเริ่มเขียนโค้ดฟังก์ชันการทำงานของปลั๊กอินได้ ตัวอย่างที่ง่ายที่สุดคือการเพิ่มข้อความ “Hello World” ไปยังแถบจัดการหลังบ้าน คุณสามารถใช้add_actionฮุคเพื่อเชื่อมต่อฟังก์ชันที่กำหนดเองไปยังจุดดำเนินการเฉพาะของ WordPress:
แนะนำให้อ่าน เริ่มต้นจากศูนย์: คู่มือและบทปฏิบัติการพัฒนาปลั๊กอิน WordPress แบบครบวงจร。
/**
* 在管理后台顶部显示欢迎信息
*/
function myfp_display_admin_notice() {
echo '<div class="notice notice-success is-dismissible"><p>ยินดีต้อนรับสู่ “ปลั๊กอินแรกของฉัน”!</p></div>';
}
add_action( 'admin_notices', 'myfp_display_admin_notice' ); เพื่อรักษาความเป็นระเบียบของโค้ดและหลีกเลี่ยงความขัดแย้งในการตั้งชื่อ ควรใช้คำนำหน้าที่ไม่ซ้ำกันสำหรับชื่อฟังก์ชันและคลาสทั้งหมด เช่น ที่นี่คือmyfp_(ย่อมาจาก My First Plugin)
มาตรฐานการจัดระเบียบไดเรกทอรีปลั๊กอินและไฟล์ทรัพยากร
ปลั๊กอินที่มีความซับซ้อนมากขึ้นมักประกอบด้วยหลายไฟล์ โครงสร้างไดเรกทอรีที่เหมาะสมสามารถเพิ่มความสามารถในการบำรุงรักษาได้อย่างมาก วิธีจัดระเบียบทั่วไปมีดังนี้:
- /assets/: เก็บทรัพยากรสถิตย์เช่น CSS, JavaScript, รูปภาพ และฟอนต์
- /includes/: เก็บไฟล์คลาส PHP หลักและไฟล์ฟังก์ชันการทำงาน
- /admin/: เก็บไฟล์ PHP, CSS และ JS ที่เกี่ยวข้องเฉพาะกับส่วนหลังของแอดมิน
- /public/: เก็บไฟล์ที่เกี่ยวข้องกับส่วนหน้าของเว็บไซต์
- /languages/: เก็บไฟล์แปลสากล (.po, .mo)
จงจำไว้เสมอว่าไฟล์ปลั๊กอินหลักอยู่ในไดเรกทอรีรากของปลั๊กอิน เมื่ออ้างอิงถึงไฟล์ทรัพยากรในโค้ด ควรใช้plugin_dir_url( FILE )或plugin_dir_path( FILE )เพื่อดึง URL หรือเส้นทางเซิร์ฟเวอร์ที่ถูกต้องแบบไดนามิก
กลไกฮุคเพื่อโต้ตอบกับ API หลัก
จิตวิญญาณของการพัฒนา WordPress Plugin อยู่ที่กลไก “Hook” ซึ่งช่วยให้โค้ดของคุณสามารถแทรกและทำงานในช่วงเวลาที่กำหนดในส่วนหลัก, ธีม หรือปลั๊กอินอื่นๆ
ทำความเข้าใจกับ Action Hooks และ Filter Hooks
Hook แบ่งออกเป็นสองประเภทหลัก: Action และ Filter Action Hook ใช้สำหรับรันโค้ดของคุณเมื่อเหตุการณ์เฉพาะเกิดขึ้น เช่น หลังจากเผยแพร่โพสต์ ก่อนโหลดหน้าเว็บ มันไม่ส่งคืนค่าใดๆ แค่ “ทำ” บางสิ่ง ฟังก์ชันหลักที่ใช้คือadd_action()和do_action()Filter Hook ใช้สำหรับปรับเปลี่ยนข้อมูล ก่อนที่ข้อมูลจะถูกใช้, บันทึก หรือแสดงผล คุณสามารถดักจับและปรับเปลี่ยนได้ มันต้องส่งคืนค่า ฟังก์ชันหลักที่ใช้คือadd_filter()和apply_filters()。
ติดตั้งฟังก์ชันที่กำหนดเองลงบน Hook มาตรฐาน
WordPress คอร์มีฮุคมาตรฐานหลายร้อยตัว ตัวอย่างเช่น คุณสามารถเพิ่มข้อความลิขสิทธิ์อัตโนมัติที่ส่วนท้ายของเนื้อหาโพสต์ ซึ่งเกี่ยวข้องกับการใช้ทั้งแอ็กชันและฟิลเตอร์:
แนะนำให้อ่าน การพัฒนา WordPress Plugin จากเริ่มต้นจนเชี่ยวชาญ: สอนคุณสร้างฟังก์ชันที่กำหนดเองแบบทีละขั้นตอน。
// 使用过滤器修改文章内容
function myfp_add_copyright_to_content( $content ) {
if ( is_single() ) {
$copyright_text = '<p><em>โปรดระบุแหล่งที่มา</em></p>';
$content .= $copyright_text;
}
return $content;
}
add_filter( 'the_content', 'myfp_add_copyright_to_content' );
// 使用动作在文章保存时执行操作
function myfp_log_post_publish( $post_id ) {
// 记录日志或执行其他后处理
error_log( "文章 ID {$post_id} 已发布。" );
}
add_action( 'publish_post', 'myfp_log_post_publish' ); สร้างและจัดเตรียมฮุคที่กำหนดเองสำหรับส่วนขยาย
ปลั๊กอินที่ออกแบบมาอย่างดีควรอนุญาตให้นักพัฒนาคนอื่นขยายความสามารถได้เช่นกัน คุณสามารถทำได้โดยการสร้างฮุคที่กำหนดเองของคุณเอง นี่ไม่เพียงแสดงถึงความเปิดกว้างของสถาปัตยกรรมปลั๊กอิน แต่ยังสอดคล้องกับปรัชญาพื้นฐานของ WordPress อีกด้วย
// 定义一个自定义动作钩子
function myfp_process_data() {
$data = '一些初始数据';
// 其他开发者可以通过 ‘myfp_before_action’ 在此处插入代码
do_action( 'myfp_before_action', $data );
// 插件的主要处理逻辑...
// 其他开发者可以通过 ‘myfp_after_action’ 在此处插入代码
do_action( 'myfp_after_action', $data );
}
// 定义一个自定义过滤器钩子
function myfp_get_output() {
$output = '默认输出';
// 允许其他开发者过滤最终的输出
return apply_filters( 'myfp_filter_output', $output );
} สร้างอินเทอร์เฟซการจัดการปลั๊กอินและตัวเลือกการตั้งค่า
ปลั๊กอินส่วนใหญ่จำเป็นต้องมีอินเทอร์เฟซหลังบ้านเพื่อให้ผู้ใช้สามารถกำหนดค่าได้ WordPress มี API หลายตัวที่ช่วยให้คุณสร้างหน้าตั้งค่ามาตรฐานได้อย่างรวดเร็วและปลอดภัย
จัดการตัวเลือกอย่างปลอดภัยด้วย Settings API
WordPress Settings API เป็นเฟรมเวิร์กที่ปลอดภัยสำหรับจัดการฟอร์ม ตรวจสอบความถูกต้อง จัดเก็บ และแสดงข้อมูลตัวเลือกอีกครั้ง มันจัดการฟิลด์ความปลอดภัย nonce และการตรวจสอบสิทธิ์โดยอัตโนมัติ ขั้นตอนพื้นฐานในการสร้างหน้าตั้งค่าประกอบด้วย: 1) ลงทะเบียนการตั้งค่า 2) เพิ่มส่วนการตั้งค่า 3) เพิ่มฟิลด์ รหัสต่อไปนี้สาธิตวิธีการลงทะเบียนการตั้งค่าอย่างง่าย:
function myfp_register_settings() {
register_setting(
'myfp_settings_group', // 选项组名
'myfp_option_name', // 选项名(存储在wp_options表中)
array( 'sanitize_callback' => 'myfp_sanitize_callback' ) // 消毒回调函数
);
add_settings_section(
'myfp_settings_section', // 区块ID
'基本设置', // 区块标题
'myfp_section_callback', // 区块回调函数(可输出描述)
'myfp-settings-page' // 设置页面Slug
);
add_settings_field(
'myfp_text_field', // 字段ID
'示例文本输入', // 字段标签
'myfp_text_field_callback', // 字段回调函数(输出HTML表单域)
'myfp-settings-page', // 页面Slug
'myfp_settings_section' // 所属区块ID
);
}
add_action( 'admin_init', 'myfp_register_settings' ); สร้างเมนูและหน้าเมนูย่อยในตำแหน่งต่างๆ
คุณต้องเพิ่มลิงก์หน้าตั้งค่าไปยังเมนูการจัดการ WordPress โดยใช้add_menu_page()สามารถสร้างเมนูระดับบนสุดได้ ใช้add_submenu_page()สามารถสร้างเมนูย่อยได้
function myfp_add_admin_menu() {
// 添加顶级菜单
add_menu_page(
'我的插件设置', // 页面标题
'我的插件', // 菜单标题
'manage_options', // 权限能力
'myfp-settings-page', // 菜单Slug
'myfp_render_settings_page', // 渲染页面的回调函数
'dashicons-admin-generic', // 图标(可选)
80 // 菜单位置
);
// 添加子菜单(指向同一个页面,但菜单标题不同)
add_submenu_page(
'myfp-settings-page', // 父菜单Slug
'关于此插件', // 页面标题
'关于', // 菜单标题
'manage_options', // 权限能力
'myfp-about-page', // 菜单Slug
'myfp_render_about_page' // 渲染回调
);
}
add_action( 'admin_menu', 'myfp_add_admin_menu' ); ฟังก์ชันเรียกกลับสำหรับการแสดงผลหน้าตั้งค่าแบบกำหนดเอง
myfp_render_settings_pageฟังก์ชัน callback มีหน้าที่ในการแสดงโครงสร้าง HTML ของหน้าการตั้งค่า ในฟังก์ชันนี้ คุณจำเป็นต้องเรียกใช้settings_fields()和do_settings_sections()เพื่อแสดงฟิลด์ที่ลงทะเบียนผ่าน Settings API
function myfp_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( 'myfp_settings_group' );
do_settings_sections( 'myfp-settings-page' );
submit_button( '保存设置' );
?>
<input type="hidden" name="trp-form-language" value="th"/></form>
</div>
<?php
} สรุป
การพัฒนา WordPress Plugin เป็นกระบวนการเปลี่ยนความคิดสร้างสรรค์ให้เป็นฟังก์ชันการทำงาน ซึ่งความสำเร็จนั้นขึ้นอยู่กับความเข้าใจที่ชัดเจนในโครงสร้างพื้นฐาน การใช้กลไก Hook อย่างเชี่ยวชาญ และการให้ความสำคัญอย่างต่อเนื่องในด้านความปลอดภัยและประสบการณ์ผู้ใช้ เริ่มจากการตั้งค่าสภาพแวดล้อม การเขียนไฟล์หลัก ไปจนถึงการผสานรวมกับ WordPress อย่างลึกซึ้งผ่าน Action และ Filter จากนั้นสร้างอินเทอร์เฟซการจัดการระดับมืออาชีพผ่าน Settings API ทุกขั้นตอนล้วนปฏิบัติตามมาตรฐานและแนวทางปฏิบัติที่ดีที่สุดที่กำหนดไว้ ประเด็นสำคัญคือการรักษาโค้ดให้เป็นโมดูล อ่านง่าย และขยายได้ ใช้คำนำหน้าที่ไม่ซ้ำกันเพื่อหลีกเลี่ยงความขัดแย้ง และให้ความสำคัญกับความปลอดภัยเป็นลำดับแรกเสมอ ผ่านการเรียนรู้และการปฏิบัติตามคู่มือนี้ คุณมีความสามารถในการสร้าง WordPress Plugin ที่มีฟังก์ชันสมบูรณ์และเป็นไปตามมาตรฐานตั้งแต่เริ่มต้นแล้ว
คำถามที่พบบ่อย (FAQ)
### การพัฒนา WordPress Plugin ต้องการพื้นฐานการเขียนโปรแกรมอะไรบ้าง?
การพัฒนา WordPress Plugin ส่วนใหญ่จำเป็นต้องมีความรู้พื้นฐานเกี่ยวกับภาษาโปรแกรม PHP รวมถึงไวยากรณ์ ฟังก์ชัน อาร์เรย์ และแนวคิดการเขียนโปรแกรมเชิงวัตถุ ในเวลาเดียวกัน การมีความเข้าใจพื้นฐานเกี่ยวกับเทคโนโลยี front-end เช่น HTML, CSS และ JavaScript จะเป็นประโยชน์อย่างมากสำหรับการพัฒนา plugin ที่มีส่วนต่อประสานผู้ใช้ การคุ้นเคยกับการทำงานพื้นฐานของฐานข้อมูล MySQL ก็มีประโยชน์เช่นกัน เนื่องจาก WordPress พึ่งพาฐานข้อมูลอย่างมาก
วิธีการดีบั๊ก WordPress ปลั๊กอินที่กำลังพัฒนาอยู่?
การดีบั๊ก plugin มีหลายวิธี ขั้นแรก ในwp-config.phpเปิดในไฟล์WP_DEBUG和WP_DEBUG_LOGซึ่งจะบันทึกข้อผิดพลาดและคำเตือน PHP ลงใน/wp-content/debug.logไฟล์ โดยไม่แสดงให้ผู้ใช้ front-end เห็น ประการที่สอง ใช้เครื่องมือนักพัฒนาของเบราว์เซอร์ (เช่น Chrome DevTools) เพื่อดีบั๊ก JavaScript และคำขอเครือข่าย สำหรับตรรกะที่ซับซ้อน สามารถใช้var_dump()或error_log()ฟังก์ชันส่งออกค่าตัวแปรไปยังบันทึกหรือหน้าเว็บ นอกจากนี้ การติดตั้งตัวดีบัก PHP เชิงมืออาชีพ เช่น Xdebug และการผสานรวมกับโปรแกรมแก้ไขโค้ดของคุณ สามารถทำการดีบักแบบเบรกพอยต์ได้ ซึ่งเป็นวิธีดีบักที่มีประสิทธิภาพสูงสุด
ปลั๊กอินของฉันจะใช้งานหลายภาษา (สากล) ได้อย่างไร
การทำให้เป็นสากล (i18n) ใช้หลักการของฟังก์ชันแปลที่ WordPress จัดให้ เช่น__()、_e()、_x()และอื่นๆ ในโค้ดปลั๊กอิน ให้ห่อหุ้มสตริงทั้งหมดที่ต้องการแปลด้วยฟังก์ชันเหล่านี้ และระบุโดเมนข้อความ (Text Domain) ซึ่งก็คือค่าText Domainที่กำหนดไว้ในความคิดเห็นส่วนหัวของปลั๊กอิน จากนั้น ใช้เครื่องมือเช่น Poedit เพื่อสแกนซอร์สโค้ดของปลั๊กอินและสร้าง.potไฟล์เทมเพลตที่นักแปลใช้เพื่อสร้างไฟล์ภาษาต่าง ๆ.poและไฟล์ที่คอมไพล์แล้ว.moไฟล์เหล่านี้จะถูกวางไว้ในไดเรกทอรีปลั๊กอิน/languages/และโหลดโดยใช้ฟังก์ชันload_plugin_textdomain()ในระหว่างการเริ่มต้นปลั๊กอิน
จะเผยแพร่ปลั๊กอินของฉันในไดเรกทอรีปลั๊กอินอย่างเป็นทางการของ WordPress ได้ฟรีอย่างไร?
ในการเผยแพร่ปลั๊กอินในไดเรกทอรีอย่างเป็นทางการ คุณต้องปฏิบัติตามข้อกำหนดหลายประการ ก่อนอื่น ตรวจสอบให้แน่ใจว่าปลั๊กอินของคุณเป็นไปตามสัญญาอนุญาต GPL v2 หรือรุ่นที่ใหม่กว่า ประการที่สอง ตรวจสอบคุณภาพและความปลอดภัยของโค้ด โดยปฏิบัติตามมาตรฐานการเข้ารหัสของ WordPress จากนั้น คุณจะต้องสร้างบัญชี WordPress.org และส่งปลั๊กอินในส่วน “นักพัฒนา” ก่อนส่ง ตรวจสอบให้แน่ใจว่าปลั๊กอินมีไฟล์readme.txt(ใช้รูปแบบ Markdown เฉพาะ) ที่ละเอียดและจัดรูปแบบดี และตั้งค่าการทำให้เป็นสากลอย่างถูกต้อง หลังจากส่งแล้ว ทีมตรวจสอบปลั๊กอินจะดำเนินการตรวจสอบ ซึ่งอาจใช้เวลาตั้งแต่ไม่กี่วันถึงหลายสัปดาห์ เมื่อผ่านการตรวจสอบแล้ว ปลั๊กอินของคุณจะสามารถค้นหาและติดตั้งได้ในไดเรกทอรีอย่างเป็นทางการ
ขั้นต่อไป ฉันควรทำอย่างไรต่อไป
อ่านเพิ่มเติมและรับความรู้ที่มีประโยชน์
下面这些内容与本文主题相关,适合继续深入阅读。优先从与你当前问题最接近的文章开始看,再逐步扩展到周边主题,效果通常会更好。
- คำแนะนำโดยละเอียดเกี่ยวกับกระบวนการสร้างเว็บไซต์: คู่มือมืออาชีพตั้งแต่การวิเคราะห์ความต้องการไปจนถึงการปรับใช้
- คู่มือเริ่มต้นการสร้างเว็บไซต์: เรียนรู้กระบวนการพัฒนาเว็บไซต์สมัยใหม่ตั้งแต่เริ่มต้นจนสำเร็จ
- วิธีการเลือกและปรับแต่งธีม WordPress ที่สมบูรณ์แบบสำหรับคุณ
- คู่มือการพัฒนา WordPress Plugin: สร้างปลั๊กอินที่กำหนดเองตัวแรกของคุณตั้งแต่เริ่มต้น
- เป็นนักพัฒนา WordPress Plugin: คู่มือฉบับสมบูรณ์จากศูนย์ถึงหนึ่ง