web-dev-qa-db-ja.com

カスタム投稿タイプでis_home()およびis_single()が正常に機能しない

モデレーター向けメモ: 当初の名称:"カスタム投稿タイプの問題?"

私はサイドバーを除いてすべてがうまく機能しているカスタム投稿タイプでいくつかの問題を抱えています。

これが私のsidebar.phpのコードです。

<?php
  if (is_home()) {
    dynamic_sidebar('frontpage-sidebar');
  }
  if (is_single()) {
    dynamic_sidebar('single-post-sidebar');
  }
  ....
?>

'frontpage-sidebar'が代わりに読み込まれるので、'single-post-sidebar'が読み込まれていないことを確認するために単一のページを開いたときを除いて、これは通常うまくいきます。問題はどこだ?

これが私のカスタム投稿タイプのコードです。

$labels = array(
  'name' => _x('Tools', 'post type general name'),
  'singular_name' => _x('Tool', 'post type singular name'),
  'add_new' => _x('Add New', 'Tool'),
  'add_new_item' => __('Add New Tool'),
  'edit_item' => __('Edit Tool'),
  'new_item' => __('New Tool'),
  'view_item' => __('View Tool'),
  'search_items' => __('Search Tools'),
  'not_found' => __('No Tools found'),
  'not_found_in_trash' => __('No Tools found in Trash'),
  'parent_item_colon' => ''
);
$args = array(
  'labels' => $labels,
  'public' => true,
  'publicly_queryable' => true,
  'show_ui' => true,
  'query_var' => true,
  'rewrite' => true,
  'capability_type' => 'post',
  'hierarchical' => false,
  'menu_position' => 2,
  'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments','page-attributes') // 'not sure that post can have page-attributes ????'
);
register_post_type('tools', $args);

通常の投稿の代わりにカスタム投稿タイプを使用しているときに、さまざまなページにさまざまなサイドバーを読み込む方法を教えてください。

ありがとう。

4
user1147

あなたの質問を正しく理解しているなら、URLを表示しているときにis_home()falseである理由を尋ねています/tools/example-tool/?あなたの質問を理解すると、答えは単純に、is_home()はtrueカスタム投稿タイプではないということです。

実際には、is_home()trueであってはなりません。ただし、1。)投稿のホームページリストにあるとき、または2.) "static page"「投稿ページ」、管理者のSettings> Readingセクション(私のスクリーンショットでは、「投稿ページ」が「ページ」に設定-post_type=='page'-タイトルが「ホーム」):

Setting a Home Page in WordPress 3.0's Admin Console
(ソース: mikeschinkel.com

したがって、サイドバーを表示する場合は、is_home()とは異なる基準を使用する必要があると思います。このコードを達成しようとしていたことを言葉で説明できますか?

更新

以下のコメントと 後の研究 に基づいて、問題がよく理解された後適切なis_home()およびis_single()の値は、カスタム投稿タイプに対して実際に定義されることはありませんでした。したがって、問題に対するより良い解決策の1つは、投稿タイプ固有のテーマテンプレートページ、つまり投稿タイプがtoolsの場合はsingle-tools.phpを作成し、その投稿タイプ専用のサイドバーを定義することです。 しかし、すべてを1つのsingle.php経由でルーティングする必要がある場合は、is_home()is_single()の代わりに使用して期待どおりの結果を得ることができる関数を次に示します。結果をテーマのfunctions.phpファイル(またはプラグインのファイルの1つ)に保存できます:

function is_only_home() {
  $post_type = get_query_var('post_type');
  return is_home() && empty($post_type);
}

function is_any_single() {
  $post_type = get_query_var('post_type');
  return is_single() || !empty($post_type);
}

上記の最初のコード例を取り上げ、これらの関数を適用すると、次のようになります。

<?php
  if (is_only_home()) {
    dynamic_sidebar('frontpage-sidebar');
  }
  if (is_any_single()) {
    dynamic_sidebar('single-post-sidebar');
  }
  ....
?>
7
MikeSchinkel

使用したい関数: is_singular($post_types) ここで$post_typesは文字列/カスタム投稿タイプの配列です。単数ページが表示されている場合、この関数はtrueを返します。

4
user10757