web-dev-qa-db-ja.com

カスタム投稿タイプに固有のタグアーカイブページを作成することは可能ですか?

いくつかのカスタム投稿タイプ(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' => '',
            )
        )
    ); 
}
1
norixxx

私が正しく理解したならば、あなたはあなたの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_categoryportfolio項目の排他的な分類法なので、追加のコードや回避策なしで、必要な正しいアーカイブページが得られます。

2
cybmeta

私が個人的に私のタグページから特定の投稿タイプを除外させる理由があるので、これに加えてください。

すべての結果を取得する検索バーがありますが、ブログ投稿からタグアーカイブリンクをクリックするとタグページにブログ投稿が表示され、別の投稿タイプからそれをクリックするとその投稿タイプからタグ付き投稿が表示されます。

私は実際にはその人がどこから来たのかを判断するためにリファラーを使っていて、それからウェブサイトのどこから来たのかに基づいてどの投稿タイプが表示されるかのオプションを与えるためにif文を使っています。

 query_posts( array( 'post_type' => array('post', 'portfolio') ) );

通常の投稿とポートフォリオタイプ内の投稿の両方が表示されます。

 query_posts('post_type=portfolio');

私の経験では、Amazonで製品を検索している場合、Amazonの開発者コードセクションにキーワードを含む結果がほしくない、製品のリストが欲しい、またはこの場合post type = productが必要です。

0