web-dev-qa-db-ja.com

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

(注:この質問はもともとカスタムフィールドに関するものでしたが、@ 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ページに同じデータをサイドバーに表示させ、すべてのPorscheページに異なるデータセットを表示させたい(たとえばSpeed、Makerなど)。

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

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

これがサンプルのページ、Volvo 850 Picturesページです。同じ(左側の)サイドバーは他の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がカスタム投稿タイプから情報を取得しているはずです。エンドユーザーが簡単に編集できる方法はありますか。つまり、このカスタムデータを一度だけ入力すればよいということです。各フィールドを別々にする必要はないかもしれません(つまり、SpecのすべてをEditorフィールド内に入力し、Ratingのすべてを抜粋フィールドに入れることができます。多分)

10
cannyboy

更新:

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

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

実際には、これを達成するための微妙に異なる方法がたくさんありますが、私が提案している方法は、あなたのニーズに対して素晴らしく不思議に思うべきです。


こんにちは@cannyboy:

実際、投稿間でカスタムフィールドを共有する最善の方法はわかりません。しかし、それは単にあなたが必要とする赤い旗かもしれません。多分何かが難しいように思えたら...

別のアプローチ?

...あなたは異なる方法で建築することができます "Car" カスタム投稿タイプを作成すると、各のすべてを保存できるようになると思います」ページ」を1つの車の投稿タイプに追加します。サンプルURLを次に示します。

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

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

次の質問に対する回答で、カスタム投稿タイプの詳細をご覧いただけます。

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

カスタム投稿タイプと複数のページを実装するには、次のようなコードを使用します。 "Car" カスタム投稿タイプを登録し、を設定します車のページのルールを書き換えます。このコードをテーマの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
}

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

次に、テーマに Car -specificテンプレートファイルが必要です;これのデフォルト名はsingle-car.phpです。 3つのURLすべてをレンダリングするスターターテンプレートをコーディングしました((overview) 'tech-specs' if ステートメントを使用してレンダリングするコンテンツを決定することにより、1つのテンプレートで '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()を使用して非常に単純化していることに注意してください。実際のサイトでは、もっと複雑にする必要があります。

テンプレートタグa.k.a.ヘルパー関数

もちろん、 if ステートメント条件のテンプレートファイルの複雑さを最小限に抑えるために、いくつかのテンプレートタグa.k.a.ヘルパー関数を使用しました。ここにあり、テーマの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);
}

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

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

概要ページ

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

技術仕様ページ

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

写真ページ

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

14
MikeSchinkel

あなたが投稿した他の質問(親ページ/中間ページについて)ですでに誰かがこれに答えているかもしれませんが、あなたのデータを構造化するための最善の方法はあなたが説明したことに基づいています。

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

そのようにして、あなたはメタフィールドを一度だけ - 親ページで - そして子供のページで入力する必要があります。あなたは親からそのメタデータを引き出すことができます:

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

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

詳細...

私はそれをいくつかの異なる方法でやった。カスタム投稿タイプとしてエージェント(会社の担当者)がいるあるサイトでは、その投稿に基づいてその人物に関連するすべてのデータを保存しましたが、実際にはそのページを表示しませんでした。その代わりに、「エージェントのリスト」ページ、「エージェントのパフォーマンス記録」ページ、および「Contact This Agent」ページがありました。これらは常に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

}
1
goldenapples

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

0
Michael Lynn