Học Wordpress

Những dòng lệnh SQL hữu ích dành cho WordPress

56

Trong một số trường hợp chúng ta cần cập nhật lại nội dung trong database như các thiết lập của website thì có thể tìm các plugin để hỗ trợ làm nhanh hơn, nhưng không phải lúc nào chúng ta cũng cài plugin vào vì đôi lúc chỉ cần sửa một vài lệnh SQL là có thể làm được. Trong bài này, mình giới thiệu cho bạn một số lệnh SQL mà có thể bạn sẽ cần thiết để sử dụng trong khi dùng WordPress.

Xem thêm:

  • Làm sạch database toàn tập.
  • Backup dữ liệu WordPress thủ công.

Làm sao để chạy lệnh SQL?

Đối với phpMyAdmin

Bạn truy cập vào trang phpMyAdmin trên host, chọn database bạn cần chỉnh sửa và ấn nút SQL và nhập lệnh vào, nhập xong ấn nút Go ở dưới.

phpmyadmin-sql-command

Sử dụng lệnh SQL trong phpMyAdmin

Đối với Terminal

Nếu bạn dùng máy chủ không có phpMyAdmin thì có thể đăng nhập vào MySQL Server với lệnh mysql -uroot -p.

Sau đó chọn database bằng lệnh:

[sql]

USE tên_database;[/sql]

Và gõ lệnh SQL rồi Enter.

Sử dụng plugin

Bạn cũng có thể sử dụng plugin SQL Executioner để sử dụng lệnh SQL ngay trong bảng quản trị WordPress.

Lưu ý về Table Prefix (tiền tố database)

Trong bài này, các đoạn lệnh mình sẽ lấy ví dụ với tiền tố wp_ trong các table dữ liệu, vậy nên nếu bạn sử dụng một tiền tố khác thì hãy đổi lại để tránh lỗi không tìm thấy table database cần xử lý.

Các lệnh SQL cho WordPress

Đóng/Mở bình luận cho toàn bộ post

[sql]UPDATE wp_posts SET comment_status=”open” AND ping_status=”open”[/sql]

Ở trên là lệnh mở comment, bạn có thể thay open thành closed để đóng comment.

Xoá bình luận spam

[sql]DELETE FROM wp_comments WHERE comment_approved = ‘spam’;[/sql]

Trong đó, giá trị spam bạn có thể sửa thành các giá trị sau để xoá các loại bình luận khác:

  • 0 – Bình luận chưa duyệt.
  • 1 – Bình luận đã duyệt.

Xoá tag không sử dụng

Có thể trên blog bạn có rất nhiều các tag không được phân loại cho post nào, lệnh này sẽ giúp bạn xoá toàn bộ các tag không sử dụng đến.

[sql]

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

[/sql]

Xoá Revision của Post

[sql]

DELETE a,b,c FROM wp_posts a WHERE a.post_type = ‘revision’ LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id);

[/sql]

Xoá các post cũ sau số ngày nhất định

Dưới đây là lệnh xoá toàn bộ post nếu cũ hơn 365 ngày.

[sql]

DELETE FROM `wp_posts`
WHERE `post_type` = ‘post’
AND DATEDIFF(NOW(), `post_date`) > 365

[/sql]

Tắt toàn bộ plugin

[sql]UPDATE wp_options SET option_value = ” WHERE option_name = ‘active_plugins’;[/sql]

Xoá toàn bộ pingback

[sql]DELETE FROM wp_comments WHERE comment_type = ‘pingback’;[/sql]

Thêm custom field vào toàn bộ Post

[sql]

INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT ID AS post_id, ‘ten-field’
AS meta_key ‘giá-trị AS meta_value
FROM wp_posts WHERE ID NOT IN
(SELECT post_id FROM wp_postmeta WHERE meta_key = ‘ten-field’)
“ AND post_type = ‘post’;

[/sql]

Chuyển post type

[sql]UPDATE wp_posts SET post_type = ‘page’ WHERE post_type = ‘post'[/sql]

Trong đó, post là tên post type cũ và page là tên post type mới cần chuyển sang.

Cập nhật mật khẩu mới

[sql]UPDATE `wordpress`.`wp_users` SET `user_pass` = MD5(‘MẬT KHẨU MỚI’) WHERE `wp_users`.`user_login` =`admin` LIMIT 1;[/sql]

