• TOP
  • 記事一覧
  • WordPressでカスタムフィールドを使った記事のスコアリング 一定割合ランダム表示でε-greedy方策

WordPressでカスタムフィールドを使った記事のスコアリング 一定割合ランダム表示でε-greedy方策

更新日:2025/01/27

WordPressで記事にスコアを付けて、そのスコアに基づいて記事を並び替えて表示する機能を実装する方法を解説します。この実装では、SCFプラグインを使用してカスタムフィールドを追加し、ショートコードで任意の場所に表示できるようにします。

WordPress DB カスタムフィールド スコア (post_score) フロント表示 [‘score_posts’]

実装手順

1. カスタムフィールドの設定

SCFプラグインで以下の設定を行います:

  • フィールド名:post_score
  • タイプ:テキスト
  • ラベル:スコア
  • デフォルト値:0
カスタムフィールド スコア 0 フィールド名: 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');

Windowsエクスプローラーで使えるショートカット集

スコア: 0

1. 新規フォルダ作成とリネーム 2. 名前の変更 3. ディレクトリ間の移動 4. 新しいウィンドウで開く 5. エクスプローラーの起動 6. 更新・再表示 7. プロパティの表示 8. アドレスバーへのフォーカス 9 […]

【SnowMonkey】納品までのフローまとめ

スコア: 0

SnowMonkeyサイト制作案件の全貌 SnowMonkeyのウェブ制作の仕事はクライアントがウェブ制作会社ではなく、エンドクライアント(ウェブ制作とは関係ない事業者)が対象となる場合が多いです。 そのためコーディング […]

形態素解析とは?初心者でもわかるツールの使い方と実践例

スコア: 0

1. 形態素解析の基礎知識 形態素解析とは、テキストを言語学的に意味を持つ最小単位(形態素)に分解し、それぞれの品詞や活用形などの文法情報を判定する自然言語処理の基礎技術です。 私は今日公園で本を読みました 私 代名詞 […]

Excel VBAファイル(.bas)の文字化けの対策

スコア: 0

どういうタイミングで文字化けするか? ブラウザでのファイル読み込み時に文字化けしてしまいます メモ帳でしたら自動判定で正常に表示されます メモ帳での読み込み .bas (Shift-JIS) 自動判定 正常表示 ブラウザ […]

3. 使用方法

記事や固定ページ内で以下のようにショートコードを使用します:

(注意)*は不要です、実際にブログ記事にショートコードで関数が呼び出されてしまうので、*挿入しました

[*score_posts*]

示件数とソート順を指定:

[*score_posts posts_per_page="3" order="DESC"*]

カスタマイズのポイント

  1. 表示件数の変更
  2. ソート順の変更(DESC:降順、ASC:昇順)
  3. 表示スタイルのカスタマイズ
記事タイトル1 スコア: 95 記事タイトル2 スコア: 85 記事タイトル3 スコア: 75

WordPressでスコアデータのCSVインポート機能を実装する

CSV File post_id,score Import Process Validation Error Handling WordPress DB Read CSV Update Scores

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
}
スコアの一括インポート CSVファイルをドラッグ&ドロップ または ファイルを選択 CSVフォーマット: post_id,score 例: 123,85 インポート実行

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

使用方法

  1. CSVファイルの準備
    • 1列目:記事ID
    • 2列目:スコア値(0-100)
  2. インポート手順
    • 管理画面の「ツール」→「スコアインポート」に移動
    • CSVファイルを選択
    • 「インポート実行」をクリック
  3. 実行結果の確認
    • 更新された記事数
    • エラーがあった場合はその内容

エラーハンドリング

  • 存在しない記事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);
}

表示パターンの例 パターン1: 1位 2位 3位 7位 R2 R1 R3 パターン2: 1位 2位 3位 7位 R3 R2 R1 動作の説明: • 1位~7位までは常にスコア順で固定表示 (青色) • ランダム表示部分(R1, R2, R3)は毎回順序が変化 (緑色) • 8位~10位の中からランダムに選ばれて表示される 固定順位表示 ランダム表示
人気記事ランキング
話題のキーワードから探す