WooCommerceの販売実績を、管理画面の商品一覧画面に表示させる方法。
前日の売上・直近1週間の売上・直近1ヶ月の売上 を保存する方法を今回は紹介する。メタデータとして保存するので、これを使ったクエリで、
「デイリーランキング」や「週間ランキング」、「月間ランキング」などの表示も可能なので、結構便利だと思う。
商品一覧ID取得関数:get_all_product_ids
まず、商品を全権取得する関数を定義。
function get_all_product_ids() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => array('publish', 'private'),
);
$products_query = new WP_Query($args);
$product_ids = $products_query->posts;
return $product_ids;
}
上記では、公開中のものと非公開のもの両方とも集計するようにしているが、非公開のものについて不要であれば、‘post_status’ => ‘publish’ だけでも良い。
全商品の販売個数計算関数:calculate_sales_for_all_products
全商品のIDを取得した後、一度に処理する商品数(ここでは50)で分割(チャンキングする)。
分割しなくても機能はするが、件数が膨大な時に、処理が重くなりすぎないようにしている。
function calculate_sales_for_all_products() {
$all_product_ids = get_all_product_ids();
$chunk_size = 50;
$chunks = array_chunk($all_product_ids, $chunk_size);
foreach ($chunks as $chunk) {
foreach ($chunk as $product_id) {
calculate_sales($product_id);
}
}
}
1商品の販売個数計算関数:calculate_sales
次に、前日、直近1週間、直近1ヶ月の販売数を計算する関数を定義。それぞれの計算結果はメタデータとして保存される。
function calculate_sales($product_id) {
$sales_yesterday = calculate_sales_yesterday($product_id);
$sales_last_week = calculate_sales_last_week($product_id);
$sales_last_month = calculate_sales_last_month($product_id);
update_post_meta($product_id, 'sales_yesterday', $sales_yesterday);
update_post_meta($product_id, 'sales_last_week', $sales_last_week);
update_post_meta($product_id, 'sales_last_month', $sales_last_month);
}
前日の販売個数計算関数:calculate_sales_yesterday
function calculate_sales_yesterday($product_id) {
$yesterday_start = date_i18n('Y-m-d 00:00:00', strtotime('-1 day'));
$yesterday_end = date_i18n('Y-m-d 00:00:00');
$sales = get_sales_count_for_product_in_date_range($product_id, $yesterday_start, $yesterday_end);
return $sales;
}
この関数は前日の販売数を計算する。前日の始まりと終わりの時刻を取得し、その間の販売数を取得する。
直近1週間の販売個数計算関数:calculate_sales_last_week
function calculate_sales_last_week($product_id) {
$last_week_start = date_i18n('Y-m-d 00:00:00', strtotime('-7 days'));
$last_week_end = date_i18n('Y-m-d 00:00:00');
$sales = get_sales_count_for_product_in_date_range($product_id, $last_week_start, $last_week_end);
return $sales;
}
この関数は直近1週間の販売数を計算する。過去7日間の始まりと終わりの時刻を取得し、その間の販売数を算出する。
直近1ヶ月の販売個数計算関数:calculate_sales_last_month
function calculate_sales_last_month($product_id) {
$last_month_start = date_i18n('Y-m-d 00:00:00', strtotime('-1 month'));
$last_month_end = date_i18n('Y-m-d 00:00:00');
$sales = get_sales_count_for_product_in_date_range($product_id, $last_month_start, $last_month_end);
return $sales;
}
この関数では直近1ヶ月の販売数を計算する。直近1ヶ月の始まりと終わりの時刻を取得し、その間の販売数を取得する。
計算結果のスケジューリング
販売数計算は毎日定期的に行われるべきなので、WordPressのcron機能を用いて、この計算を毎日実行するスケジュールを設定する。
if (!wp_next_scheduled('calculate_sales_daily')) {
wp_schedule_event(time(), 'daily', 'calculate_sales_daily');
}
add_action('calculate_sales_daily', 'calculate_sales_for_all_products');
ここまでで、販売情報を保存するところまでは完了。次に、管理画面で閲覧できるように追記をする。
管理画面に販売数情報を表示する列の追加
add_filter('manage_edit-product_columns', 'add_sales_columns_to_admin_product_list');
function add_sales_columns_to_admin_product_list($columns) {
$columns['sales_yesterday'] = __('昨日の売上', 'textdomain');
$columns['sales_last_week'] = __('直近1週間売上', 'textdomain');
$columns['sales_last_month'] = __('直近1ヶ月売上', 'textdomain');
return $columns;
}
商品管理画面に販売数情報を表示するための列を作成する。新しく追加する列の項目名はそれぞれ、「機能の売上」「直近1週間売上」「直近1ヶ月売上」の3つ。
これだけだと、列が追加されるだけで列が空っぽなので、次の関数で、列の中身を出力する。
商品の販売数表示
add_action('manage_product_posts_custom_column', 'show_sales_in_admin_product_list', 10, 2);
function show_sales_in_admin_product_list($column, $post_id) {
switch ($column) {
case 'sales_yesterday':
echo get_post_meta($post_id, 'sales_yesterday', true);
break;
case 'sales_last_week':
echo get_post_meta($post_id, 'sales_last_week', true);
break;
case 'sales_last_month':
echo get_post_meta($post_id, 'sales_last_month', true);
break;
}
}
ここでは商品の各列に、前日、直近1週間、直近1ヶ月の販売数を表示する処理を実装する。
管理画面の商品一覧に新たに追加した列に対して、get_post_meta
関数を用いて商品のメタデータから販売数を取得し、表示する。