Trong đó, admin là tên username cần đổi mật khẩu.

Tìm và thay thế nội dung Post

[sql]

UPDATE wp_posts SET `post_content`
= REPLACE (`post_content`,
‘NỘI DUNG CŨ’,
‘NỘI DUNG MỚI’);

[/sql]

Xoá Cache của RSS Feed

[sql]DELETE FROM `wp_options` WHERE `option_name` LIKE (‘_transient%_feed_%’)[/sql]

Và ở đây tạm thời mình giới thiệu 10 đoạn lệnh thôi, bạn có ý tưởng gì nữa để làm việc bằng lệnh SQL trong WordPress thì nói cho mình biết nhé để mình viết lệnh thêm dành cho bạn.

Học Wordpress

Tối ưu bảng wp_options của WordPress

55

Việc tối ưu lại cơ sở dữ liệu luôn là một trong các việc quan trọng nhất cần phải làm khi một website đã có quá nhiều dữ liệu và có quá nhiều lượt truy cập. Bởi vì bạn biết rằng website càng có nhiều lượt truy cập thì website sẽ càng gửi nhiều truy vấn (query) về database để lấy dữ liệu ra (đa phần là truy vấn SELECT). Mà đã nhiều truy vấn rồi mà dữ liệu lại lớn, chưa được sắp xếp gọn gàng thì nó lại càng mất thêm thời gian để xử lý các truy vấn đó.

Ngoài việc dọn dẹp database mà mình đã trình bày ở lần trước, chúng ta còn một cách khác nhưng cũng rất quan trọng đó là tối ưu lại bảng wp_options của database. Bảng này sẽ chứa toàn bộ các thiết lập bên trong website, bao gồm các thiết lập theme và plugin. Điều đó có nghĩa là bạn đã từng cài nhiều plugin và theme vào website thì bảng này sẽ rất nặng mặc dù bạn đã tắt các plugin hoặc theme đó đi vì đa phần các plugin không hỗ trợ “làm sạch” chiến trường khi ta tắt đi để có thể sử dụng lại sau này.

Debug truy vấn

Trước tiên, chúng ta cần nên xem trực tiếp các query có trên website và thời gian thực thi của nó để coi có query của plugin nào chiếm nhiều thời gian không. Có một cách làm việc này đó là sử dụng plugin Query Monitor.

Nhưng trước khi cài đặt nó, bạn bật debug trong wp-config.php lên.

define(‘WP_DEBUG’, true);

Sau đó ở mỗi trang, bạn sẽ xem được query của nó bằng cách ấn vào nút xem debug ở Admin Bar.

query-monitor-adminbarBạn ấn vào và chọn Queries để xem các truy vấn nhé. Bây giờ bạn có thể biết trên trang đó có bao nhiêu truy vấn, mỗi truy vấn tốn bao nhiêu thời gian.

query-monitor-querytime

Nếu bạn thấy mình có quá nhiều truy vấn gửi vào table wp_posts thì hãy:

  • Hạn chế sử dụng truy vấn để lấy bài viết ra, bao gồm các widget. Các theme tin tức thường có rất nhiều query kiểu thế này.
  • Hạn chế số lượng bài viết hiển thị trên mỗi trang.
  • Ngoài ra bạn cũng có thể sẽ thấy truy vấn ở một vài plugin. Nếu bạn thấy plugin đó không cần thiết thì tắt đi.

Kế tiếp là bạn ấn vào menu Debug, chọn Hooks và bạn sẽ thấy có bao nhiêu thành phần được load ra như có bao nhiêu theme được kích hoạt, bao nhiêu hook ở widget, theme sử dụng hook nào để thực thi,…và nếu hạn chế được càng nhiều thì càng tốt.

query-monitor-hooks

Ngoài ra bạn có thể xem thêm phần PHP Errors để xem có lỗi nào trong PHP không, nó sẽ cho bạn biết lỗi đó là gì, nằm ở file nào đoạn số bao nhiêu trong code để bạn biết mà sửa.

Tối ưu bảng wp_options

Cột autoload trong bảng wp_options nghĩa là để nó xác định xem tuỳ chọn đó có được tải mặc định tự động ra bên ngoài hay không. Điều đó có nghĩa là mặc dù các plugin của bạn không dùng nữa nhưng các thiết lập trong database vẫn còn thì nó vẫn là autoload, đây là lý do sốt một khiến tốc độ truy cập website bị chậm đi.

