web-dev-qa-db-ja.com

カスタム投稿タイプのカテゴリアーカイブの表示

私はカスタム投稿タイプのパーティーに非常に遅れていて、ごく最近になってそれらを使い始めました。

actors というカスタム投稿タイプをいくつかのカスタムフィールド値で設定しました。(決定的に)standard categoryを使ってこれらのアクターを に分けています。 men women および children のリスト:

'taxonomies' => array('category', 'post_tag')

...私はそれがずっときれいできれいな方法になるだろうと思っていたので...まあ、俳優を分類する。しかし、私は完全にこれらのカテゴリを実際にどのように表示するか、形や形式には困惑しています。

私はアクターのallを表示するカスタムarchive-actors.phpファイルを持っていますが、カテゴリーでそれらをフィルターできるようにしたいです。例えば men のみを表示します。しかし、もし私がmysite.com/category/actors/menのような標準的なURLを推測するならば、私はただ得る

申し訳ありませんが、Menカテゴリの投稿はまだありません。

私がmysite.com/category/menを試しただけでも同じことが起こります - どちらの場合もarchive-actors.phpテンプレートを使っているわけではありません。

誰もが私のこれらの厄介な俳優を排除できるように鈍い精神の私の霧を片付けて正しい方向に私を向けるのを手伝うことができますか?

編集:

@mrwwebが以下を暗示しているように(そして私が試したことを言及するのを忘れたので)、以下をfunctions.phpファイルに追加することができます。

function query_post_type($query) {
    $post_types = get_post_types();

    if ( is_category() || is_tag()) {

        $post_type = get_query_var('actors');

        if ( $post_type ) {
            $post_type = $post_type;
        } else {
            $post_type = $post_types;
        }

        $query->set('post_type', $post_type);

        return $query;
    }
}

add_filter('pre_get_posts', 'query_post_type');

分類されたカスタム投稿タイプが通常のarchive.phpページに表示される限り、 here which doesは動作しますが、キーとなる私のarchive-actors.phpは使用されません。

4
indextwo

category_templateフィルタを使用して、カテゴリに対してテンプレートを強制的に使用することができます。

function wpa57439_category_template( $templates = '' ){
    if( !is_array( $templates ) && !empty( $templates ) ) {
        $templates = locate_template( array( 'archive-actors.php', $templates ), false );
    } 
    elseif( empty( $templates ) ) {
        $templates = locate_template( 'archive-actors.php', false );
    }
    else {
        $new_template = locate_template( array( 'archive-actors.php' ) );
        if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
    }
    return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );

フィルタ階層から コーデックスで適応。

4
Milo

それがカテゴリアーカイブの予想される動作です。 ここ サポートフォーラムで見つけたように、次のスニペットはあなたの問題を解決するはずです(単に "article"をあなたの投稿タイプに変更してください):

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','articles','nav_menu_item');
    $query->set('post_type',$post_type);
    return $query;
    }
}

更新日:ガー。私は間違った断片をつかみました。私はこれを使うつもりでした。

0
mrwweb

あるいは、できることは、新しいwp_rewriteルールを追加して、特定のcptとカテゴリ内の投稿のみを表示するための新しいURL構造を作成することです。私がここに投稿した.Gistのようなもの:

[編集:.gistsを埋め込むことはできないので、ここにコードと linky ]がある。

/**
* This could be extrapolated and used for tags or any other taxonomy really.
*/

add_action('init', 'category_cpt_rewrites');

function category_cpt_rewrites() {
    $custom_post_types = array('video', 'audio', 'photo', 'file'); //some example post types
    foreach ( $custom_post_types as $post_type ) {
        $rule = '^' . $post_type . '/category/(.+?)/?$';
        $rewrite = 'index.php?post_type=' . $post_type . '&category_name=$matches[1]';
        add_rewrite_rule($rule,$rewrite,'top');
    }
}

//make sure you flush rules
//this will take the following url structure (video cpt as an example, and politics as a category example) -> video/category/politics and return posts belonging to the politics category that are in the "video" custom post type.

//note that if you want this to be truly effective you'll want to make a custom "the_category()" or similar template function to return the correct url structure for a category list belonging to a custom post type post.
0
Darren