スタッフブログ


【WordPress】カテゴリーと記事がどうやって紐づいているのか再確認した話(前編)

【WordPress】カテゴリーと記事がどうやって紐づいているのか再確認した話(前編)

こんにちは。ウェブクリエイターの中井です。
リコネクトではWordPressを使ってホームページ制作サービスを提供していますが、案件によっては、会社案内などのコンテンツを複数のサイトに表示する場合があります。
そんなとき、複数のホームページが同じデータベース上にテーブルを持っている場合、そのWordPress間ではコンテンツを連動させて更新することができます。
ホームページAの記事を更新するとホームページBのコンテンツ連動している記事も同時に更新される、といった感じです。

ホームページAの記事を更新するとホームページBのコンテンツ連動している記事も同時に更新される

ただこのコンテンツ連動、全く同じ内容をそのまま別のサイトのデザインに合わせて表示する分には問題ないんですが、
カテゴリーが絡んでいたり、元のサイトが持っている情報をもとにWordPress独自の関数を使おうとするとうまくいかないようです。

コンテンツ連動を巡って四苦八苦。今日はそんなお話をお届けします。

連動元の情報をもとにWordPressの関数を使ってみた!

んですが…いろいろな関数を試しても、吐き出される値はすべて空…。
コンテンツ連動してるのはあくまで、連動したい特定のエリア、であってホームページやそのページ全体じゃないので、参照元のテーブルとは紐づけられないのが理由かと思ってます。

関数が使えなくても、コンテンツ連動をしたいエリアは連動させたいホームページの独自の接頭辞をつけたWordPressのデータベーステーブルのほうを向いているので、
それを直接見ればいいのでは?と思い、いままでなんとなくの理解だったWordPressのデータベース構造と向き合うことにしました。

カテゴリー情報はどう格納されているのか

まず理想形のページ構成を考えてみます。
今回表示としたいのはカテゴリーごとの絞り込みボタンのある、画像サムネイル付きの記事一覧ページです。
ホームページAがもとの情報を持っていて、その情報をホームページBから見てほぼ同一のページを表示します。

ホームページAがもとの情報を持っていて、その情報をホームページBから見てほぼ同一のページを表示します

最初に表示したいのは、上部のカテゴリー一覧です。
このカテゴリー一覧は、作成しておいたカスタムタクソノミーを表示させているので、そこに着目して探っていきたいと思います。

ここからはphpMyadminを利用してみていきます。

タクソノミーやターム情報をもっていそうなテーブルはこの3つ。

  • wp_terms
  • wp_term_relationships
  • wp_term_taxonomy

それぞれの中身をざっくり確認してみます…

wp_terms

wp_terms

ID・name・slugなど、ターム情報が集約されています。

 

wp_term_relationships

wp_term_relationships

object_id(記事ID)とタームのIDを紐づけているようです。

 

wp_term_taxonomy

wp_term_taxonomy

タームIDごとにタクソノミーが確認できます。

SQL文を使ってデータベースの情報を抽出

当たり前かもしれませんが、共通のID情報をそれぞれのテーブルにもたせてうまく情報を整理しているようですね。
これでwp_term系のテーブルの役割が見えてきたので、それらをうまく連携させて取得したい情報を形成していきます。

	
	<?php
	/***********************************************
	* データベース参照
	***********************************************/
	global $wpdb;
	$tax = 'custom_tax';

	/*-------------------------------------------------
	taxnomyがaaaのterm_idを抽出
	-------------------------------------------------*/

	$table_term_taxonomy = $wpdb->prefix . "term_taxonomy";

	$get_items = "term_taxonomy_id";

	/*
	【1】必要なタームIDを取得
	*/
	$db_datas = $wpdb->get_results("
		SELECT $get_items
		FROM $table_term_taxonomy
		WHERE taxonomy = '$tax'
	");

	foreach( $db_datas as $data ) {
		$term_ids[] = $data->$get_items;
	}

	/*
	【2】次工程のために取得したIDをカンマ区切りの文字列に変換
	*/
	$term_ids = implode( ',', $term_ids );

	/*-------------------------------------------------
	抽出したterm_idからターム情報を取得
	-------------------------------------------------*/

	$table_terms = $wpdb->prefix . "terms";

	$get_items = 'term_id,name,slug,term_order';

	/*
	【3】必要なターム情報を取得
	*/
	$db_datas = $wpdb->get_results("
		SELECT $get_items
		FROM $table_terms
		WHERE term_id
		IN($term_ids)
	");

	/*-------------------------------------------------
	term_orderの順にソート
	-------------------------------------------------*/

	foreach( $db_datas as $data ) {
		$data_sort[ $data->term_order ] = $data;
	}
	ksort( $data_sort );

	?>

	<ul>

		<li>
		<a href="">すべて</a></li>
		<?php foreach( $cats_arr as $cat ): ?>

		<li>
			<a href="<?php echo esc_url( home_url( 'aaa/?menu='.$cat->slug ) ); ?>">
				<?php echo $cat->name ?>
			</a>
		</li>

		<?php endforeach; ?>

	</ul>

	

実際の出力データ

ホームページBでホームページAで設定しているカテゴリーの一覧を出力することができました。
なるべくホームページB側でカテゴリーの追加等をしなくても済むように、リンク先では$_GETでslugを取得させています。

後編に続く…

本当はこんな変態的なことをしなくても取得できるのかもしれませんが、自分の勉強になったので良かったと思うことにします。
思った以上に長くなったので記事の一覧の取得はまた次回!

リコネクトへのお問い合わせ

このサイトを広める