Trong bài này có sử dụng truy vấn SQL. Để chạy truy vấn SQL, bạn vào phpMyAdmin -> chọn database cần làm việc và chọn tab SQL. Hoặc nếu bạn không có phpMyAdmin thì đăng nhập vào MySQL Server rồi gõ USE tên_database để chọn database.

Trước hết, chúng ta kiểm tra xem bảng wp_options có bao nhiêu hàng.

[sql]explain SELECT option_name, option_value FROM wp_options WHERE autoload = ‘yes'[/sql]

+------+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table         | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+---------------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | wp_options | ALL  | NULL          | NULL | NULL    | NULL |  808 | Using where |
+------+-------------+---------------+------+---------------+------+---------+------+------+-------------+

Như các bạn thấy là chúng ta có thể thấy được mình đang có 808 hàng trong bảng wp_options. Bây giờ hãy thử thêm INDEX cho cột autoload để xem sự khác biệt.

[sql]ALTER TABLE `wp_options` ADD INDEX (`autoload`);[/sql]

Bây giờ bạn chạy lại truy vấn ở trên xem nó đã có giảm số hàng xuống chưa, đồng thời cột Extra của mình nó sẽ để là Using index condition.

+------+-------------+---------------+------+---------------+----------+---------+-------+------+-----------------------+
| id   | select_type | table         | type | possible_keys | key      | key_len | ref   | rows | Extra                 |
+------+-------------+---------------+------+---------------+----------+---------+-------+------+-----------------------+
|    1 | SIMPLE      | wp_options | ref  | autoload      | autoload | 82      | const |  762 | Using index condition |
+------+-------------+---------------+------+---------------+----------+---------+-------+------+-----------------------+

Ngoài ra thì tốc độ truy vấn của mình cũng giảm đáng kể.

Trước đó:

query-monitor-adminbarSau khi thêm INDEX

query-monitor-after-indexThế thì tại sao sử dụng INDEX trong MySQL lại giúp bạn giảm thời gian gửi truy vấn?

Bạn hãy tưởng tượng rằng, INDEX giống như bạn đánh số cho từng trang sách vậy. Khi bạn cần tìm một cái gì đó thì bạn chỉ cần giở ra đúng số trang mà bạn cần tìm thay vì ngồi mò từng trang, phải không? INDEX trong MySQL cũng thế, nó sẽ giúp cho các truy vấn WHERE tìm kiếm dữ liệu nhanh hơn để lấy ra bên ngoài.

Nếu bạn muốn thì bạn có thể thêm INDEX cho cột post_id và meta_key trong bảng wp_postmeta.

[sql]
ALTER TABLE `wp_postmeta` ADD INDEX (`meta_key`);
ALTER TABLE `wp_postmeta` ADD INDEX (`meta_key`);
[/sql]

Xoá bớt các options không sử dụng

Như mình nói ở trên, mặc định table có cột autoload mà nếu hàng nào có giá trị là yes thì nó sẽ mặc định được gửi ra toàn bộ trong khi WordPress tải website của bạn. Nếu bạn dùng website đã lâu, đã từng sử dụng qua nhiều plugin nay không dùng nữa thì nên xoá đi các tuỳ chọn của nó trong bảng wp_options. Bạn có thể browse bảng này và xoá đi các tuỳ chọn giống như mình làm ở dưới, cẩn thận với các tuỳ chọn mặc định của WordPress (ở các trang đầu tiên).

Xoá các options không sử dụng nữa.

Xoá các options không sử dụng nữa.

Lời kết

Tạm thời trong bài này mình chỉ nói qua về việc kiểm soát query và sử dụng INDEX cho database của WordPress. Nhưng mình tin rằng với những tips nhỏ ở trên nhưng nó sẽ giúp website đạt hiệu suất cao hơn rất nhiều, đặc biệt là các website lớn. Hãy nhớ rằng, khi dùng plugin bạn nên chú ý các plugin tốn tài nguyên để giảm tải cho cả PHP lẫn MySQL nhé.

Và trong một dịp khác, mình sẽ chia sẻ một kỹ thuật scaling database mà các website lớn vẫn thường dùng, đó là load balance với database trên một server khác.