web-dev-qa-db-ja.com

カスタム投稿タイプで階層を処理する方法

私は数日間WordPressに移行しましたが、利用可能なすべての機能、プラグイン、洗練されたテーマに非常に感銘を受けました。私はテーマとカスタムタイプについてのドキュメントを読むのにかなりの時間を費やしました。これまでのところ非常に優れています...実際のことをやろうとしているので、WPにはいくつかの制限があるようです(しかし、何かが足りないかもしれません)。

私は古典的なISVサイトを思い付きたいのです。典型的な階層は次のようになります。

  • 製品情報
  • - 商品A
  • ----概要
  • ----リリース履歴
  • -------リリース1.5
  • -------リリース1.4
  • -------リリース1.3
  • -------など.
  • - - 特徴
  • ----など.
  • - 商品B
  • ----概要
  • リスト項目
  • 等...

リリース履歴に焦点を当てて、私は思いついた:

  • カスタムコンテンツタイプ: "release".
  • 特定の「リリース」に関連付けられている製品を指定するためのカスタム分類法。
  • "リリース"のリストを表示するためのテンプレートを作成しました。
  • リリースの詳細を表示するためにsingle-release.phpを作成しました。
  • 私のテンプレートに基づいてページを作成しました。

「リリース」のリストを表示するページのURLは基本的に階層構造に適合します(/ products/product-a/release-history /)。ただし、カスタム投稿タイプのURLは次のようになります。/%post_type%/%post_slug%/(例:/ release/version 1.2 /

首尾一貫したURLスキームを使用するための解決策を探そうと2日間苦労しています。

私はCustom post permalinksプラグインを使って製品を表す私のカスタム分類法を含むURLを作り出そうとしました(それが完璧でなくても何もないよりはましですが)、何らかの理由でプラグインは私の側では動かない。

全体的に、私が何かを逃していない限り、カスタム投稿タイプは素晴らしいですが、あなたが平らな構造を持っていなければかなりの悪夢です。 URLに依存しないカスタムコンテンツタイプの概念、またはページ階層の任意のレベルでカスタム投稿タイプをプラグインする簡単な方法をお勧めします。

とは言っても、私はその点を完全に見逃しているかもしれません。このような階層を持つサイトを設定するときに、何かアイデアや経験がある人はいますか?どうぞよろしくお願いします...

[更新]

ここで更新するときの慣例が完全にはわからないが、わかりやすくするために最初のテキストはそのままにしておく。このアップデートの目的は、詳細を明確にして追加することです。

商品
WPページ「Products」を作成しました - 親なし - URL:http:/// products /

製品A(特定の製品)
WPページ 'Product A'を作成しました - 親: 'Products' - URL:http:/// products/product-a /

概要
WPページ 'Overview' - 親: 'Product A'を作成しました - URL:http:/// products/product-a/overview /

リリース(特定の製品のリリースのリスト)
WPページ 'What's New'を作成しました - 利用可能なすべてのリリースのリストを表示するテンプレートを適用しました(各リリースにはその特定のリリースの詳細を表示するリンクがあります)。製品A ' - URL:http:///製品/製品a /製品リリース/。
リリースはカスタムタイプを使って実装されています(下記参照)。したがって、テンプレートを実装し、パーマリンクをリリースするためのリンクを作成するのは非常に簡単でした。まだ実装していませんが、テンプレートはページレベルで定義された分類法(product-id)に基づいて任意の製品のリリースリストを表示するという考えでした。したがって、この他のページに適切な 'product-id'分類法を添付することで、他の製品のリリースを表示するのと同じテンプレートを使用する別のページを作成できます。

リリース(リリースの詳細)
リリースはカスタム投稿タイプを使用して実装されます(「商品リリース」と呼びましょう)。さらに、各リリースを特定の製品に添付するためにカスタム分類法(product-id)を使用しています(明らかに、他の製品に関連するリリース用に別のカスタム投稿タイプを作成したくない)。
特定のリリースを表示するための 'single-product-release.php'ファイルを作成しました。このアプローチの問題は、特定のリリースが次のURLで表示されることです。http://<root>/product-releases/release-xx

  • それはそれほど説明的ではない、少なくとも私たちが言うことができる(私は少なくともURLで何らかの商品識別子を得るべきである)
  • それは多少階層を壊します(けれどもそれが間違っているかどうかに関して確かに論じることができますが)

私の選択(私がWordPressの初心者として見ることができる限り)

パーマリンクを取り除く
いくつかのテンプレートを使用し、URLにいくつかの引数を渡して、リリースの詳細を表示することもできます。このテンプレートは、階層内の目的の場所に正確に移動できるページで使用できます。
私が従うアプローチではないことは明らかです...ここでは詳しく説明しませんが、多くの理由から(これは既に長い投稿/質問です)。

カスタム投稿タイプのパーマリンクに私の 'product-id'の値を追加する(あるいはプレフィックスを付ける)方法を見つける
http:/// product-a/product-release/release-xのようなものがあります。私は、そのリリースは、http:/// products/product-a/product-release/release-xのような「自然な」階層の外側にあることを受け入れなければなりません。
/products /%product-id%/%product-release%/のように、「製品」という接頭辞を付けることで、さらに進むことができます。しかし、私はこの書き換えルールが 'products'ページの下に作成された 'pages'と衝突しないのではないかと思っています...

任意の入力をいただければ幸いです。

[更新]

私はボブディアによって提案されたアプローチを実行しました。これは私のコンテンツタイプではうまく動作しますが、階層内で混在しているWPページと衝突するでしょう。 bobdiaesのコードを使用して、私は自分の製品リリースのカスタム投稿タイプについて次のPermalingを考え出しました。
/products/%product-id%/product-releases/%product-release%
そのため、特定の製品のリリースの詳細を表示するための適切な製品URLがあります。例:/products/my-great-product/product-releases/release-1-5/

しかし、私はいくつかのWPページをミックスに入れたいと思います。

  • /products/my-great-product/は製品の概要を提供するべきです。
  • /products/my-great-product/product-releases/は、リリースのリストと最新のリリースの詳細を表示します。

最初は、WPページを作成して必要なことを実行するのは非常に自然なことです。ページが正確なURLスキームに収まるように、ページ階層を整理します。しかし、このアプローチは「製品リリース」のカスタムコンテンツタイプに使用されているURLの書き換えと衝突するため、ページを閲覧することはできません(404)。

まあ、まあ、まあ….

だから今私のオプションは何ですか

WP を使うという考えを諦めなさい
さて、私はもう少し主張するつもりだと思います。この問題以外にも、WPには好きなことがたくさんあります。

ポッドCMSを使用
まだテストしていませんが。それはいいフレームワーク/ツールのように聞こえます。ただし、WPMLを使用して自分のコンテンツを簡単に翻訳する機能を失うことになります。
バージョン2.0の独自のテーブルではなくカスタムの投稿タイプを使用できるようになるという事実により、翻訳目的で現在のプラグインに頼ることが確実にできます。彼らがバージョン2.0に向けて準備しているのは面白いね。彼らは彼ら自身のテーブルの代わりにカスタム投稿タイプを使うことができるでしょう。
Pod CMS 2.0は 解決策 になります。

'product-release "の代わりにWPページを使用するカスタム投稿タイプ
ここでの考え方は、製品リリースごとに(親として製品リリースページを使用して)ページを作成することです。リリースのリストを表示するために子ページをループするのは簡単なはずです。
明らかに、それはかなりいくつかの欠点を持っています。

  • 現在の管理者ページのインターフェースは、数百ページを処理するのにはあまり実用的ではないかもしれません...
  • ページはすでに(私が理解している限りでは)特殊なカスタム投稿タイプであるため、すべてのフィールドを作成する場合を除き、擬似コンテンツタイプのようにページを使用するたびに必要な特定のカスタムフィールドを覚えておく必要があります。 Webサイト全体で必要とされている。あなたが私に尋ねるならばかなり恐ろしい解決策。

WPページをカスタム投稿タイプに置き換える
書き換えルールが衝突する可能性については確信が持てませんが、ここにその考え方があります。概要ページを表示する代わりに、「製品概要」のカスタム投稿タイプを作成し、「製品リリース」のカスタム投稿タイプと同じ方法でパーマリンクの書き換え規則を使用できます。私の調査結果で更新されます。

私はこのWordPress URL地獄に直面しているのは私だけではないと確信しています。カスタム投稿タイプへの「投稿」の一般化はかなり賢いことを私は認めなければなりませんが、パーマリンクのものには独自の制約があります。

警告の言葉 - WPの新機能で、私は完全に明白な何かを見落としているかもしれません

[更新]

まあ、それが可能な限りイライラするように、これはちょうど不可能であるように思えます。確かに、いくつかのトリッキーなURLの書き換えを伴う解決策は確かにありますが、確かに一般的であるアプローチに対して決して些細なことはありません。
基本的に、私はこの段階で、かなり単純なURLスキームに結びつくべきだと思います。ワードプレスのフォーラムを試してみますが、私はあまり希望がありません。

5
Frederic L

もっと複雑なWordpressサイトを計画するとき、私はデフォルトの WordPressデータベーススキーマ の観点からページ/ URL階層を考えるようにします。次に、最善の URL rewrite スキームとデータ構造を決定します。非常に一般的に、ユーザーにとって最も重要なデータオブジェクトはカスタム投稿タイプまたは投稿オブジェクトとして存在し、カスタム投稿間の関係はカスタム分類法を使用し、一意の値はpostmetaに格納されるべきです。

より具体的には 、バージョンを更新する商品を提供している場合は、商品ごとにカスタム投稿タイプを作成し(バージョンが更新される商品の合計数が限られている場合) WPはデフォルトで投稿を年代順に保存するので、複数のリリースでうまくいくはずです。つまり、新しい各リリースはカスタム投稿タイプの下の単一の投稿として存在し、新しい各投稿にはそのリリースの詳細が含まれます。その後、カスタム投稿タイプのページに最新の投稿の詳細を表示できます。各投稿を強制的にページ区切りにすることで、featuresなどのために別々のURLを持つこともできるはずですし、URLを書き換えることでそれらをきれいにすることができるはずです。

視覚的に

/products/%custom-post-type%/
/products/product-a/

/products/%custom-post-type%/archive/
/products/product-a/releases/

/products/%custom-post-type%/%post-name%/
/products/product-a/release-xx/

/products/%custom-post-type%/%post-name%/page/2/
/products/product-a/release-xx/features/
3
joelhaus

Get_permalink()関数をフックする必要があると思います。私が私のカスタム投稿タイプのメモに保存したこの記事は役に立つかもしれません: http://shibashake.com/wordpress-theme/add-custom-taxonomy-tags-to-your-wordpress-permalinks

0
bobdiaes