是的,目前没有对CPT归档的内置支持,但这并不意味着您不能扩展WP来提供它。前几天我自己做的。。。
这不会创建您正在查找的基于日期的存档,但会为您提供自定义帖子类型的虚拟存档行为。添加日期应该只是调整重写规则的问题(实际上,基于日期的永久链接可能只按原样工作)。。。
EXAMPLE: 您有一个自定义类型的“电影”和一个名为“乱世佳人”的电影帖子。此代码将为您提供网站的URL结构。com/电影/飘。还有,访问网站。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”模板,并根据自己的喜好自定义循环输出。。
UPDATE: 拥有自定义类型的归档功能非常好,但我意识到我需要一种访问它们的方法。很明显,您可以在某个地方对指向slug的按钮进行硬编码,但我创建了一个生成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\');