Đang tiến hành
Giáo trình ôn tập WordPress bài bản + Vibe Coding
| Xếp hạng | #10 (theo lượt xem) |
|---|---|
| Lượt xem | 38 |
| Loại | Giáo Trình |
| Tổng chương | ? |
| Đã dịch | 7 / ? chương |
| Tác giả | Giang Thanh Nhon |
| Quốc gia | Viet Nam |
| Thể loại | Lập trình |
| Tags | lập trình wordpress vibe coding wordpress |
Mục tiêu: sau 7 ngày, am hiểu kỹ thuật WordPress, giải thích được "tại sao" chứ không chỉ "làm được", và tự tin dù thời gian gần đây chủ yếu code bằng AI.
Nguyên tắc chung: Mỗi ngày ~2-3 tiếng, chia 2 khối: (1) đọc/hiểu lại lý thuyết, (2) tự tay gõ code KHÔNG dùng AI để tay và não nhớ lại phản xạ — vì test thường không cho dùng AI.
NGÀY 1 — Kiến trúc lõi & Theme Development
Lý thuyết cần am hiểu rành mạch
- Hooks: phân biệt rõ Action (
do_action→ làm gì đó, không trả giá trị) vs Filter (apply_filters→ nhận vào, biến đổi, trả ra). Đây là câu hỏi mở đầu kinh điển. - Thứ tự load của WP:
wp-load.php→ plugins load →after_setup_theme→init→ … →wp_head→template_redirect→ chọn template →wp_footer. Không cần thuộc lòng 100% nhưng phải hiểu thứ tự tương đối (plugin load trước theme setup,inittrước khi query chạy). - Template Hierarchy: WP tìm file theo độ ưu tiên, ví dụ trang single:
single-{post_type}-{slug}.php→single-{post_type}.php→single.php→singular.php→index.php. - The Loop:
WP_Query→have_posts()→the_post()→wp_reset_postdata()(quan trọng khi query phụ trong sidebar/widget).
Thực hành (tự gõ, không AI)
- Tạo 1 theme trắng:
style.css(header chuẩn) +index.php+functions.php. - Viết
functions.phpvớiadd_action('after_setup_theme', ...)đểadd_theme_support('post-thumbnails'),register_nav_menus(). - Viết Loop tay từ đầu, không copy paste — kể cả
wp_reset_postdata(). - Enqueue đúng cách:
wp_enqueue_style/wp_enqueue_scripttrong hookwp_enqueue_scripts(không phảiwp_head!).
Câu hỏi tự luyện tập cuối ngày: "Nếu enqueue script sai hook thì hậu quả gì?" (Trả lời: có thể load ở admin luôn, hoặc load 2 lần, hoặc lỗi vì DOM chưa sẵn sàng)
NGÀY 2 — Plugin Development + Custom Post Type/Taxonomy
Lý thuyết
- Cấu trúc plugin chuẩn: file header comment bắt buộc (
Plugin Name,Version…),register_activation_hook,register_deactivation_hook,uninstall.php(khác deactivation — uninstall là xoá hẳn dữ liệu). register_post_type(): các tham số quan trọng hay bị hỏi —public,show_in_rest(bắt buộc true nếu muốn dùng Gutenberg/REST),supports,rewrite.register_taxonomy(): hierarchical (giống category) vs non-hierarchical (giống tag).- Custom Fields: làm tay bằng
add_meta_box()+save_posthook (phải nhớ check nonce + checkcurrent_user_can+ tránh save khi autosave), hoặc dùng ACF cho nhanh (nói được ưu nhược điểm 2 cách).
Thực hành
- Viết 1 plugin từ đầu: đăng ký CPT
Book+ taxonomyGenre. - Thêm meta box "Tác giả" thủ công — code đầy đủ nonce, sanitize, save.
- Test activate/deactivate, xem dữ liệu còn không sau deactivate (phải còn — chỉ mất khi uninstall).
Câu hỏi tự vấn: "Tại sao phải check nonce khi save meta box? Không check thì bị tấn công kiểu gì?" (CSRF — kẻ xấu dụ admin bấm link giả để submit form ẩn)
NGÀY 3 — Database & Security (2 mảng hay bị hỏi sâu nhất)
Database
- Bảng lõi:
wp_posts(post/page/CPT đều nằm đây, phân biệt bằngpost_type),wp_postmeta(key-value, EAV pattern — giải thích được ưu/nhược: linh hoạt nhưng query chậm nếu lạm dụng),wp_options(autoload — hiểu vì sao autoload=yes quá nhiều option làm chậm site),wp_users/wp_usermeta. $wpdb: luôn dùng$wpdb->prepare()khi có biến người dùng nhập vào, KHÔNG bao giờ nối chuỗi SQL trực tiếp.
Security — chuẩn bị kỹ, hay bị hỏi tình huống
- Sanitize (đầu vào) vs Escape (đầu ra) — đây là câu phân biệt kinh điển:
- Input:
sanitize_text_field(),sanitize_email(),absint() - Output:
esc_html(),esc_attr(),esc_url(),esc_js() - Quy tắc nhớ nhanh: "Sanitize khi lưu, Escape khi in ra màn hình"
- Nonce: chống CSRF, không phải authentication.
- Capabilities:
current_user_can('manage_options')thay vì check role cứng (role có thể đổi tên, capability thì ổn định). - SQL Injection demo: viết 1 đoạn code SAI (nối chuỗi) rồi sửa lại bằng
$wpdb->prepare.
Thực hành
- Viết 1 form ở frontend (vd: form liên hệ) xử lý đầy đủ: nonce, sanitize input, escape khi hiển thị lại,
$wpdb->preparekhi lưu.
NGÀY 4 — Performance, AJAX & REST API
Performance
- Transients API:
set_transient()/get_transient()— cache kết quả query nặng, có thời hạn. - Tránh N+1 query: dùng đúng args của
WP_Query(vdposts_per_page,meta_query) thay vì query trong loop. - Object cache là gì (khác transient ở chỗ: object cache không đảm bảo tồn tại lâu dài, dùng cho cache tạm trong 1 request/server-level như Redis).
AJAX & REST
- AJAX kiểu cũ:
admin-ajax.php, hookwp_ajax_{action}(user đã login) vàwp_ajax_nopriv_{action}(khách chưa login) — phải đăng ký CẢ HAI nếu muốn cả 2 nhóm dùng được. - REST API:
register_rest_route(),permission_callback(rất hay bị quên → lỗi bảo mật nghiêm trọng nếu để trống hoặc__return_truebừa bãi).
Thực hành
- Viết 1 nút "Load more" bằng AJAX (admin-ajax) load thêm bài viết.
- Viết 1 REST endpoint custom trả về danh sách CPT
Bookđã làm ở Ngày 2.
NGÀY 5 — Gutenberg/Block Editor, WP-CLI, Multisite (mảng dễ hụt kiến thức nhất)
Đây là phần dev lâu năm hay yếu vì học WP từ thời PHP thuần
- Block cơ bản:
block.json,@wordpress/scripts(wp-scripts), cấu trúcedit.js/save.js. - Không cần viết thạo React block từ đầu trong 1 ngày — mục tiêu là hiểu khái niệm và nói được luồng hoạt động, vì hỏi sâu quá cũng ít công ty đòi hỏi junior/mid làm ngay.
- theme.json cho block theme/FSE (Full Site Editing) — biết khái niệm, không cần chuyên sâu.
- WP-CLI: các lệnh hay dùng
wp plugin install,wp db export,wp search-replace(dùng khi đổi domain, rất hay được hỏi trong thực tế deploy). - Multisite: khái niệm network,
wp_get_sites(), biết khi nào nên dùng multisite vs nhiều site riêng.
Thực hành
- Cài
@wordpress/scripts, tạo 1 block tĩnh đơn giản (không cần logic phức tạp) — chỉ cần chạy đượcnpm run buildvà thấy block hiện trong editor. - Chạy thử
wp search-replacetrên 1 site test local.
NGÀY 6 — Vibe Coding: Build, Test, Debug hiệu quả (biến điểm yếu thành điểm mạnh)
Đây là phần quan trọng để trả lời câu "sao dạo này chỉ vibe code" — biến nó thành câu chuyện tích cực: bạn dùng AI để tăng tốc nhưng vẫn hiểu và kiểm soát được code.
Kinh nghiệm nên đúc kết để kể được mạch lạc
- Quy trình build với AI:
- Viết spec/yêu cầu rõ ràng trước khi để AI code (input tốt → output tốt).
- Luôn đọc lại code AI sinh ra, không paste thẳng — đặc biệt phần security (sanitize/escape/nonce) vì AI hay bỏ sót.
- Dùng AI để sinh code khung (boilerplate: CPT, REST route, class structure) — tiết kiệm thời gian nhất ở đây.
- Test:
- Local dev: LocalWP/DevKinsta/Docker để test độc lập trước khi lên staging.
- Viết được ít nhất khái niệm về PHPUnit cho WP (
WP_UnitTestCase) dù không cần thành thạo. - Test thủ công có hệ thống: checklist (đúng quyền user, đúng dữ liệu edge case, đúng khi disable JS…).
- Debug:
- Bật
WP_DEBUG,WP_DEBUG_LOG, đọcdebug.log. - Dùng
error_log(),var_dump()/print_r()có kiểm soát (die() để dừng đúng chỗ). - Query Monitor plugin — công cụ debug hiệu năng/hook/query kinh điển, kinh nghiệm thực chiến khi dùng nó liên tục.
- Debug với AI: biết cách đưa đúng ngữ cảnh (error log, đoạn code liên quan) để AI debug hiệu quả — đây là kỹ năng mới, nên kể như một điểm mạnh, không phải điểm yếu.
NGÀY 7 — Bài test (tổng ôn + luyện phản xạ)
Dạng câu hỏi thường gặp — tự trả lời miệng, thành tiếng
Junior/Mid:
- Hook là gì, phân biệt action/filter, cho ví dụ.
- Sanitize vs Escape khác nhau thế nào?
- Tạo CPT cần những bước gì?
$wpdb->preparedùng để làm gì?- Nonce là gì, giải quyết vấn đề gì?
Senior/kinh nghiệm sâu:
- Cách tối ưu 1 site WP đang chậm — quy trình debug performance từ đâu đến đâu?
- Thiết kế 1 hệ thống custom fields cho sản phẩm có 50 thuộc tính khác nhau — dùng postmeta hay custom table? Vì sao?
- Bảo mật 1 REST endpoint custom —
permission_callbacknên viết thế nào? - Multisite vs nhiều site riêng — khi nào chọn cái nào?
- Kể 1 lần bạn debug 1 lỗi khó — quy trình tìm ra nguyên nhân?
Dạng bài test coding (live coding hoặc take-home)
- Thường gặp: viết 1 CPT + meta box + hiển thị ra frontend + 1 shortcode.
- Hoặc: sửa 1 đoạn code có lỗi bảo mật (thiếu sanitize/nonce) — bài test này rất phổ biến để kiểm tra tư duy security.
- Lời khuyên: nếu được phép dùng AI trong bài test, cứ dùng nhưng giải thích được từng dòng — nhiều công ty giờ chấp nhận AI, quan trọng là bạn hiểu output.
Checklist tối giản mang theo (học thuộc)
- [ ] Action vs Filter
- [ ] Sanitize vs Escape
- [ ] Nonce chống CSRF
- [ ]
$wpdb->preparechống SQL Injection - [ ] Template Hierarchy (ít nhất 3 cấp cho single/archive)
- [ ]
register_post_type+show_in_rest - [ ] Transients cho cache
- [ ]
wp_ajax_vswp_ajax_nopriv_ - [ ] Query Monitor để debug
- [ ] Câu chuyện "vibe coding" (đoạn soạn sẵn ở Ngày 6)
Lịch tổng quan
| Ngày | Chủ đề |
|---|---|
| 1 | Kiến trúc lõi + Theme Dev |
| 2 | Plugin Dev + CPT/Taxonomy |
| 3 | Database + Security |
| 4 | Performance + AJAX/REST API |
| 5 | Gutenberg + WP-CLI + Multisite |
| 6 | Vibe Coding: Build/Test/Debug |
| 7 | Bài test — tổng ôn |
Chúc anh/chị ôn tốt!
Hãy là người đầu tiên bình luận!