カスタム投稿とカスタムタクソノミーと一覧表示:メモ

カスタムポストタイプを使って
カスタムポストタイプを使って

かなり時間がかかったので、主に自分のためのメモ書き。

なお、Wordpressは最近触っていますが自分で一からにコードを書ける訳ではないですし、基本的には情報を探して使えそうなものをつっこみ動かないとカスタマイズということがほとんど。

今回も力技で無理矢理表示させたようなものなので、もっと良い方法が見つかればこの記事の方法はお蔵入りかもしれませんが。

とはいえこの記事に書いた内容で動いているのも間違いないので、何らかのお役に立つ事があるかもしれないと淡い希望を込めています。

自分で情報収集をした際になかなかズバリのキーワードがわからず情報を見つけてもうまくいかなかったため、過去の自分でも解決のヒントになる情報を書き残す意図もあります。

[2015.4.7追記]
「サイドバーのウィジェットにタームの一覧を表示」の項目末尾に追記有り。

前提

実現したかった事を箇条書きにします。

  • カスタム投稿を使用
  • カスタムタクソノミーを使用
  • カスタムフィールドを使用
  • カスタムタクソノミーでカスタム投稿タイプに複数のタームを付与
  • タームごとの一覧を表示
  • カスタムフィールドの値でタームの一覧をソート

だいたいこんな感じです。ちなみにターム(term)とはタクソノミーに設定する項目の事です。

以下は使用したプラグインです。カスタム投稿のカスタムフィールドを管理画面から変更や追加できるようにとプラグインでの実装です。

カスタムタクソノミーのタームの一覧表示にはtaxonomy.phpを利用しました。

カスタム投稿とカスタムタクソノミーの設定

Custom Post Type UI
Custom Post Type UI

カスタム投稿とカスタムタクソノミーを設定するためにプラグインの「Custom Post Type UI」をインストールして有効化。

管理画面の「add New」から必要な分を設定するだけ完了です。なお、入力時に他のスラッグとかぶらないように注意が必要です。あとあと不具合の原因としてでてくる可能性が高いので。

カスタムフィールドの設定

Custom Field Template
Custom Field Template

カスタムフィールド設定するために「Custom Field Template」をインストールして有効化。

こちらも必要な項目を作成していきます。
なお、「[cft] and [cftsearch] Shortcode Format」の部分にHTMLタグで表示方法を設定しておけばショートコードとして使えるので便利です。
カスタムフィールドの値は「[キー名]」の形でも使えますし、「PHPを使用する」にチェックをいれればecho post_custom('キー名');でも動作します。キー名はもちろん日本語でもかまいません。

カスタム投稿に設定したカスタムタクソノミーの中の特定タームが設定された記事の一覧表示

準備ができたので、最初にカスタム投稿に設定したカスタムタクソノミーの中の特定のタームの一覧表示方法を探しました。この書き方で説明できているかあまり自信がありませんが…。

具体例を示した方が書き易いため、まずは設定を。

なお、作りとしてはサイドバーにタームの一覧を表示してリンクを設定し、そのリンク先に特定のタームを付けた記事の一覧を表示させます。

設定例

カスタムポストタイプの一覧
カスタムポストタイプの一覧

さて、今回実現したいのは「カスタム投稿に設定したカスタムタクソノミーの中の特定のタームの一覧で表示」することです。
抽象的なままだとイメージし難いので、具体例を設定してみます。

  • 商品はパンでカスタム投稿を設定(スラッグ:pan)
  • カスタムタクソノミーで材料を設定(スラッグ:material)
  • カスタム投稿にはカスタムフィールドとして価格を設定(キー名:価格)
  • カスタムタクソノミーで作成した材料にタームを設定(スラッグ例:lysdor)

カスタム投稿の「パン」で商品を登録し、カスタムフィールドで「価格」を入力。そしてカスタムタクソノミーの「材料」のタームでパンに使われた小麦粉の種類などを選択という感じです。ちなみに、スラッグの「lysdor」は「リスドォル」という種類の小麦粉でフランスパンに使われます。

さて、繰り返しになりますが上記の具体例で求める表示をあらわすと以下のようになります。

  • 特定の材料をつかった商品の一覧を価格の高い順に表示

では、上記を実現するためにtaxonomy.phpにループを書きます。

taxonomy.php内でのループ作成

かなりの時間をかけて情報をさがしつつ試行錯誤しましたが、経路を書ききれない上に記憶もあやふやなので最終的なコードを記述します。


<?php query_posts( 'post_type=>カスタム投稿&meta_key=並び替えるキー名&orderby=meta_value_num&order=DESC&カスタムタクソノミー=表示したいターム&posts_per_page=表示件数&paged='.$paged );> 
//内容
<?php endwhile; >

上記の書き方では分かりづらいので、前述の例を使います。
「リスドールを使ったパンを価格の高い順に並べ替えて10件表示」


