Scheduled Actions (已排程動作) 會用來處理和訂單相關的排程工作,當執行完排程工作之後,也會將完成工作的紀錄儲存在資料庫中,但長時間累積下來,儲存記錄的表單就會變成非常的臃腫,進而直接影響資料庫的效能。

fast-remove-woocommerce-scheduled-actions
Scheduled Actions 的 URL: https://你的商店網址/wp-admin/admin.php?page=wc-status&tab=action-scheduler

WooCommerce 本身有考慮到這個隱性問題,所以也有設置了自動清除紀錄的機制,方式為針對存放超過一個月的紀錄,一條一條的刪除,但這個方式對於訂單量增長快速的商店並不太有效率,因為也有其它外掛同時在新增別的工作排程,然而排程增加的速度還可能會大於刪除的速度,一但又遇到訂單量大的活動時,就會影響資料庫的效能。

由上方範例圖片確認相關資料庫的表單大小:

$ wp db size --tables --human-readable

+----------------------------------+--------+
| Name                             | Size   |
+----------------------------------+--------+
| wp_actionscheduler_actions       | 122 MB |
| wp_actionscheduler_logs          | 66 MB  |
+----------------------------------+--------+

我們分享幾種可以清除 Scheduled Actions 的方式:

1. 使用 phpMyAdmin 進行刪除,這個方式比較簡單,可以在 SQL 的區塊執行下列指令,也可以登入 MySQL 直接執行,若是第一次使用,請分開輸入指令執行以確保安全:

DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'complete';

DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'canceled';

DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'failed';

2. 用短語法的方式定期自動刪除,可設為每日或是每週進行清理,依據商店的狀況選擇使用即可:

// 每日定期自動清除 Scheduled Actions
add_filter( 'action_scheduler_retention_period', 'cw_action_scheduler_purge_daily' );
function cw_action_scheduler_purge() {
 return DAY_IN_SECONDS;
}
// 每週定期自動清除 Scheduled Actions
add_filter( 'action_scheduler_retention_period', 'cw_action_scheduler_purge_weekly' );
function cw_action_scheduler_purge() {
 return WEEK_IN_SECONDS;
}

3. 讓能夠登入伺服器的管理員快速清除的方式,也可以利用 Cronjob 執行,這個方式雖然方便,但不建議把資料庫密碼存在腳本中,請先自行評估風險後再考慮是否採用。

#!/bin/bash
user=
password=
database=
host=

echo 'DELETE FROM `wp_actionscheduler_actions` WHERE `status` = "complete";' | mysql --user="$user" --password="$password" --database="$database" --host="$host"
echo 'DELETE FROM `wp_actionscheduler_actions` WHERE `status` = "canceled";' | mysql --user="$user" --password="$password" --database="$database" --host="$host"
echo 'DELETE FROM `wp_actionscheduler_actions` WHERE `status` = "failed";' | mysql --user="$user" --password="$password" --database="$database" --host="$host"