サイドバーウィジェットのカスタム投稿タイプデータ?


10

(注:この質問は元々カスタムフィールドに関するものでしたが、@ MikeSchinkelはカスタム投稿タイプを含むより優れたソリューションを持っていました)

私のサイトには、サイドバーに同じデータを表示したいページがいくつかあります。たとえば、次のような構造の場合:

-Home
-Cars 
 -Volvo 850 overview 
 -Volvo 850 tech spec 
 -Volvo 850 pictures
 -Porsche 911 overview
 -Porsche 911 tech spec
 -Porsche 911 pictures
-Roads 
 -Route 66 overview 
 -Route 66 history 
 -Route 66 pictures
 -Pan-American Highway overview
 -Pan-American Highway history
 -Pan-American Highway pictures

Volvo 850のすべてのページに同じデータをサイドバーに表示し、すべてのポルシェのページに異なるデータセット(たとえば、Speed、Makerなど)を表示したいと思います。

道路ページには、道路ごとに独自のデータセットがあります。車と道路にも独自のページテンプレートがあり、右側のサイドバーを取得する方法は、sidebar.php内で次のようになります。

if ( is_page_template('car-profile-template.php') ) :
// show car widgets

次に、Volvo 850の画像ページの例を示します。同じ(左)サイドバーが他のVolvo 850ページにも表示されるはずですが、右側のものは単なるページコンテンツです。

|  Home   Cars   Roads                                |
--------------------------------------------------------
|   Overview     |     Volvo 840 Pictures              |
|   Tech Spec    |    (some pics)                      |
|  Pictures     |                                     |
------------------                                     |
| -Specs-        |                                     |
| Volvo 850      |                                     |
| Speed:150mph   |                                     |
| Maker:Volvo    |                                     |  
| Download PDF   |                                     |
------------------                                     |
| -Rating-       |                                     |
| Style:3        |                                     |
| Safety:5       |                                     |
| Reliablity:4   |                                     |
------------------                                     |

この例では、2つのサイドバーウィジェット、SpecsとRatingがカスタム投稿タイプから情報を取得する必要があります。エンドユーザーが簡単に編集できる方法はありますか?つまり、このカスタムデータを1回だけ入力する必要があります。各フィールドを個別にする必要はありません(つまり、すべてのSpecをEditorフィールド内に入力し、Ratingのすべてを抜粋フィールドに入れることができます。多分)


2
わかりやすい質問で、タイトルと質問の内容を編集してわかりやすくしていただき、本当にありがとうございます。それは将来同様の質問をする他の人を助けるでしょう。
MikeSchinkel 2010

回答:


14

更新:

質問の更新に基づいて、質問で尋ねられたことは以下の回答で実行できることを明確に述べる必要があると思います。表示したい各アイテムの「Car」カスタム投稿タイプのカスタムフィールドを使用するだけです特定の車のすべてのページ。

それを行いたい場合は、サイドバーをsingle-car.php下記のテンプレートファイルにハードコードし、ifステートメントを使用して、さまざまなURLに対して表示するコンテンツを決定します。サイドバーをウィジェット化し、ウィジェットが現在の投稿IDの情報をプルするカスタムウィジェットを開発するための努力に行くことができますが、他の人が使用するテーマとしてこれを構築しない限り、両方ともなぜですか?

実際にはこれを実現するための微妙に異なる方法がたくさんありますが、私が提案している方法は、あなたのニーズに見事に驚くべきものです。


こんにちは@cannyboy:

実際には、投稿間でカスタムフィールドを共有するための最良の方法が何であるかわかりません。しかし、それは単にあなたが必要とする危険信号かもしれません。難しいと思われる場合は...

別のアプローチ?

...あなたはそれを異なる方法で設計することを賢明に考えられるでしょうか?カスタム投稿タイプ「Car」を作成する方がはるかに良いと思います。そうすれば、各「ページ」のすべてを1つのCar投稿タイプに格納できます。ここにいくつかのサンプルURLがあります:

http://example.com/cars/volvo850/  <-- overview
http://example.com/cars/volvo850/tech-specs/
http://example.com/cars/volvo850/pictures/

カスタム投稿タイプについて学ぶ

カスタム投稿タイプの詳細については、以下の質問に対する回答をご覧ください。

