投稿一覧を人気順でソートして表示する方法

Cocoonカスタマイズ集
この記事は約5分で読めます。
記事内に広告が含まれています。

記事に記載したコードは、スキンに追加されています。

はじめに

投稿一覧

Cocoon設定→管理者画面→カラム表示「PVを表示する」をオンとした場合、各投稿のPV数が集計単位ごとに表示されます(図1参照)。
ただし、PV数の多い順に並び替えるなどのソートはできません。

そこで、投稿一覧を独自にPV数で並び替えができるようにします。

この記事では、この方法について説明します。

完成イメージ

実装手順

以下のコードをfunctions.phpに追加します。

// 一覧にフィルターボタンを追加
add_action('restrict_manage_posts', function () {
  global $typenow;

  // テーマ独自アクセス集計以外の場合
  if (get_admin_panel_pv_type() != THEME_NAME) {
    return;
  }

  if ($typenow !== 'post') {
    return;
  }

  $current = $_GET['pv_range'] ?? '';

  $pv_options = [
    ''    => '人気記事',
    '1'   => '本日',
    '7'   => '今週',
    '30'  => '今月',
    'all' => '全期間',
  ];

  ?>
  <select name="pv_range">
    <?php foreach ($pv_options as $value => $label): ?>
      <option value="<?= esc_attr($value); ?>" <?php selected($current, (string) $value); ?>>
        <?= esc_html($label); ?>
      </option>
    <?php endforeach; ?>
  </select>
  <?php
});


// 投稿クエリの取得条件を変更
add_action('pre_get_posts', function ($query) {
  global $pagenow;

  if (!is_admin() || !$query->is_main_query()) {
    return;
  }

  // テーマ独自アクセス集計以外の場合
  if (get_admin_panel_pv_type() != THEME_NAME) {
    return;
  }

  if ($query->get('post_type') !== 'post' || empty($_GET['pv_range'])) {
    return;
  }

  // 指定期間のPVランキングデータを取得
  $days    = ($_GET['pv_range'] === 'all') ? 'all' : (int) $_GET['pv_range'];
  $records = get_access_ranking_records($days, -1, 'post');

  $popular_ids = [];
  if (!empty($records)) {
    $popular_ids = array_map('intval', wp_list_pluck($records, 'ID'));
  }

  // 公開済みの全投稿IDを取得
  $published_ids = get_posts([
    'post_type'      => 'post',
    'post_status'    => 'publish',
    'posts_per_page' => -1,
    'fields'         => 'ids',
    'no_found_rows'  => true,
    'orderby'        => 'date',
    'order'          => 'DESC',
  ]);

  // 人気記事をマージ
  $remaining_ids = array_diff($published_ids, $popular_ids);  // 人気記事以外
  $merged_ids    = array_merge($popular_ids, $remaining_ids);  // 人気記事+人気記事以外

  // クエリに適用
  if (!empty($merged_ids)) {
    $query->set('post__in', $merged_ids);
    $query->set('orderby', 'post__in');
    $query->set('post_status', 'publish');
  }
});

解説

  • 表1に示すように、CocoonのPV数はテーブル名wp_cocoon_accessesに登録。
  • 独自関数get_access_ranking_records()を使用して、期間集計された順位に基づいて投稿IDを取得。
  • この投稿IDを使用して、投稿一覧を並び替える。
wp_cocoon_accesses
名称説明
post_id投稿ID
dateアクセス日付
countアクセス数
last_ipアクセスしたIPアドレス

ソートを行うためには、クエリにソートキーが必要です。
Cocoonは投稿のカスタムフィールドにアクセス回数を持っていないため、pre_get_postsにカスタムフィールドのキーを設定することはできません。

そのため、人気記事を表示するのと同様に、人気順の投稿IDを取得し、post__inでその順序に基づいて投稿IDを指定します。

さいごに

今回紹介した方法を利用すれば、投稿一覧をPV順でソートできるようになります。
しかし、GA4(Google Analytics 4)で、各ページのアクセス集計が表示されます。
さらに、プラグイン「Analytics Insights for Google Analytics 4(AIWP)」を使用することで、WordPressのダッシュボード上にGA4の結果を表示できます。
そのため、Cocoonのアクセス集計は人気記事の表示用として捉えるのが適切だと考えます。

タイトルとURLをコピーしました