问题描述
基本上我想使用自定义的帖子类型来实现一个词汇表,并且设置一些问题来重写我想要的方式。我想要这样:
主要词汇表 URL:http://example.com/glossary/
术语从字母 A 开始:http://example.com/glossary/a/
单一术语表的 URL:http://example.com/glossary/a/atomic/
我实际上使用下面的代码实现了这一点,但我确信这是一个非常尴尬的方式,我知道这是一个错误,因为在查看页面时调用错误的模板。除了 http://example.com/glossary/,其中 archive-sumo-glossary-term.php 被按预期的方式调用,另外两个只是激活我的主题中的 index.php 。
这里 (functions.php
的主题):
add_action('init', 'create_glossary');
function create_glossary()
{
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Glossary Terms', 'post type general name'),
'singular_name' => _x('Glossary Term', 'post type singular name')
# And so on …
),
'supports' => array('title', 'editor', 'thumbnail'),
'public' => true,
'rewrite' => array
(
'slug' => 'glossary',
'with_front' => false
),
'query_var' => 'glossary-term',
'has_archive' => true
)
);
register_taxonomy
(
'sumo-glossary-letter',
'sumo-glossary-term',
array
(
'hierarchical' => true,
'labels' => array
(
'name' => _x('Letters', 'taxonomy general name'),
'singular_name' => _x('Letter', 'taxonomy singular name')
# And so one
),
'show_ui' => true,
'query_var' => 'glossary-letter',
'rewrite' => false
)
);
}
add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
if ($post->post_type == 'sumo-glossary-term')
{
$permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
}
return $permalink;
}
add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
最佳解决方案
您可以随时覆盖将使用 template_include
或相关过滤器调用的模板,但这可能会隐藏更多自定义存档的问题。
据我了解,您要使用以下结构:
-
/glossary/
应该是所有sumo-glossary-term
帖子的归档页面 -
/glossary/[letter]/
应该是sumo-glossary-letter
分类学中具有分类术语[letter]
的帖子的归档页面 -
/glossary/[letter]/[term-name]/
应为个人sumo-glossary-term
帖子
这意味着第一个将加载模板 archive-sumo-glossary-term.php
,第二个将加载 taxonomy-sumo-glossary-letter.php
,第三个将加载 single-sumo-glossary-term.php
。
我在 WordPress 3.2 中实现了这一点,显式地设置了分类重写 slug,重写 slug 和 post 类型的 archive slug,而没有其他的重写规则。此外,我先注册了分类法,然后在其后注册了分类,以确保优先级是正确的 (否则,如/glossary/f/page/2
的 URL 转换为术语表 page
而不是术语表 f
的第 2 页) 。
add_action('init', 'create_glossary');
function create_glossary()
{
register_taxonomy
(
'sumo-glossary-letter',
array(),
array
(
'hierarchical' => true,
'labels' => array
(
'name' => _x('Letters', 'taxonomy general name'),
'singular_name' => _x('Letter', 'taxonomy singular name')
# And so one
),
'show_ui' => true,
'query_var' => 'glossary-letter',
'rewrite' => array(
'slug' => 'glossary',
),
)
);
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Glossary Terms', 'post type general name'),
'singular_name' => _x('Glossary Term', 'post type singular name')
# And so on …
),
'supports' => array('title', 'editor', 'thumbnail'),
'public' => true,
'rewrite' => array
(
'slug' => 'glossary/%sumo-glossary-letter%',
'with_front' => false
),
'query_var' => 'glossary-term',
'has_archive' => 'glossary',
'taxonomies' => array( 'sumo-glossary-letter' ),
)
);
}
add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
$glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
$post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
}
return $post_link;
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。