web-dev-qa-db-ja.com

日付と分類法によるカスタム投稿タイプアーカイブ

「映画」と呼ばれるカスタム投稿タイプの古典的な例と、「ジャンル」と呼ばれる独自の分類法を使用しましょう。

カスタムの投稿タイプを登録することで( "映画"スラッグを使用して)、パーマリンクはすでにに設定されています。

<domain>/movie/action/ 

...アクションジャンルの映画をすべて見る。

しかし、以下のように日付でアーカイブします。

<domain>/2010/09/

...カスタム投稿タイプについて知りません。

私が仕事をすることができる最も近い日付ベースのアーカイブは、次のとおりです。

<domain>/2010/?post_type=movies

...今年(2010年)に投稿されたすべてのカスタム投稿タイプを一覧表示します。何らかの理由で、月、分類法、および用語をURLに追加して期待どおりの結果を得ることができません。

このようなURLを有効にするには何をしなければなりませんか...

<domain>/2010/09/movie/action/

...期待どおりに動作するように、つまり2010年9月中に投稿されたすべてのアクション映画を一覧表示するには

6
Werner

はい、現在CPTアーカイブの組み込みサポートはありませんが、それを提供するためにWPを拡張できないという意味ではありません。私は先日これを自分でしました...

これはあなたが探している日付ベースのアーカイブを作成しませんが、それはあなたにカスタム投稿タイプのための仮想アーカイブの振る舞いを与えます。日付を追加することは、単に書き換えルールを微調整することです(実際には、日付ベースのパーマリンクはそのままの状態で機能する可能性があります)。

例: "あなたは"映画 "というカスタムタイプと"風と共に去りぬ "という単一の映画投稿があります。このコードはあなたにwebsite.com/movies/gone-with-the-windのURL構造を与えます。また、website.com/mooviesにアクセスすると、映画だけが表示されます(カテゴリアーカイブのように出力用にarchive.phpテンプレートを呼び出すことはありませんが、標準のindex.phpループテンプレートのように出力をフォーマットします)。

function register_post_type_archives( $post_type, $base_path = '' ) {
    global $wp_rewrite;
    if ( !$base_path ) {
        $base_path = $post_type;
    }
    $rules = $wp_rewrite->generate_rewrite_rules($base_path);
    $rules[$base_path.'/?$'] = 'index.php?paged=1';
    foreach ( $rules as $regex=>$redirect ) {
        if ( strpos($redirect, 'attachment=') == FALSE ) {
            $redirect .= '&post_type='.$post_type;
            if (  0 < preg_match_all('@\$([0-9])@', $redirect, $matches) ) {
                for ( $i=0 ; $i < count($matches[0]) ; $i++ ) {
                    $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect);
                }
            }
        }
        add_rewrite_rule($regex, $redirect, 'top');
    }
}

カスタム投稿タイプを生成した直後にこの関数を呼び出します。

register_post_type('movies', $args);
register_post_type_archives('movies');

次に、カスタムテンプレートを使用してこれらの準アーカイブリストの出力を制御したい場合は、これを使用できます。

add_action('template_redirect', 'post_type_templates');
function post_type_templates() {
    $post_type = get_query_var('post_type');
    if (!empty($post_type)) {
        locate_template(array("{$post_type}.php","index.php"), true);
        die;
    }
}

今すぐあなたのテーマで "movies.php"テンプレートを作成し、あなたの好みに合わせてループ出力をカスタマイズすることができます。

更新: カスタムタイプのためのアーカイブ機能を持つことは素晴らしいことですが、私はそれらにアクセスする方法が必要だと気づきました。スラッグを指すボタンをどこかにハードコードすることは明らかですが、私はすべてのカスタムタイプを含むwp3.0ナビゲーションバーを生成する関数を作りました。現時点では、新しいナビゲーションバーが生成されてプライマリになりますが、セカンダリナビゲーションに変更することも、既存のナビゲーションバーにアイテムを追加することもできます。注:ナビゲーションリンクは、上記の書き換え規則を使用している場合にのみ機能します。

function register_typenav() {
    $mainnav = wp_get_nav_menu_object('Types Nav');
    if (!$mainnav) {
        $menu_id = wp_create_nav_menu( 'Types Nav' );
        // vav item for each post type
        $types = get_post_types( array( 'exclude_from_search' => false ), 'objects' );
        foreach ($types as $type) {
            if (!$type->_builtin) {
                wp_update_nav_menu_item( $menu_id, 0, array(
                    'menu-item-type' => 'custom',
                    'menu-item-title' => $type->labels->name,
                    'menu-item-url' => get_bloginfo('url') . '/' . $type->rewrite['slug'] . '/',
                    'menu-item-status' => 'publish'
                    )
                );
            }
        }
    if ($mainnav && !has_nav_menu( 'primary-menu' ) ) {
        $theme = get_current_theme();
        $mods = get_option("mods_$theme");
        $key = key($mods['nav_menu_locations']);
        $mods['nav_menu_locations'][$key] = $mainnav->term_id;
        update_option("mods_$theme", $mods);
    }
}
add_action('init', 'register_typenav');
6
somatic

カスタム投稿タイプは、一般的なブログ投稿タイプのようにアーカイブを提供するようには設計されていません。これは将来変更される可能性があります。

これは不足しているリンクです: 3.1で考慮に値するカスタム投稿タイプ(CPT)の機能拡張

2
hakre

このプラグインはあなたが望むものを正確に提供します。それはWordpress 3.3.1とうまく働きます。

1
baxang