マルチサイトで各サイトの記事を混ぜてさらに日付順に並び替えて親サイトに一覧表示したかったのですが、あまり参考記事がなくかなりハマったのでメモ。

SQL文の部分など長くなってしまったので何回かに分けて記載したいと思います。

wordpressのマルチサイトで各サイト(ブログ)の記事を混ぜて一覧表示する

  1. wordpressのマルチサイトで各サイトの記事を混ぜて表示する方法を考える
  2. MySQL – サイト毎に分かれている投稿テーブルを1つにまとめる
  3. MySQL – ブログIDを追加する
  4. MySQL – 1つにまとめたデータを投稿日順に並び替える
  5. MySQL – 1つにまとめたデータに取得件数を指定する
  6. 完成版(ページングなし) – wordpressのマルチサイトで各サイトの記事を混ぜて一覧表示する

スポンサーリンク

はじめに

シリーズを通してやりたいこと / ゴール

制作環境 / テスト環境

  • wordpress サブディレクトリ型のマルチサイト

情報

今回は、下記の条件・情報でおこないたいと思います。

マルチサイトで各サイトの記事を混ぜて表示する方法を考える

まず、各サイトの記事を混ぜて表示する方法を考えてみました。
簡単に行う方法を探してみたのですが、DBからデータを取得してくるしかなさそうでした。

「switch_to_blog」でおこなう方法

やり方を探していた時に、「switch_to_blog」でブログを切り替えておこなう方法が多かったのですが、これだと記事を混ぜての表示が難しそうだったので違う方法をとりました。

多分このような表示になりそう、、

wordpressのDBから情報を取得する方法

wordpressのDBへアクセスしてSQLを操作&取得するには、「$wpdb->get_results」と「$wpdb->prepare」を使うとよさそうです。

wpdb Class – WordPress Codex 日本語版

global $wpdb;

$results = $wpdb->get_results (
	$wpdb->prepare (
		$sql,// SQL文
		// プレースホルダーに代入する値など。。
	)
);

このような形で、、あとはDBから必要なデータを取得するSQL文を「$wpdb->prepare」の第一引数に入れればOK!なのですが、SQL文に慣れていないのでSQL文を作成するのが一番大変でした。。

SQLのどのテーブルのどの情報が必要か?

まず、SQLからどのテーブルのどの情報を取得してくるか?または必要か?を考えてみました。

今回、表示で使いたい内容は、
タイトル、投稿日、記事へのリンク、その他(カスタムフィールド)
です。

そのほか、
投稿日の日付順でソートしたいため、投稿日

取得条件として、
公開済みのものだけでいいので、投稿ステータス
各サイトで投稿タイプが異なるので、投稿タイプ

が必要そうです。

ここでいくつか問題が出てきました。。

1. 記事へのリンク

「wp_posts」の「guid」に記事へのリンクが入っていますが、格納されているデータが素のURL?のようで、パーマリンクを変更していると、表示されるURLと異なってくるようです。

そのため、表示の際にwordpress側で「get_permalink()」で取得した方がよさそうです。

2. カスタムフィールドの値も表示したい箇所があったこと

2つ目は、カスタムフィールドで入力した値も表示したい箇所があったことです。

タイトルなどの投稿データは、「wp_posts」ですが、カスタムフィールドは、「wp_postmeta」テーブルに入っているので、カスタムフィールド値もSQLで取得してくるには、データをくっつけたり、、SQLに慣れていない自分には時間がかかりそうだったので、表示の際にwordpress側でどうにかできないか考えました。

上記の問題を解決するため、下記のように取得するデータを変更しました。

DBから取得するデータを下記のように変更してみました。

タイトル等の取得をやめて、投稿IDの取得に変更しました。

投稿IDに変更したのは、投稿IDを取得しておけば、wordpress側で投稿IDを指定することで、タクソノミーやカスタムフィールドなども、大体のものが取得や表示ができるからです。

また、ブログIDを追加しました。
マルチサイトの場合、投稿IDだけですと、どのブログの投稿IDなのかが判別できないからです。

wordpressのDBを確認するには管理画面から確認できる「ARI Adminer」が便利です!

マルチサイトのテーブル

シングルサイトの場合は、これで準備OK!なのですが、今回はマルチサイトなので、もうひと工夫必要そうです。

ここまでで、テーブル名を「wp_posts」と記載していましたが、マルチサイトの場合、各サイトごとにテーブル名が異なるので、マルチサイトのテーブル名を見てみたいと思います。

今回必要なテーブルは、投稿データの入ってる「wp_posts」です。

この「wp_posts」は、プレフィックスを特に変更していない場合は、このままですが、プレフィックスを変更している場合は、「プレフィックス + posts」となり、プレフィックスの部分は、それぞれ異なります。
「wp_」の部分は、ご自分の環境に合わせて読み変えてくださいね。

ここで、一旦、DBを見てみると、「wp_posts」、「wp_2_posts」、「wp_3_posts」、、など似たようなものがたくさんありますね。

マルチサイトの場合、投稿データの入っている「wp_posts」が、作成したサイトごとに「wp_2_posts」、「wp_3_posts」、、と用意され、それぞれのテーブルに投稿データが格納されています。

そのため、各サイトからそれぞれ投稿データを取得するには、「wp_posts」テーブルだけでは取得できません。

各サイトの投稿データのテーブルから取得してくる必要があります。
(「wp_posts」、「wp_2_posts」、「wp_3_posts」から取得が必要)

さらに、今回は、記事を混ぜて日付順で並び替えて表示させたいです。

そのためには、サイトごとに分かれている投稿テーブルを一旦、1つにくっつけて1つのデータにします。
それを日付順に並び替えて、「各サイトの記事を混ぜて表示」をしたいと思います。

まとめ

今回は、方法とSQLから取得する情報などを整理してみました。

次回から一番ハマったSQL文の部分などを書きたいと思います。

wordpressのマルチサイトで各サイト(ブログ)の記事を混ぜて一覧表示する

  1. wordpressのマルチサイトで各サイトの記事を混ぜて表示する方法を考える
  2. MySQL – サイト毎に分かれている投稿テーブルを1つにまとめる
  3. MySQL – ブログIDを追加する
  4. MySQL – 1つにまとめたデータを投稿日順に並び替える
  5. MySQL – 1つにまとめたデータに取得件数を指定する
  6. 完成版(ページングなし) - wordpressのマルチサイトで各サイトの記事を混ぜて一覧表示する

参考にさせていただきました


スポンサーリンク

カテゴリー : 未分類