Bài viết này hướng dẫn cách xóa hàng loạt bài đăng WordPress bằng Python và WordPress REST API.
Đôi khi, bạn có thể gặp phải trường hợp cần xóa hàng loạt bài đăng khỏi trang web WordPress của mình. Đó có thể là một thói quen dọn dẹp các bài đăng cũ hoặc xóa các tệp phương tiện nổi bật được đính kèm với các bài đăng để tiết kiệm dung lượng đĩa cho các bài đăng và hình ảnh trong tương lai. Bạn có thể chọn các bài đăng bạn muốn xóa trong bảng quản trị theo cách thủ công (có giới hạn hiển thị 999 bài đăng cùng một lúc và không xóa phương tiện nổi bật đính kèm theo mặc định) hoặc sử dụng các plugin để đạt được điều tương tự (ví dụ: Bulk WP , Xóa hàng loạt WP, v.v.). Tuy nhiên, do số lượng lớn các bài viết trên trang WordPress mà tôi đang quản lý, nên nó luôn bị hết thời gian chờ hoặc treo trang quản trị WP. Ngoài ra, một số tính năng như lập lịch thời gian xóa chỉ có sẵn trong phiên bản trả phí của plugin.
Là một kỹ sư, tôi tò mò liệu đây có phải là điều tôi có thể đạt được bằng cách sử dụng các công cụ mà tôi đã quen thuộc hay không, tức là triển khai logic xóa hàng loạt bằng Python + WordPress REST API và phần lập lịch thông qua cron thay vì sử dụng các plugin tạo sẵn. Suy nghĩ trước, với việc triển khai bằng Python, chúng tôi thậm chí có thể trở nên tuyệt vời hơn bằng cách triển khai tập lệnh dưới dạng hàm AWS Lambda hoặc Hàm đám mây GCP và lên lịch thời gian xóa tự động bằng AWS CloudWatch Event hoặc GCP Cloud Scheduler. Nhưng đó là một câu chuyện khác. Trong bài đăng này, tôi sẽ xem xét một số quá trình suy nghĩ của mình trong việc triển khai tập lệnh Python.
Tôi chia nhỏ các bước trong các phần sau:
- [Bảng điều khiển quản trị WP] Thiết lập tài khoản người dùng WP bằng mật khẩu ứng dụng
- [Python] (Tùy chọn) Tạo tiêu đề xác thực cơ bản bằng tài khoản người dùng và mật khẩu ứng dụng
- [Python] Tìm nạp thông tin bài đăng sẽ bị xóa
- [Python] Xóa phương tiện và bài đăng nổi bật
- [Cron] (Tùy chọn) Lập lịch thời gian xóa
1. Thiết lập tài khoản người dùng WP bằng mật khẩu ứng dụng
Để xác thực bản thân với WordPress API, chúng ta có thể sử dụng tài khoản người dùng WP với mật khẩu ứng dụng. Điều này cho phép chúng tôi truy cập các điểm cuối API mà không cần cung cấp mật khẩu người dùng thực tế. Ngoài ra, chúng tôi có thể tạo nhiều mật khẩu ứng dụng cho các trường hợp sử dụng khác nhau và chúng có thể dễ dàng bị thu hồi trong trường hợp không may bị xâm phạm. Kể từ WordPress 5.6, đây là một tính năng được tích hợp sẵn trong WordPress theo mặc định. Nếu bạn đang sử dụng phiên bản WordPress cũ hơn, bạn có thể cài đặt plugin có cùng tên.
Trong phần hồ sơ người dùng, chọn người dùng bạn muốn xác thực cho các điểm cuối API và tạo mật khẩu ứng dụng mới cho người dùng. Hãy ghi lại mật khẩu đã tạo vì bạn sẽ không thể truy cập nó nữa sau khi bạn điều hướng khỏi trang. Ngoài ra, hãy đảm bảo rằng tài khoản người dùng có quyền cần thiết để xóa bài đăng.
Tạo mật khẩu ứng dụng mới cho người dùng
2. Tạo tiêu đề xác thực cơ bản bằng tài khoản người dùng và mật khẩu ứng dụng
Một chức năng đơn giản để tạo tiêu đề xác thực cơ bản có thể được thực hiện như bên dưới. Nếu bạn đang sử dụng requests
thư viện, bạn có thể bỏ qua bước này vì bạn có thể chuyển trực tiếp thông tin đăng nhập vào hàm get / post / delete do yêu cầu cung cấp.
def generate_authorization_headers(app_username, app_password):
concatenate_str = f'{app_username}:{app_password}'
token = base64.b64encode(concatenate_str.encode('utf-8'))
headers = {'Authorization': f"Basic {token.decode('utf-8')}"}
return headers
auth_headers = generate_authorization_headers(username, password)
req = requests.get(url, headers=auth_headers)
hoặc
req = requests.get(url, auth=(username, password))
3. Tìm nạp thông tin bài đăng sẽ bị xóa
Chúng tôi sẽ cần một số thông tin về các bài đăng sẽ bị xóa (tức là ID bài đăng và ID phương tiện nổi bật) trước khi xóa thực sự. Để tìm nạp bài đăng từ WordPress, chúng ta có thể sử dụng GET /posts
điểm cuối. WordPress cung cấp một số bộ lọc tiện dụng được chỉ định trong các tham số truy vấn , nơi chúng tôi có thể truy vấn một nhóm bài đăng cụ thể. Một số ví dụ bao gồm:
status
: để lọc các bài đăng có trạng thái (ví dụ: đã xuất bản, bản nháp)after
: lọc các bài đăng từ ngày nàybefore
: lọc các bài đăng trước ngày nàyper_page
: số kết quả trả về cho mỗi cuộc gọi, mặc định là 10, tối đa 100
Vì số lượng kết quả tối đa cho mỗi lệnh gọi API chỉ là 100, nếu có hơn 100 bài đăng được xử lý, chúng tôi phải thực hiện điều hướng trang theo cách thủ công và mở rộng kết quả tương ứng.
def fetch_posts(wp_url, headers, from_date, to_date):
url = f'{wp_url}/posts?status=publish&per_page=100&after={from_date}&before={to_date}'
all_posts = []
print(f'Getting posts from {from_date} to {to_date}..')
req = requests.get(url, headers=headers)
total_pages = int(req.headers['X-WP-TotalPages'])
print('Total pages: {}'.format(total_pages))
all_posts = req.json()
for page in range(2, total_pages + 1):
print('Getting posts, page: {}'.format(page))
req = requests.get(f'{url}&page={page}', headers=headers)
all_posts.extend(req.json())
print('Total number of posts: {}'.format(len(all_posts)))
return all_posts
4. Xóa phương tiện và bài đăng nổi bật
Để xóa các bài đăng và phương tiện khỏi WordPress, chúng tôi có thể sử dụng điểm cuối DELETE /media
và DELETE /post
và chuyển vào ID phương tiện hoặc ID bài đăng được yêu cầu. Từ bước 3 ở trên, danh sách kết quả chứa thông tin chi tiết về từng bài viết bao gồm ID bài đăng và ID phương tiện nổi bật mà chúng ta có thể sử dụng.
def delete_posts(wp_url, headers, posts):
deleted_posts = 0
error_posts = 0
for index, post in enumerate(posts):
post_id = post['id']
try:
print(f'Deleting post ID: {post_id}')
# delete featured media associated to the post
media_id = post.get('featured_media')
if media_id:
delete_media(wp_url, headers, media_id)
url = f'{wp_url}/posts/{post_id}?force=true'
del_req = requests.delete(url, headers=headers)
if del_req.status_code != 200:
raise Exception(del_req.status_code)
print(f'Deleted post ID: {post_id}')
deleted_posts += 1
except Exception as e:
print(f'Error deleting post {post_id}, error code: {str(e)}')
error_posts += 1
return deleted_posts, error_posts
5. (Tùy chọn) Lập lịch thời gian xóa
Nếu đây là một lần dọn dẹp, về cơ bản chúng ta đã hoàn thành! Nếu chúng tôi muốn lên lịch xóa tự động, nói một lần một tuần hoặc một lần một tháng, chúng tôi có thể di chuyển tập lệnh vào một máy chủ Linux đơn giản và nhỏ (ví dụ: AWS hoặc GCP miễn phí bậc) và thiết lập một cron đơn giản để xóa. Có thể thiết lập đơn giản như sau để chạy tập lệnh lúc 12 giờ sáng Chủ nhật hàng tuần:
# /etc/crontab
0 0 * * 0 user python /path-to-script/remove-old-posts.py
Bạn có thể sử dụng trình soạn thảo này để viết biểu thức cron của riêng bạn. Chúng tôi cũng có thể cập nhật tệp cấu hình để phản ánh thông tin đã lên lịch.
# eg: in each execution, we process/delete the posts between 97 days old to 90 days old
OLD_POSTS_DAY_THRESHOLD = 90
DELETE_DAYS_COUNT = 7
Cuối cùng, đã thực hiện một số dọn dẹp, chuyển tất cả các hàm vào một lớp để chúng ta có thể sử dụng lại một số biến hiệu quả hơn, và đây là kết quả.
Lớp xóa các bài đăng WordPress cũ và phương tiện nổi bật tương ứng
Đang xóa
LƯU Ý: Việc chỉ định mật khẩu ứng dụng trực tiếp trong tệp cấu hình KHÔNG ĐƯỢC KHUYẾN CÁO. Bạn có thể sử dụng biến môi trường để chuyển giá trị vào tập lệnh hoặc nếu bạn đang sử dụng AWS / GCP, bạn nên sử dụng Cửa hàng thông số hoặc Trình quản lý bí mật để thay thế.
Kết luận
Thay vì sử dụng các plugin tạo sẵn, sử dụng WordPress REST API cho phép chúng ta tương tác với WordPress bằng các công cụ mà chúng ta đã quen thuộc. Có thể cải thiện thêm tập lệnh, ví dụ: bằng cách thêm đa xử lý để tăng tốc quá trình xóa / dọn dẹp và cho phép tùy chỉnh các bộ lọc lựa chọn bài đăng.