WordPressで記事にスコアを付けて、そのスコアに基づいて記事を並び替えて表示する機能を実装する方法を解説します。この実装では、SCFプラグインを使用してカスタムフィールドを追加し、ショートコードで任意の場所に表示できるようにします。
実装手順
1. カスタムフィールドの設定
SCFプラグインで以下の設定を行います:
- フィールド名:post_score
- タイプ:テキスト
- ラベル:スコア
- デフォルト値:0
2. ショートコード実装
function score_ordered_posts_shortcode($atts) {
$atts = shortcode_atts(array(
'posts_per_page' => 5,
'order' => 'DESC',
), $atts);
$args = array(
'post_type' => 'post',
'posts_per_page' => $atts['posts_per_page'],
'meta_key' => 'post_score',
'orderby' => 'meta_value_num',
'order' => $atts['order']
);
$query = new WP_Query($args);
ob_start();
if ($query->have_posts()) :
echo '<div class="score-posts-list">';
while ($query->have_posts()) : $query->the_post();
$score = SCF::get('post_score');
?>
<article class="score-post-item">
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<div class="score-value">スコア: <?php echo esc_html($score); ?></div>
</article>
<?php
endwhile;
echo '</div>';
endif;
wp_reset_postdata();
return ob_get_clean();
}
add_shortcode('score_posts', 'score_ordered_posts_shortcode');
[score_posts posts_per_page=”10″ order=”DESC”]
3. 使用方法
記事や固定ページ内で以下のようにショートコードを使用します:
(注意)*は不要です、実際にブログ記事にショートコードで関数が呼び出されてしまうので、*挿入しました
[*score_posts*]
示件数とソート順を指定:
[*score_posts posts_per_page="3" order="DESC"*]
カスタマイズのポイント
- 表示件数の変更
- ソート順の変更(DESC:降順、ASC:昇順)
- 表示スタイルのカスタマイズ
WordPressでスコアデータのCSVインポート機能を実装する
WordPressで記事のスコアを一括管理するために、CSVファイルからのインポート機能を実装する方法を解説します。この機能により、大量の記事のスコアを効率的に更新できます。
実装手順
1. 管理メニューの追加
function import_post_scores() {
add_management_page(
'スコアインポート',
'スコアインポート',
'manage_options',
'score-import',
'render_score_import_page'
);
}
add_action('admin_menu', 'import_post_scores');
2. インポートページの実装
function render_score_import_page() {
?>
<div class="wrap">
<h1>スコアの一括インポート</h1>
<form method="post" enctype="multipart/form-data">
<?php wp_nonce_field('score_import_action', 'score_import_nonce'); ?>
<input type="file" name="score_csv" accept=".csv" required>
<input type="submit" name="submit_score_import"
class="button button-primary" value="インポート実行">
</form>
</div>
<?php
}
3. インポート処理の実装
function process_score_import($file) {
if (($handle = fopen($file, 'r')) !== FALSE) {
// ヘッダーをスキップ
fgetcsv($handle);
$results = [
'updated' => 0,
'errors' => []
];
while (($data = fgetcsv($handle)) !== FALSE) {
$post_id = intval($data[0]);
$score = intval($data[1]);
if (validate_import_data($post_id, $score)) {
SCF::update_post_meta($post_id, 'post_score', $score);
$results['updated']++;
} else {
$results['errors'][] = "Invalid data: ID={$post_id}, Score={$score}";
}
}
fclose($handle);
return $results;
}
return false;
}
4. バリデーション関数
function validate_import_data($post_id, $score) {
return (
$post_id > 0 &&
post_exists($post_id) &&
is_numeric($score) &&
$score >= 0 &&
$score <= 100
);
}
CSVファイルのフォーマット
post_id,score
123,85
456,92
789,78
使用方法
- CSVファイルの準備
- 1列目:記事ID
- 2列目:スコア値(0-100)
- インポート手順
- 管理画面の「ツール」→「スコアインポート」に移動
- CSVファイルを選択
- 「インポート実行」をクリック
- 実行結果の確認
- 更新された記事数
- エラーがあった場合はその内容
エラーハンドリング
- 存在しない記事IDのチェック
- スコア値の範囲チェック
- CSVフォーマットの検証
- 文字コードの確認
ε-greedy方策を実装して、スコア順とランダム表示を組み合わせる
ε-greedy方策とは
// page-results.phpのWP_Queryの結果を処理する部分に以下のコードを追加
if ($results_query->have_posts()) {
$posts = $results_query->posts;
$total_posts = count($posts);
// ε値を設定 (30%をランダム表示にする場合は0.3)
$epsilon = 0.3;
// ランダムに選ぶ投稿の数を計算
$random_count = ceil($total_posts * $epsilon);
$score_count = $total_posts - $random_count;
// スコアでソートする投稿とランダムに表示する投稿を分ける
$sorted_posts = array_slice($posts, 0, $score_count);
$random_posts = array_slice($posts, $score_count);
// ランダムな投稿をシャッフル
shuffle($random_posts);
// 結果を結合
$results_query->posts = array_merge($sorted_posts, $random_posts);
$results_query->post_count = count($results_query->posts);
}