いくつかのカスタム投稿タイプ(CPT)に固有のタグアーカイブページ(またはテンプレート)を作成したいです。
ちなみにPHPやWordpressには少し慣れていません。
私の環境では、CPTのportfolio
とカスタム分類法のportfolio_category
があります。
すべての投稿タイプの中から特定のタグを持つ投稿を表示するテンプレートtag.php
を使用して、デフォルトのタグアーカイブページを作成できます。これが私のfunctions.php
に対するものです。
add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
if( is_category() || is_tag() ) {
$post_type = get_query_var('post_type');
if($post_type)
$post_type = $post_type;
else
$post_type = array('post','portfolio','nav_menu_item');
$query->set('post_type',$post_type);
return $query;
}
}
私がやりたいこと:
たとえば、CPT(photo
)の単一ページでユーザーがタグportfolio
をクリックしたときに、すべての投稿タイプからではなく、CPT(portfolio
)からの投稿のみを表示するページ(またはテンプレート)を表示します。
私はtag.php
でちょっと遊んだだけですが、今のところ運がありません...
これは私がうまくいくと思ったものですが、そうではありません...
<?php
$tag = get_query_var('tag');
$args = array(
'post_type' => 'portfolio',
'post_status' => 'publish',
'posts_per_page' => 3,
'caller_ get_ posts' => -1, // remove sticky post
'paged' => $paged,
'tag' => $tag
);
$my_query = null;
$my_query = new WP_Query($args);
if( $my_query->have_posts() ) :
if ( $my_query->have_posts() ) while ( $my_query->have_posts() ) : $my_query->the_post();
?>
<a href="<?php echo get_permalink(get_the_ID()); ?>"><?php the_title(); ?></a>
<?php endwhile; // end of the loop.
endif;
wp_reset_query();
?>
これで、すべての投稿タイプのすべての投稿が表示されます。
誰かが私のやり方を手伝ってくれる?
この質問が重複する場合は、教えてください。
ありがとう。
私のCPTと分類法:
// CPT for portfolio
add_action('init', 'regist_cpt');
function regist_cpt() {
register_post_type('portfolio', array(
'label' => 'Portfolio',
'description' => 'My portfolio',
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'post',
'map_meta_cap' => true,
'hierarchical' => true,
'taxonomies' => array('post_tag'),
'rewrite' => array('slug' => 'portfolio', 'with_front' => 1),
'query_var' => true,
'has_archive' => true,
'menu_position' => '5',
'supports' => array('title','editor','excerpt','trackbacks','custom-fields','comments','revisions','thumbnail','author','page-attributes','post-formats'),
'labels' => array (
'name' => 'Portfolio list',
'singular_name' => 'Portfolio',
'menu_name' => 'Portfolio',
'add_new' => 'Add new',
'add_new_item' => 'Add new item',
'edit' => 'Edit',
'edit_item' => 'Edit item',
'new_item' => 'New item',
'view' => 'View',
'view_item' => 'View item',
'search_items' => 'Search item',
'not_found' => 'Not found...',
'not_found_in_trash' => 'Not found in trash',
'parent' => 'Parent',
)
));
}
// Custom Taxo for portfolio
add_action('init', 'regist_tax');
function regist_tax() {
register_taxonomy(
'portfolio_category',
'portfolio',
array( 'hierarchical' => true,
'label' => 'Portfolio Category',
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'portfolio' ),
'show_admin_column' => true,
'labels' => array (
'search_items' => 'caetgory',
'popular_items' => 'popular',
'all_items' => 'all',
'parent_item' => '',
'parent_item_colon' => '',
'edit_item' => '',
'update_item' => '',
'add_new_item' => 'Add new item',
'new_item_name' => 'New item name',
'separate_items_with_commas' => '',
'add_or_remove_items' => '',
'choose_from_most_used' => '',
)
)
);
}
私が正しく理解したならば、あなたはあなたのportfolio
カスタム投稿タイプのみを含むコアタグ分類学の用語のためのアーカイブテンプレートが欲しいです。最善の方法は、pre_get_posts
アクションフックを使用して、クエリのpost_type
引数を'portfolio'
に設定することです。
add_action('pre_get_posts', 'query_post_type');
function query_post_type($query) {
//Limit to main query, tag queries and frontend
if($query->is_main_query() && !is_admin() && $query->is_tag ) {
$query->set( 'post_type', 'portfolio' );
}
}
その後、タグアーカイブのどのビューにも、セカンダリWP_Queryを必要とせずにカスタム投稿タイプのみが含まれます。その後、任意のアーカイブテンプレートを使用して結果を表示できます。明らかに、標準投稿は含まれていません。
特定のタグ用語に対してのみこれを制限します。
add_action('pre_get_posts', 'query_post_type');
function query_post_type($query) {
//Limit to main query, tag queries and frontend
if($query->is_main_query() && !is_admin() && $query->is_tag && $query->get('tag') == 'photo' ) {
$query->set( 'post_type', 'portfolio' );
}
}
カスタム投稿タイプに基づくタグアーカイブの特定のテンプレートの使用については、直接行うことはできません。しかし、例えばphoto
タグのアーカイブ用のテンプレートファイルとしてtag-photo.php
を使用することができます。複数のタグをカバーする必要があり、同じ内容の複数のファイルを作成したくない場合は、template_include
フィルタを使用できます。例えば、 "portfolio_archive_template.php"ファイルを作成し、それをあなたのテーマフォルダに置き、そして
add_filter( 'template_include', 'portfolio_tag_template' );
function portfolio_tag_template( $template ) {
$portfolio_tag = array( 'photo', 'video' );
if ( is_tag() && in_array( get_query_var( 'tag' ), $portfolio_tag ) ) {
$new_template = locate_template( array( 'portfolio_tag_template.php' ) );
if ( '' != $new_template ) {
return $new_template ;
}
}
return $template;
}
とにかく、私はあなたがやろうとしていることは分類学の概念に反していると思います。分類(分類)用語で(任意の種類の)投稿にタグを付けても、用語アーカイブから除外するのはなぜですか?それは「黄色い猫」と「黄色い犬」を持っているようですが、「黄色い動物」アーカイブから「黄色い犬」を除外します。
私の視点からは絶対に間違ったアプローチです。代わりに、独自の投稿タイプ専用のカスタム分類法を使用する必要があります。例えば、あなたが既に登録した 'portfolio_category'分類法です。それから、taxonomy-portfolio_category.php
テンプレートを使って出力をカスタマイズできます。 portfolio_category
はportfolio
項目の排他的な分類法なので、追加のコードや回避策なしで、必要な正しいアーカイブページが得られます。
私が個人的に私のタグページから特定の投稿タイプを除外させる理由があるので、これに加えてください。
すべての結果を取得する検索バーがありますが、ブログ投稿からタグアーカイブリンクをクリックするとタグページにブログ投稿が表示され、別の投稿タイプからそれをクリックするとその投稿タイプからタグ付き投稿が表示されます。
私は実際にはその人がどこから来たのかを判断するためにリファラーを使っていて、それからウェブサイトのどこから来たのかに基づいてどの投稿タイプが表示されるかのオプションを与えるためにif文を使っています。
query_posts( array( 'post_type' => array('post', 'portfolio') ) );
通常の投稿とポートフォリオタイプ内の投稿の両方が表示されます。
query_posts('post_type=portfolio');
私の経験では、Amazonで製品を検索している場合、Amazonの開発者コードセクションにキーワードを含む結果がほしくない、製品のリストが欲しい、またはこの場合post type = productが必要です。