Nội dung bài viết

Trong thư mục gốc của một site WordPress có hai tập tin quyết định gần như toàn bộ hành vi cấu hình: wp-config.php.htaccess. Bài này tập trung vào wp-config.php, nơi WordPress đọc các hằng số trước khi nạp bất kỳ plugin hay theme nào.

Điểm cần nhớ trước tiên: mọi hằng số dưới đây phải được đặt phía trên dòng sau đây trong wp-config.php, nếu đặt sau thì chúng sẽ không có tác dụng.

/* That's all, stop editing! Happy publishing. */
require_once ABSPATH . 'wp-settings.php';

1. Đổi URL chính của site

Hai hằng số này ghi đè giá trị lưu trong database. Rất hữu ích khi bạn vừa đổi tên miền hoặc bị khóa ngoài trang admin vì URL sai.

define( 'WP_SITEURL', 'https://example.com/' );
define( 'WP_HOME', 'https://example.com/' );

WP_SITEURL là nơi chứa mã nguồn WordPress, WP_HOME là địa chỉ người dùng gõ vào trình duyệt. Đa số trường hợp hai giá trị này giống nhau.

2. Đổi đường dẫn thư mục plugin

define( 'WP_PLUGIN_DIR', '/duong/dan/vat/ly/toi/plugins' );
define( 'WP_PLUGIN_URL', 'https://example.com/duong-dan-url/plugins' );

Ít khi cần đến, nhưng hữu dụng khi bạn muốn tách mã nguồn khỏi thư mục web gốc.

3. Giới hạn số bản nháp lưu tự động

Mặc định WordPress lưu không giới hạn revision cho mỗi bài viết. Với một site chạy vài năm, bảng wp_posts có thể phình lên gấp nhiều lần chỉ vì revision.

define( 'WP_POST_REVISIONS', 5 );    // giữ lại 5 bản gần nhất
define( 'WP_POST_REVISIONS', false ); // tắt hẳn

Tôi thường để 3 đến 5 thay vì tắt hẳn, vì revision đã cứu tôi vài lần khi khách hàng xóa nhầm nội dung.

4. Giãn thời gian tự động lưu

define( 'AUTOSAVE_INTERVAL', 150 ); // tính bằng giây, mặc định là 60

Giá trị lớn hơn giúp giảm số request AJAX gửi về server khi có nhiều người cùng soạn bài.

5. Ghi lại truy vấn SQL để debug

define( 'SAVEQUERIES', true );

Sau đó in ra danh sách truy vấn của trang hiện tại:

global $wpdb;
print_r( $wpdb->queries );

Mỗi phần tử cho biết câu truy vấn, thời gian chạy và hàm nào đã gọi nó. Đây là cách nhanh nhất để tìm ra plugin đang làm chậm trang. Chỉ bật trên môi trường dev, vì nó lưu mọi truy vấn vào bộ nhớ và làm site chậm đi đáng kể.

6. Tăng giới hạn bộ nhớ PHP

Khi gặp lỗi Allowed memory size of xxxxx bytes exhausted:

define( 'WP_MEMORY_LIMIT', '128M' );  // cho phần front-end
define( 'WP_MAX_MEMORY_LIMIT', '256M' ); // cho khu vực admin

Lưu ý: hằng số này chỉ có tác dụng nếu cấu hình PHP trên server cho phép nâng. Nếu memory_limit trong php.ini đang thấp hơn, bạn phải sửa ở tầng server trước.

7. Ngôn ngữ và thư mục file ngôn ngữ

define( 'WPLANG', 'vi' );
define( 'WP_LANG_DIR', '/duong/dan/toi/languages' );

Từ WordPress 4.0 trở đi, ngôn ngữ nên được chọn trong Cài đặt > Tổng quan. WPLANG vẫn dùng được nhưng chủ yếu để ép ngôn ngữ trong môi trường triển khai tự động.

8. Bật cache nâng cao

define( 'WP_CACHE', true );

Hằng số này báo cho WordPress nạp file wp-content/advanced-cache.php. Hầu hết plugin cache sẽ tự thêm dòng này khi bạn kích hoạt chúng, nên bạn hiếm khi phải tự viết.

9. Bắt buộc HTTPS cho đăng nhập và admin

define( 'FORCE_SSL_ADMIN', true );

Buộc toàn bộ khu vực /wp-admin và trang đăng nhập chạy qua HTTPS. Chỉ bật khi bạn đã có chứng chỉ SSL hoạt động, nếu không bạn sẽ tự khóa mình ngoài trang quản trị.

Nếu site chạy sau proxy hoặc CDN như Cloudflare, cần thêm đoạn này trước đó để WordPress nhận đúng giao thức:

if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
    $_SERVER['HTTPS'] = 'on';
}

10. Thời gian dọn thùng rác

define( 'EMPTY_TRASH_DAYS', 7 );  // mặc định là 30
define( 'EMPTY_TRASH_DAYS', 0 );  // tắt thùng rác, xóa là mất luôn

11. Tắt WP-Cron mặc định

define( 'DISABLE_WP_CRON', true );

WordPress mặc định chạy tác vụ định kỳ bằng cách bám vào lượt truy cập của người dùng. Site nhiều traffic sẽ gọi cron liên tục và tốn tài nguyên vô ích, còn site ít traffic thì cron gần như không chạy.

Cách làm đúng là tắt cơ chế này rồi gọi bằng cron thật của hệ thống:

*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Đây là một trong những thay đổi cho hiệu quả rõ rệt nhất trên các site tôi từng tối ưu.

12. Chặn sửa file trong trang quản trị

define( 'DISALLOW_FILE_EDIT', true );

Tắt trình soạn thảo theme và plugin ngay trong admin. Nên bật trên mọi site chạy thật: nếu tài khoản admin bị chiếm, kẻ tấn công không thể chèn mã độc chỉ bằng vài cú click.

Muốn chặt hơn nữa, dùng hằng số sau để cấm luôn cả cài và cập nhật plugin từ giao diện:

define( 'DISALLOW_FILE_MODS', true );

13. Bật chế độ debug đúng cách

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );    // ghi vào wp-content/debug.log
define( 'WP_DEBUG_DISPLAY', false ); // không in lỗi ra màn hình

Bộ ba này là cách debug an toàn: lỗi vẫn được ghi lại đầy đủ nhưng khách truy cập không nhìn thấy đường dẫn file hay thông tin nhạy cảm nào.

Một lưu ý về bảo mật

wp-config.php chứa thông tin kết nối database. Hãy đặt quyền file ở mức 440 hoặc 400 và chặn truy cập trực tiếp qua .htaccess:

<files wp-config.php>
order allow,deny
deny from all
</files>

Nếu server dùng Nginx thay vì Apache thì .htaccess không có tác dụng, bạn cần khai báo tương đương trong khối server của Nginx.