Giáo trình ôn tập WordPress bài bản + Vibe Coding Đang tiến hành

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_themeinit → … → wp_headtemplate_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, init trước khi query chạy).
  • Template Hierarchy: WP tìm file theo độ ưu tiên, ví dụ trang single: single-{post_type}-{slug}.phpsingle-{post_type}.phpsingle.phpsingular.phpindex.php.
  • The Loop: WP_Queryhave_posts()the_post()wp_reset_postdata() (quan trọng khi query phụ trong sidebar/widget).

Thực hành (tự gõ, không AI)

  1. Tạo 1 theme trắng: style.css (header chuẩn) + index.php + functions.php.
  2. Viết functions.php với add_action('after_setup_theme', ...) để add_theme_support('post-thumbnails'), register_nav_menus().
  3. Viết Loop tay từ đầu, không copy paste — kể cả wp_reset_postdata().
  4. Enqueue đúng cách: wp_enqueue_style/wp_enqueue_script trong hook wp_enqueue_scripts (không phải wp_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_post hook (phải nhớ check nonce + check current_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

  1. Viết 1 plugin từ đầu: đăng ký CPT Book + taxonomy Genre.
  2. Thêm meta box "Tác giả" thủ công — code đầy đủ nonce, sanitize, save.
  3. 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ằng post_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->prepare khi 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 (vd posts_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, hook wp_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_true bừ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úc edit.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 được npm run build và thấy block hiện trong editor.
  • Chạy thử wp search-replace trê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

  1. 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.

  1. 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…).

  1. Debug:

  • Bật WP_DEBUG, WP_DEBUG_LOG, đọc debug.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:

  1. Hook là gì, phân biệt action/filter, cho ví dụ.
  2. Sanitize vs Escape khác nhau thế nào?
  3. Tạo CPT cần những bước gì?
  4. $wpdb->prepare dùng để làm gì?
  5. Nonce là gì, giải quyết vấn đề gì?

Senior/kinh nghiệm sâu:

  1. Cách tối ưu 1 site WP đang chậm — quy trình debug performance từ đâu đến đâu?
  2. 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?
  3. Bảo mật 1 REST endpoint custom — permission_callback nên viết thế nào?
  4. Multisite vs nhiều site riêng — khi nào chọn cái nào?
  5. 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->prepare chố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_ vs wp_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!

💬 Thảo Luận (0)

Viết bình luận

Hãy là người đầu tiên bình luận!