何らかの項目を元に、ポストとポスト(カスタムポスト)をリレーションして繋げたいという記事を以前書きました。その記事の続編というか改編です。
改編ですので同じようなことを別の書き方で書いています。内容被りもありますし投稿を分ける意味があるのかないのかわかりませんが以前の投稿を消して書き直すのもどうかと思ってこうして続編・改編として新たに書きました。
ポストとポストを結びつけること
ポストとポスト(カスタムポストも含む)を接続するということはどういうことか。ポストの記事内容と、その記事内容に準じた別のポストを結びつけたいということに他なりません。
記事の中で触れている事柄のある一部についての詳細ポストが別にあり、記事からその詳細記事にアクセスできることがひとつ。
詳細記事のほうでは、その詳細記事に関連する他の記事を一覧で表示することができることがひとつです。多対多で相互に関連し合うポストです。
ポストとポストが連携するためには、何かしら媒体によって結びつける必要があります。何かを照合して、共通するその何かを元にポストとポストを結びつけます。共通していて照合できるその何かというのは、何でしょう、何でもいいんですが理解しやすそうなのは多分カスタムフィールドです。タクソノミーでもいいと思います。
あるポストにカスタムフィールド(あるいはタクソノミーのターム)を仕込みます。本文に関係し、他のポストとユニークな共通事項がある「照合するテキスト」です。
食べ物の記事を書いていたら食材かもしれないし料理名かもしれません。映画の記事ならスタッフクレジットの人名かもしれません。不動産絡みだったら地名かもしれません。
照合するフィールドを媒体にポストとポストを結びつける
カスタムフィールドに「照合するテキスト」を仕込み、他のポストを呼び出します。照合して特定ポストを呼び出すわけですから、特定ポストを指名できるユニークな値が必要です。照合フィールドによって明確に具体的なポストを指示できるということは、カスタムフィールドであればそのポスト固有のものでなければなりませんし、それ以外だとそのものズバリのpost_titleを使用していいと思います。
カスタムフィールドを照合して連携
ポストがあって紐付くpostmetaがあって、あるkeyのvalueを照合フィールドとします。片方のポストのpostmetaではポストを識別するkeyのvalueを設定し、繋げます。繋げたい側はvalueが特定ポストを指し示すようなkeyを作成するのがポイントですね。ある記事のカスタムフィールドに「餃子」があるなら餃子専用記事には「餃子」というユニークなvalueが必要ということですね。
カスタムフィールドとタイトルを照合して連携
もう少し単純に、ポストに紐付いたvalueを、片方のポストのタイトルに照合しています。valueが「餃子」なら片方のポストタイトルを「餃子」にした場合に連携が有効になります。リレーションは単純なもので済ませられます。上の図1と何が違うかというと、こちらではポストのタイトルをカスタムフィールドに合わせてかならず「餃子」にしなければならない制約があるということです。
図はカスタムフィールドの例ですが、これをタクソノミーでやっても同じようなことです(リレーションの図は少し複雑化します)
より複雑なリレーション
通常IDで連携されているWordPressのデータベーステーブルですが、名前やvalueを照合するリレーションを別途追加することで多対多のようなことも実現できます。Wordpressのテーブルに別途リレーションを作成することなどできるわけありませんが、それをシミュレーションすることで必要なものが見えてきます。
カスタムフィールドはポストに紐付いたメタデータに過ぎませんが、タクソノミーを利用すると親子関係みたいなことが成り立ちます。より大きな分類をタームとして、細かい部分をカスタムフィールドや子タームとして設定します。これにより分類で括り直したりできますし、多対多のリレーションの真似事を作ることもできます。
私のような理系脳欠落人間には頭でこれを組み立てることが困難でしたが、FileMakerでWordPressを管理するようになってこうしたリレーションを好きに組み立てることが可能になりました。視覚化で理解しやすくなり、レイアウトの中で実際に利用することで関連項目の作成やチェックが容易いこととなりました。
WordPressのテンプレート
テンプレートではシングルのcontent.phpにいろいろ書き加えます。ポストとポストをリレーションしていますからポストのシングルページもそれなりに見栄えが変わってくるだろうと思います。片方をカスタムポストにしてしまうとか、カテゴリーで明確に分けるとか、テンプレートを別にしてしまう工夫もあったほうがいいですね。
コードの実例は汎用的に書かないと誰の役にも立たないのですが例としてちょっとあげてみます。
一例です
https://www.movieboo.org/archives/26272/elle
まず通常ポストです。例では映画の記事です。シングルポストは一本の映画です。この中でスタッフ・キャストクレジットが表示されています。この部分はカスタムフィールドです。監督、製作、脚本、出演、それぞれmeta_keyで、valueは人名です。例えば監督のところはこうです。
<?php if(post_custom('監督')): ?><dt class="credit-label">監督:</dt> <dd class="credit"> <ul> <?php $people = get_post_custom_values('監督');?> <?php foreach ( $people as $key => $person_title ) :?> <li class="credit-person"> <?php $page_data = get_page_by_title( $person_title, OBJECT, 'person' );?> <?php $p_id = $page_data -> ID; ?> <?php if(isset($p_id)):?> <a href="/archives/<?php echo $p_id; ?>" rel="bookmark"> <?php echo $person_title; ?> </a> <?php else:?> <?php echo $person_title; ?> <?php endif;?> </li> <?php endforeach; ?> </ul> </dd> <?php endif;?>
post_custom()でmeta_key監督があれば、のifでまず括ってます。単品じゃなく配列の場合があるのでループでカスタムフィールドvalueを回しながら、カスタムポストpersonのタイトルがvalueと同じものを探して、それがあればポストpersonへのリンクをIDでくっつけます。
監督と同様の記述を、製作、脚本、出演、それぞれだーっと書き綴られたテンプレートです。
片やリレーションされる側のカスタムポストpersonは人名がタイトルの簡単なシングルページです。その人名を記事中のカスタムフィールドに用いている通常ポストの一覧を返すのが主な目的です。
https://www.movieboo.org/archives/person/isabelle-huppert
関連するポストの一覧を呼び出す条件は、例ではこうしています。
<?php global $post; $cat=get_post_meta($post->ID,'alternative_name',true); //$cat = get_the_title(); $args = array(//抽出条件 'post_type' => array('post','posttype_diary'), 'numberposts' => '-1', 'order' => 'DESC', 'orderby' => 'meta_value', 'meta_key' => 'pub_year', 'meta_query' => array( 'key' => '監督', 'value' => $cat, 'compare' => '!=' ), 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' =>'people', 'field' => 'name', 'terms' => $cat, 'operator' => 'IN' ) ) ); $myposts = get_posts($args); ?>
実は通常ポストの中で、スタッフキャストクレジットのカスタムフィールド、これに一工夫付け加えて「meta_keyの分類がcreditであればtaxonomy “people”を設置する」ということをやっています。meta_keyに分類などありませんが、FileMakerを使って分類にまとめ、taxonomyと連携させています。
今はalternative_nameというカスタムフィールドを用いて上の図でいうとリレーション図1のやり方をとっています。まず大抵ポストタイトルとalternative_nameは等しいんですがごく希に例外があって、例えばトム・マッカーシーとトーマス・マッカーシーは別のvlaueですが同一人物なのでalternative_nameをどちらかに統一しているんです。トム・マッカーシーのページでもトーマス・マッカーシーのページでも、どっちも同じ一覧を得られています。
一例を挙げただけなのに細かい説明が入ってしまい恐縮です。ぜんぜん汎用的な話じゃなくなりまして、すっきりまとめる予定がまたしてもだらだらと・・
ということで、新たなループをページ内で作るとき、meta_query、tax_queryを組み合わせれば絞り込みは自由自在、細かな条件の一覧が作れます、という話でした。
FileMakerでの編集で有利なこと
さっきも書いた通り、FileMakerをMySQLサーバーに接続してWordPressをいじくってます。リレーション図でも判る通り、好きにリレーションを組み立てられるのでとても有利に事が運びます。
例えばポストタイトルをカスタムフィールドalternative_nameに転記したり、監督、脚本その他スタッフクレジットをまとめて「people」としてタクソノミー登録したり、こういうシステマチックな雑作業を自動化できます。
WordPressの編集画面でやるとただただ面倒臭いだけで更新のモチベーションもダダ下がりです。テーマカスタマイズやfunctions.phpの追加だけでやろうとすると難易度高すぎて知恵熱が出てぶっ倒れます。そんな頭の悪い私のような人間にとってはとてもいい案配に事を進められます。
WordPressで特殊なリレーションの考え方があったりタクソノミーやメタデータが複雑に入り組んでいるようなのを構築していてFileMakerをお持ちならおすすめしたい運用方法です。
シリーズ: FileMakerでWP MySQL接続
シリーズ: FileMakerでWordpress編集