日付と分類によるカスタム投稿タイプのアーカイブ
3 回答
- 投票
-
- 2010-09-18
はい、現在CPTアーカイブの組み込みサポートはありませんが、それを提供するためにWPを拡張できないという意味ではありません.先日、自分でやっただけです...
これにより、探している日付ベースのアーカイブは作成されませんが、カスタム投稿タイプの仮想アーカイブ動作が提供されます.日付を追加するには、書き換えルールを微調整するだけです(実際には、日付ベースのパーマリンクはそのまま機能する可能性があります)...
例:カスタムタイプの「映画」と「風と共に去りぬ」という単一の映画投稿があります.このコードは、website.com/movies/gone-with-the-windのURL構造を提供します.また、website.com/moviesにアクセスすると、映画だけが一覧表示されます(ただし、出力用に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');
Yes, there isn't currently built-in support for CPT archives, but that doesn't mean you can't extend WP to provide it. I just did this myself the other day...
This won't create the date-based archives you're looking for, but it will give you virtual archive behavior for custom post types. Adding the date should just be a matter of tweaking the rewrite rules (actually, date-based permalinks might just work as-is)...
EXAMPLE: you have a custom type of "movies" and single movie post called "gone with the wind". This code will give you a URL structure of website.com/movies/gone-with-the-wind. Also, going to website.com/movies will list just the movies (just like a category archive, though it will not call the archive.php template for output, but will format the output just like the standard index.php loop template).
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'); } }
call this function right after having generated your custom post type:
register_post_type('movies', $args); register_post_type_archives('movies');
Then, if you would like to be able to use custom templates to control the output of these quasi-archive listings, you can use this:
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; } }
Now you can create a "movies.php" template in your theme and customize the loop output to your liking..
UPDATE: having the archive functionality for custom types is great, but I realized I needed a way to access them. You can obviously hard-code buttons somewhere that point to the slugs, but I made a function to generate a wp3.0 navbar with all my custom types in it. Right now it spawns a new navbar and makes it the primary, but you could change it to be the secondary, or to just add the items to an existing navbar. Note: the nav links will only work if you're using the rewrite rules from above.
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');
-
これをありがとう、私はそれを試してみて、あなたの答えを受け入れます/私がそれを機能させることができれば変更を提案します...Thanks for this, I'll try it out and accept your answer / propose changes if I can make it work...
- 0
- 2010-09-22
- Werner
-
これは素晴らしい!簡単な質問ですが、メニューのサブアイテムとしてカスタム分類名を追加するにはどうすればよいですか.This is GREAT! One quick question, how would I add custom taxonomy names as sub items on a menu.
- 0
- 2010-09-26
- Brad
-
ブラッド、体細胞が彼の投稿を編集しない限り、そのための新しい質問を投稿することが最善の方法だと思いますか?Brad, I guess posting a new question for that is the best way forward, unless somatic edits his post?
- 0
- 2010-09-27
- Werner
-
それにはまったく新しいコードのセットが必要であり、別の質問として最適です...喜んで答えます;-) Werner-元の質問に答えましたか?私の答えを「受け入れられた」として選んでいただければ幸いです.that would require a whole new set of code, and would be best as a separate question... which I'd be happy to answer ;-) Werner- have I answered the original question? I would appreciate you choosing my answer as "accepted".
- 0
- 2010-10-10
- somatic
-
- 2010-09-15
カスタム投稿タイプは、一般的なブログ投稿投稿タイプのようにアーカイブを提供するようには設計されていません.これは将来変更される可能性があります.
これは欠落しているリンクです:カスタム投稿タイプ(CPT)の機能強化に値する3.1での考慮事項.
Custom Post Types are not designed to provide archive as the common blog post post type does. This might be something that will be changed in the future.
This is the missing link: Custom Post Types (CPT) enhancements that deserve consideration in 3.1.
-
- 2012-03-14
このプラグインはまさにあなたが望むものを提供します.Wordpress3.3.1でうまく機能します.
This plugin provides the exactly what you want. It works well with Wordpress 3.3.1.
「ジャンル」と呼ばれる独自の分類法を持つ「映画」と呼ばれるカスタム投稿タイプの古典的な例を使用してみましょう.
カスタム投稿タイプ(「映画」スラッグを使用)を登録することにより、パーマリンクはすでに設定されています
...アクションジャンルのすべての映画を見る.
ただし、
のように日付別のアーカイブ...カスタム投稿タイプについてはわかりません.
私が機能させることができる最も近い日付ベースのアーカイブは次のとおりです:
...これは、現在の年(2010)に投稿されたすべてのカスタム投稿タイプを一覧表示します.何らかの理由で、期待される結果を得るために月、分類法、および用語をURLに追加できません.
このようなURLを有効にするにはどうすればよいですか...
...期待どおりに機能するため、2010年9月に投稿されたすべてのアクション映画を一覧表示しますか?