<?php query_posts( 'post_type=>pan&meta_key=価格&orderby=meta_value_num&order=DESC&material=lysdor&posts_per_page=10&paged='.$paged );>
//内容
<?php endwhile; ?>

これで表示されるはずです。以下には簡単な説明を。

解説


post_type=>pan

上記の設定でカスタム投稿として作ったパンの記事を対象に選択しています。


meta_key=価格

並べ替えに用いる基準をカスタムフィールの価格に設定しています。


orderby=meta_value_num&order=DESC

降順(値の大きい方から並べる)に並び替えるための指示です。order=DESCorder=ASCにすれば昇順(値の小さい方から並べる)になります。

なお、meta_value_numを使えば対象を文字列ではなく数値で並び替える事が可能です。仮にmeta_valueを使い昇順に並べると以下の様な並び順に。

  • 「1/2/3/12/14」だと「1/12/14/2/3」とならぶ

ちなみに、meta_value_numの挙動には以下のような特徴がある様です。

  • 「1/10/100/1,000」だと「1/1,000/10/100」とならぶ

金額の単位を分けるカンマを使うと意図した並べ方になりません。この辺りうまくできる書き方があるはずなのですが、分かりませんでした。


material=lysdor

パンのなかでも素材(material)としてリスドォル(lysdor)を使ったパンを選択しています。


posts_per_page=10

表示件数を10件にしています。


paged='.$paged

taxonomy.phpでページ送りを付けるための必須の設定です。これが無いと次を表示しようにも基準となるページが認識できないそうです。
ちなみに、シングルクオートが最後までくくっていませんがこれが正しい形です。

pagedの補足

ここだけ見ていると分かりにくいのですが、全体を見ればとても単純なことです。

query_posts( 'post_type=>pan&meta_key=価格&orderby=meta_value_num&order=DESC&material=lysdor&posts_per_page=10&paged='.$paged )

上記の中括弧で囲まれた部分はquery_post()に渡す配列です。
渡す値が文字列だけ出よい場合は、例えば以下のようになります。

query_posts( 'post_type=>pan&meta_key=価格&orderby=meta_value_num&order=DESC&material=lysdor&posts_per_page=10&paged=-1')

ただ、このpagedの指定部分に変数を用いてるためにシングルクオートを途中で閉じて、「.(ピリオド)」で変数を結合している状態、というのが実態です。

なお、pagedはページ送りでは重要な要素なので、以下のコーデックスの参照をお勧めします。

php等を使える方には当然でも、WordPressを弄りはじめた程度ではこういった基本的な所を間違う事もありますので、注意も必要かと。

補足

上記のコードに辿りつくまでにいろいろな情報を見ましたがどれもうまくいきませんでした。

失敗の症状としては、どのタームを選んでも全てのタームの商品が表示される状態です。他には全く表示がされなかったり。

ループを書き込むテンプレートやループを開始するためのwp-querypost-pueryなどの選択が間違っていたのだと思います。

最終的には以下の記事を参考させていただきました。この記事が無ければ表示ができなかったかもしれません…。

サイドバーのウィジェットにタームの一覧を表示

最後に、サイドバーのウィジェットにタームの一覧を表示します。考え方としては特定のカスタムタクソノミーに作ったタームを一覧で表示するという形でしょうか。


<ul>
<?php wp_list_categories(array('title_li' => '', 'taxonomy' => 'タクソノミーのスラッグ', 'hide_empty' => 0, 'orderby' => 'menu_order')); ?>
</ul>

以下に簡単な解説を。


'hide_empty' => 0

投稿数が0件のタームも表示させるように'hide_empty' => 0を設定しています。


'orderby' => 'menu_order'

並べ替えのために「Term Menu Order」を使います。事前にタームの管理画面で「Order」に数字を入れておき上記のコードを追加する事で並べ替えが可能です。
なお、ウィジェットでphpを動作させるために「Exec-PHP」もインストールしておきます。

[2015.4.7追記]
当時は「Exec-PHP」を使っていましたが、現状ではお勧めできません。
今作るとしたら、ループの部分だけを書いた専用のphpファイルを用意するか、直接functions.phpに関数を書き、functions.phpでそのファイルの読み込み用ショートコードを登録し、ウィジェットでショートコードが使えるようにして用いると思います。

結び

カスタムフィールドの設定ができていざ表示、の段になるとうまくいかずに時間がかかりました。

「カスタム投稿 並び替え」などで調べると結構な数の情報がでてくるのですがどれもうまくいかず。自分でちょろちょろ修正してもうまくいかず。
基本的な所や些細な所が問題となっているはずですが、そういう所ほど原因を突き止めるのが難しく対処に困る場合は往々にしてありえます。

今回は恐らく正規の方法でないのでしょう。なんとかうまくいきましたがいつもそうとは限りません。力技にせよ何にせよ、複数方法をもって対処に望む事が大切なのだと思います。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