macoblog

「ゲーム × プログラミング」で生きていく

【WordPress】任意のカテゴリ順で記事を表示する方法

WordPress

この記事では、WordPressで任意のカテゴリ順に記事をループ表示させる方法について紹介しています。実際のコードを見ながら初心者でもわかりやすいよう解説していますのでプログラミング初心者の方は参考にどうぞ。

目次【本記事の内容】 [ click ]

任意のカテゴリ順で記事を表示するには

ここでいう「カテゴリ順に記事を表示する」とは、カテゴリ1〜3があった場合に、最初にカテゴリ3の記事を全て表示して、次にカテゴリ1の記事を全て表示、最後にカテゴリ3の記事を全て表示するという事です、イレギュラーとはいえWordPressを業務で使っているとたまにこんなイレギュラーな事もします。

上記の仕様を実現するには4つの方法があります、結論から言うと自力でソートするのがオススメです。

  • カテゴリを指定してそれぞれループさせる
    →要するにカテゴリを指定したループ処理を3つ用意するわけですが、カテゴリが増えた時どうすんのって話になりかねないのでボツ、ってかキレイじゃないからヤダ。
  • ソート用のカスタムフィールドを作る
    →ソートのためだけにカスタムフィールドを作るってのは個人的に嫌ですね。
  • オプションで何か指定する
    WP_Queryのオプションを指定すればワンチャンいけるかもですが、多分無理なのでボツ。
  • 自力で任意のカテゴリ順にソートする
    →多分これが一番ベストかなと、多少知識がないと難しいけどこの程度なら普通に実装可能。

ということで、自力で任意のカテゴリ順にソートする方法について解説していきたいと思います。

自力で任意のカテゴリ順にソートする方法

自力で任意のカテゴリ順にソートする方法

カテゴリ1(cat1)→カテゴリ2(cat2)→カテゴリ3(cat3)の順で表示させてみます。

完成コード

$args = array(
  'post_type' => 'post',
  'posts_per_page' => -1,
);
$my_query = new WP_Query( $args );

if ($my_query->have_posts()):
  // 記事を格納する配列を用意
  $sort_posts = [];

  // ループ開始
  while ( $my_query->have_posts() ) : $my_query->the_post();
    // カテゴリを取得
    $faqcat = get_the_category();
    // 本文を取得
    $content = apply_filters('the_content',get_the_content());
    // 優先度を格納
    $priority = 0;
    // カテゴリスラッグによって優先度を振り分け
    switch ($faqcat[0]->slug) {
      case 'cat2':
        $priority = 1;
        break;
      case 'cat3':
        $priority = 2;
        break;
    }

    // 用意した配列に必要なデータだけ入れ直す
    $sort_posts[] = array(
                      'priority'   => $priority,
                      'catname' => $faqcat[0]->name,
                      'title'   => get_the_title(),
                      'content' => $content
                    );
                    
  endwhile;
  // ループ終了

  // ソート用の配列を用意
  foreach ($sort_posts as $key => $value) {
    $sort[$key] = $value['priority'];
  }

  // ソート用の配列と対象の配列を使って昇順並び替え
  array_multisort($sort, SORT_ASC, $sort_posts);

  // 記事を出力する
  foreach ($sort_posts as $key => $value) {
    echo $value['catname'];
    echo $value['title'];
    echo $value['content'];
  }
endif;

wp_reset_postdata();

簡単に解説します。

仕組みを解説

まず何を使ってソートするかを決めます、今回はそれぞれのカテゴリに優先度という値を持たしてみました。

17~35行目(抜粋)

// 優先度を格納
$priority = 0;
// カテゴリスラッグによって優先度を振り分け
switch ($faqcat[0]->slug) {
 case 'cat2':
   $priority = 1;
   break;
 case 'cat3':
   $priority = 2;
   break;
}

// 用意した配列に必要なデータだけ入れ直す
$sort_posts[] = array(
                 'priority'   => $priority,
                 'catname' => $faqcat[0]->name,
                 'title'   => get_the_title(),
                 'content' => $content
               );
スラッグを使ってswitchで優先度を振り分けています、そしてその値を配列に追加しています。優先度を持たせずスラッグを使ってそのままソートすることも出来ましたが、自由度が低いのでやめました。スラッグにプレフィックスを付ける(例:「a-cat1」「b-cat1」「c-cat1」)という手もありますが、ちょっとね・・・。

40~43行目(抜粋)

// ソート用の配列を用意
foreach ($sort_posts as $key => $value) {
  $sort[$key] = $value['priority'];
}
ソート用の配列を用意します(今回は優先度を格納)

45~46行目(抜粋)

// ソート用の配列と対象の配列を使って昇順並び替え
array_multisort($sort, SORT_ASC, $sort_posts);
array_multisort関数を使って並び替えを実行

48~53行目(抜粋)

// 記事を出力する
foreach ($sort_posts as $key => $value) {
  echo $value['catname'];
  echo $value['title'];
  echo $value['content'];
}
ソートした配列を出力

以上。

WEBトマトWEBトマト

優先度の振り分けを変えるだけで好きなカテゴリ順で記事を表示する事ができました。ただ、スラッグ名を変えるとこっちも変えないといけないのでハードコーンディング感は否めません。管理画面から操作できるようにしたい場合はカスタムフィールドを使って自作するのがベストかな。