Cách bỏ chọn hàng loạt Category cho bài viết mà không sử dụng plugin

Category (danh mục) là một taxonomy mặc định trong WordPress dùng để phân loại bài viết vào trong những nhóm khác nhau. Nó giúp cho người truy cập website di chuyển giữa các trang nhanh hơn và xác định được các chủ đề chính của nội dung trên website.

Các webmaster có thể tùy chỉnh các category bằng cách sử dụng plugin hoặc thao tác trực tiếp trên admin panel. Tuy nhiên, việc lạm dụng plugin có thể gây ra các vấn đề về bảo mật và làm giảm hiệu suất trang web. Trong bài viết này, mình sẽ hướng dẫn các bạn cách chuyển toàn bộ bài đăng từ một category sang một category khác bằng cách thao tác trực tiếp với cơ sở dữ liệu (sử dụng các lệnh SQL) mà không cần sử dụng plugin.

Cách WordPress xử lý yêu cầu từ các máy trạm

Trước khi thao tác với cơ sở dữ liệu, bạn cần hiểu cách WordPress xử lý các yêu cầu từ các máy trạm (máy tính của người truy cập trang web) như thế nào.

Mình sẽ lấy ví dụ từ web server phổ biến nhất là LAMP stack (Linux – Apache – MySQL/MariaDB – PHP). Với các nền tảng web server khác, quá trình xử lý này cũng tương tự như vậy.

Cách WordPress xử lý yêu cầu từ các máy trạm
Giao thức máy chủ – máy trạm của LAMP stack

Quy trình xử lý các yêu cầu từ máy trạm của WordPress như sau:

  1. Các máy trạm gửi yêu cầu HTTP đến web server để lấy dữ liệu.
  2. Web server nhận được yêu cầu HTTP (sau khi qua được tường lửa):
    • Phân tích các yêu cầu HTTP và xác định chính xác trang HTML mà máy trạm cần;
    • Phân tích cú pháp của các yêu cầu liên quan tới các đoạn mã PHP.
  3. Các đoạn mã PHP sẽ:
    • Truy vấn cơ sở dữ liệu và lấy ra các thông tin cần thiết;
    • Kết hợp với mã nguồn của theme để kết xuất (render) ra các trang web động;
    • Báo lại cho web server.
  4. Web Server sẽ:
    • Tạo thông điệp phản hồi HTTP;
    • Gửi thông điệp phản hồi HTTP tới các máy trạm.
  5. Các máy trạm nhận được các thông điệp phản hồi HTTP từ web server, sau đó hiển thị dữ liệu lên trình duyệt web.

Di chuyển tất cả bài đăng từ danh mục này sang danh mục khác – Sử dụng các lệnh SQL

Để thao tác với cơ sở dữ liệu một cách trực tiếp, bạn cần chọn một DBMS (Database Management System – Hệ quản trị cơ sở dữ liệu) để sử dụng. Trong môi trường lý tưởng, người ta sẽ sử dụng LAMP stack làm nền tảng web nên các webmaster có thể làm việc với cơ sở dữ liệu trong WordPress bằng cách sử dụng phpMyAdmin, plugin … Trong ví dụ này, mình sẽ sử dụng DBMS là MySQL WorkBench để minh họa cho dễ.

Lưu ý: Trước khi tiến hành thao tác với cơ sở dữ liệu, bạn nên tạo một bản sao lưu cho trang web. Bạn nên sao lưu đầy đủ mã nguồn (theme, file PHP …) và toàn bộ cấu trúc cơ sở dữ liệu hoặc tốt hơn hết là sao lưu toàn bộ máy chủ.

Dưới đây là các đoạn mã SQL để di chuyển toàn bộ bài đăng từ danh mục “Uncategorized” đến danh mục “Inspirations”.

SET @listID = (
     	SELECT GROUP_CONCAT(ID) FROM wp_posts
             	WHERE post_type="post"
             	AND post_status = "publish"
             	AND ID IN (
                      	SELECT object_id FROM wp_term_relationships
                               	WHERE term_taxonomy_id IN (
                                        	SELECT term_taxonomy_id FROM wp_term_taxonomy
                                                	WHERE taxonomy = "category"
                                                	AND term_id IN (
                                                         	SELECT t.term_id FROM wp_terms t
                                                                  	WHERE t.name="Uncategorized"
   	 )
	)
)
);
 
 
SET @newCategoryID = (
     	SELECT t.term_id FROM wp_terms t WHERE t.name='Inspirations'
);
 