カスタム投稿タイプと書き換えルール

カスタムポストタイプとあなたは、次のようなコードを使用したい複数のページを実装するために、あなたの登録「カー」カスタムポストタイプをして、あなたの車のページの書き換えルールを設定します。このコードをテーマのfunctions.phpファイルまたはプラグインのどちらか好きな方に配置します。

<?php
add_action('init','car_init');
function car_init() {
  register_post_type('car',
    array(
      'label'           => 'Cars',
      'public'          => true,
      'show_ui'         => true,
      'query_var'       => 'car',
      'rewrite'         => array('slug' => 'cars'),
      'hierarchical'    => true,
      //'supports'        => array('title','editor','custom-fields'),
    )
  );
  global $wp,$wp_rewrite;
  $wp->add_query_var('car-page');
  $wp_rewrite->add_rule('cars/([^/]+)/(tech-specs|pictures)','index.php?car=$matches[1]&car-page=$matches[2]', 'top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

A 固有のテーマテンプレートファイル

次に、テーマに固有のテンプレートファイル必要になります。これのデフォルト名はになりますsingle-car.phpifステートメントを使用してレンダリングするコンテンツを決定することにより、3つのURL((overview)「tech-specs」、および「pictures」)をすべてレンダリングするスターターテンプレートをコーディングしました。

<?php get_header(); ?>
<div id="container">
  <div id="content">
  <?php if ( have_posts() ): the_post(); ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <h1 class="entry-title"><?php the_title(); ?></h1>
    <div class="entry-content">
<?php if(is_car_techspecs()): ?>
  <a href="..">Back</a>
  <h1>Tech Specs</h1>
  The tech specs go here!
  <?php get_post_meta($post->ID,'_car_tech_specs'); ?>
<?php elseif (is_car_pictures()): ?>
  <a href="..">Back</a>
  <h1>Pictures</h1>
  Car Pictures go here!
  <?php get_post_meta($post->ID,'_car_pictures'); ?>
<?php else: ?>
  <ul>
    <h1>Overview</h1>
    <li><a href="tech-specs/">Tech Specs</a></li>
    <li><a href="pictures/">Pictures</a></li>
  </ul>
  <?php the_content(); ?>
<?php endif; ?>
      <?php the_content(); ?>
    </div>
  <?php endif; ?>
  </div>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

上記の例では、を使用して非常に単純化していることに注意してくださいget_post_meta()。実際のサイトでは、もっと複雑にする必要があります。

テンプレートタグ別名ヘルパー関数

もちろん、ifステートメント条件でテンプレートファイルの複雑さを最小限に抑えるために、ヘルパー関数とも呼ばれるいくつかのテンプレートタグを使用しました。ここにあり、テーマのfunctions.phpファイルにもこれらを入れることができます:

function is_car_techspecs() {
  global $wp_query;
  return is_car_page('tech-specs');
}
function is_car_pictures() {
  global $wp_query;
  return is_car_page('pictures');
}

function is_car_page($page) {
  global $wp_query;
  return (isset($wp_query->query['car-page']) && $wp_query->query['car-page']==$page);
}

カスタム投稿タイプの愛で満たされたスクリーンショット

すべてのコードを配置し、Volvo 850のようなCarの投稿を追加したら、次のスクリーンショットのように機能させることができます。

概要ページ

http://example.com/cars/volvo850/
(ソース:mikeschinkel.com

技術仕様ページ

http://example.com/cars/volvo850/tech-specs/

写真ページ

http://example.com/cars/volvo850/pictures/


1
非常に素晴らしい。技術仕様などの情報が動的になるように、どのように設定しますか(例のようにハードコーディングするのではなく)?
Travis Northcutt 2010

1
それはトリッキーな質問なので、私はあなたのユースケースを理解する必要がありますか、それが単なる抽象的な仮説であるかどうか?可能な一致の有限リストを知っているので、これを行うことができます。「すべてに一致」した場合、WordPressの他の一致パターンが上書きされます。具体的な例を挙げれば、解決策を示します。それ以外の場合は、ワームの缶です。
MikeSchinkel 2010

あなたの素晴らしい答えをありがとう。これまでカスタム投稿タイプを掘り下げたことがなく、それらは理想的なソリューションのようです。主にサイドバー/ウィジェットを使用するために、いくつかの詳細を追加して質問を更新しました
cannyboy

@mike単なる仮説。詳しく説明します-(たとえば)技術仕様ページの情報が管理ダッシュボードのどこかに入力されるように設定するにはどうすればよいでしょうか(カスタム投稿タイプ、おそらく、分類法を使用して車を設定しますか?)、テンプレートファイルではありません。
Travis Northcutt 2010

@tnorthcutt-「技術仕様ページの情報」と言ったとき、「サブページのリスト?」または、カスタムフィールドを意味しますか?後者の場合、情報はカスタムフィールドに格納されると想定しました。私の例ではそれは示されませんでした。多分それがあるべきですか?
MikeSchinkel 2010

1

あなたが投稿した他の質問(親ページ/中間ページについて)ですでに誰かがこれにある程度回答している可能性があると思いますが、あなたが説明した内容に基づいて、データを構造化する最良の方法は次のとおりです。

 - Home
 - Volvo 850 (overview)
   - Volvo 850 tech spec
   - Volvo 850 pictures
 - Porsche 911 (overview)
   - Porsche 911 tech spec
   - Porsche 911 pictures

こうすれば、メタページに1度入力するだけで(親ページで)、子ページでそのメタデータを親からプルできます。

<?php echo 'Top speed: '.get_post_meta($post->post_parent,'Top Speed',true); ?>

もちろん、これを整理するさらに良い方法は、車のすべての情報を格納する車のモデルごとに1つのカスタム投稿タイプを用意し、ページに渡されて使用されるGETリクエストに基づいてさまざまなサブページを表示することです。表示するテンプレートを決定するスイッチとしてのページテンプレート。そうすれば、データの重複を完全に回避し、後でテンプレートに情報を追加しやすくすることができます...

詳細...

私はそれをいくつかの異なる方法で行いました。カスタム投稿タイプとしてエージェント(会社の担当者)がいたサイトでは、その投稿を使用してその人物に関連するすべてのデータを保存しましたが、実際にそのページを表示することはありませんでした。代わりに、「エージェント一覧」ページ、「エージェントパフォーマンスレコード」ページ、「このエージェントへのお問い合わせ」ページがありました。これらのページは常にGET変数で呼び出され、適切な投稿から情報を表示していました。したがって、パーマリンクはsite.com/agent-listing/?agent=john-smithのようになります。

別のサイトでは、1つのページにすべての情報を設定し、そのページの3つのビューすべてをページテンプレートに組み込みました。あなたの場合、それはsite.com/cars/volvo-850/?picturesのようになります。

そして、ページテンプレートで、コンテンツの上部近くにその変数のチェックを含めます。

if ($_GET['pictures']) {

 // template for pictures page

} else if ($_GET['tech-spec']) {

 // template for tech specs page 

} else {

 // overview template

}

どうもありがとう!あなたの最後の提案について、私はこれらすべてのカスタムフィールドを持つ空白ページ(おそらく「Volvo 850 Widget Data」と呼ばれる)を作成し、他のVolvo 850ページはこのデータを(どういうわけか)自動的に取得することを意味しますか?(つまり、[外観]> [メニュー]で手動でメニューを作成する必要がありますが、とにかくこれを行っています)...または、概要ページのカスタムフィールドからデータを取得できます...
cannyboy

私はそれを両方の方法で行いました。上記の私の回答を編集して説明しました。最終的に何をするかは、あなたが言ったように、メニュー作成をどの程度自動化したいかに大きく依存します。
goldenapples

おっとっと。私はさらに読み進めて、マイクが私が言っていることを正確にすでに答えたことに気づきました。
goldenapples

0

カスタム投稿タイプを作成せず、各ページまたは投稿にカスタムサイドバーを含めるだけの場合は、Graceful Sidebar Pluginを使用できます。これにより、グレースフルタイトルとグレースフルコンテンツと呼ばれる追加フィールドを使用して、投稿またはページ編集画面から直接カスタムサイドバーコンテンツを作成できます。これらは、この投稿またはページがブログに表示されているときにウィジェットとしてサイドバー領域に表示されます。このプラグインの詳細については、http://www.mlynn.org/graceful-sidebar-pluginを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.