概要
公開されたリスト投稿から適切なリストをランダムに選んで LOTD とし、1日に1回配信する。
詳細
公開されたリスト投稿 とは……
公開されたリスト投稿とは、次の条件をすべて満たす投稿(記事)。
- 投稿タイプ: 投稿 (post)
- カテゴリ: list
- ステータス: 公開
適切なリスト とは……
適切なリストとは、公開されたリスト投稿のなかで次の条件をすべて満たす投稿。
- 書籍から作成されている
- 書籍が引用されていないリストは自作リストやまとめリストなど配信向きでないものが多いと考えたため。
- システム的には “ASIN” タクソノミーのタームが関連付けられているリスト。
- これまでにLOTDになった回数が少ない
- 多様なリストを配信させたいため。
- システム的には、LOTDとして選ばれた回数を投稿のカスタムフィールド lotd_count に保存し、最小回数のリストから選択する。
- 運営者が配信向きだと判断した
- 上記の条件を満たしていても、配信向きでないと判断したリストは配信しないようにする。
- システム的には、先の lotd_count カスタムフィールドに ‘999’ をセットして候補から除外する。
ランダムに選んで とは……
上記の条件を満たすリスト投稿群を作成したうえで、ランダムに1つリストを選ぶ。ただし、LOTDとして適切かどうかを前日にチェックするため、翌日のLOTD候補を前日に決めておきたい。
乱数生成器にシードを与えて初期化すると、生成される乱数はシードに対して一意に定まる(Random seed – Wikipedia)。そこで 20201231 のような日付を元にした情報をシードとして与えれば、母集団が変わらないかぎり、特定の日にどの投稿が選ばれるかを知ることができる。
以下、処理の概要。
1. まず既配信回数の最小値を求める。 公開されたリスト投稿の中で書籍から作成されているものを lotd_count カスタムフィールドの小さい順に並べ替えて、その先頭行を取得する。
$lotd_ids_core = array(
'post_type' => 'post',
'category_name' => 'list',
'post_status' => 'publish',
'posts_per_page' => 1, // 1件のみ
'tax_query' => array( // ASIN が付与されている
array(
'taxonomy' => 'asin',
'operator' => 'EXISTS',
),
),
);
$query = new WP_Query( $lotd_ids_core + array(
'fields' => 'ids', // IDのみ
'orderby' => 'meta_value_num', // カスタムフィールドで並べ替え
'meta_key' => 'lotd_count', // 既配信回数
'order' => 'ASC', // 昇順
) );
$min_lotd_count = get_post_meta( $query->posts[0], 'lotd_count', true );
2. 公開されたリスト投稿から適切なリストをランダムに選ぶ。
$seed = wp_date( 'Ymd' );
$lotd_post = new WP_Query( $lotd_ids_core + array(
'meta_query' => array( //既配信回数が最小の記事
array(
'key' => 'lotd_count',
'value' => $min_lotd_count,
'compare' => '=',
),
),
'orderby' => 'rand('.$seed.')', // YYYYMMDDをシードとして与えたうえでランダムに
) );
// $lotd_post->posts[0] が YYYYMMDD における LOTD候補となる
LOTD とは……
システム上、LOTD とは次の条件を満たす投稿。
- カテゴリ: 今日のリスト
毎日 0:01 にバッチ処理を走らせ、「今日のリスト」カテゴリを空にしたうえで、上記のロジックで選んだリストを「今日のリスト」カテゴリに入れる。そしてカスタムフィールドに保存している配信カウンタをインクリメントしておく。
1日1回配信 するには……
メールでは
毎日 6:05 にバッチ処理を走らせ、LOTD を エックスサーバーのメーリングリストに投稿する。
Feed では
WordPress の標準機能でカテゴリごとの feed が出力されるので、「今日のリスト」カテゴリのフィードが LOTD のフィードになる。
X では
メール配信処理の後で @listfreak にポストする。