SELECT @newCategoryID;
 
set @sqlCmd = CONCAT(
     	'UPDATE wp_term_relationships tr ',
	'SET tr.term_taxonomy_id = ', @newCategoryID , ' ',
	'WHERE tr.object_id IN (', @listID , ');'
);
 
SELECT @sqlCmd;
 
PREPARE stmt FROM @sqlCmd;
SET SQL_SAFE_UPDATES = 0;
EXECUTE stmt;
SET SQL_SAFE_UPDATES = 1;
DEALLOCATE PREPARE stmt;

Sau đây mình sẽ giải thích từng thành phần của đoạn mã trên.

Lấy danh sách ID của tất cả bài đăng thuộc về một danh mục cụ thể

Trong ví dụ này, mình sẽ minh họa cách di chuyển toàn bộ bài đăng từ danh mục “Categorized” đến một danh mục mới là “Inspirations”.

Trong ảnh bên dưới, có 3 bài đăng đang được xếp vào danh mục “Uncategorized”.

Lấy danh sách ID của tất cả bài đăng thuộc về một danh mục cụ thể

Các lệnh SQL dưới đây sẽ truy xuất tất cả các ID bài đăng của danh mục “Uncategorized”

SET @listID = (
     	SELECT GROUP_CONCAT(ID) FROM wp_posts
             	WHERE post_type="post"
             	AND post_status = "publish"
             	AND ID IN (
                      	SELECT object_id FROM wp_term_relationships
                               	WHERE term_taxonomy_id IN (
                                        	SELECT term_taxonomy_id FROM wp_term_taxonomy
                                                	WHERE taxonomy = "category"
                                                	AND term_id IN (
                                                         	SELECT t.term_id FROM wp_terms t
                                                                  	WHERE t.name="Uncategorized"
        )
    )
)
);

Kiểm tra lại giá trị của @listID:

Kiểm tra lại giá trị của @listID của bài đăng WordPress

Lấy ID của danh mục mới

Đoạn code sau dùng để lấy ID của danh mục mới:

SET @newCategoryID = (
    	SELECT t.term_id FROM wp_terms t WHERE t.name='Inspirations'
);

Kiểm tra lại kết quả:

Đoạn code sau dùng để lấy ID của danh mục mới và kiểm tra lại kết quả

Cập nhật danh sách bài đăng với danh sách ID vừa lấy được

Đầu tiên, ta tạo một lệnh SQL và lưu trữ nó trong một biến @sqlCmd

/* Expected command stored in variable @sqlCmd:
UPDATE wp_term_relationships tr
SET tr.term_taxonomy_id = 5
WHERE tr.object_id IN (131,132,133);
 
*/
set @sqlCmd = CONCAT(
    	'UPDATE wp_term_relationships tr ',
	'SET tr.term_taxonomy_id = ', @newCategoryID , ' ',
	'WHERE tr.object_id IN (', @listID , ');'
);

Sau đó, hãy kiểm tra lại kết quả:

Bỏ chọn hàng loạt category cho bài viết không dùng plugin và kiểm tra lại kết quả

Cuối cùng, hãy xuất ra các lệnh SQL được lưu trữ trong biến @sqlCmd:

PREPARE stmt FROM @sqlCmd;
SET SQL_SAFE_UPDATES = 0;
EXECUTE stmt;
SET SQL_SAFE_UPDATES = 1;
DEALLOCATE PREPARE stmt;

Và đây là kết quả:

Hàng loạt category của bài viết đã được bỏ chọn mà không cần dùng plugin WordPress

Lời cuối

Có nhiều cách để thao tác với các bài đăng trên một website WordPress. Bạn có thể chọn sử dụng các plugin để tương tác thông qua một giao diện web, hoặc sử dụng các lệnh SQL để tác động trực tiếp lên cơ sở dữ liệu. Điều quan trọng ở đây là bạn phải hiểu đâu là đối tượng quan trọng cần được sửa đổi.

Việc biết cách thao tác trực tiếp lên cơ sở dữ liệu sẽ giúp bạn chủ động hơn và ít bị phụ thuộc vào các plugin, đồng thời cũng giúp bạn nâng cao trình độ của bản thân. Để biết thêm nhiều thủ thuật khác trong WordPress, hãy đón đọc các bài viết tiếp theo của mình nhé!

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *