我在为自定义帖子类型设置永久链接时遇到问题。下面是我的init函数的代码:
register_post_type(\'topic\',
array(
...
\'hierarchical\' => true,
\'query_var\' => true,
\'rewrite\' => false,
...
));
if(get_option(\'permalink_structure\')!= \'\'):
global $wp_rewrite;
$wp_rewrite->add_rewrite_tag(\'%topic%\', \'(.+?)\', \'topic=\');
$wp_rewrite->add_permastruct(\'topic\', \'%forum%/%topic%/\', false, EP_PERMALINK);
endif;
基本上,我正试图以自己的方式设置permalinks,因为我想在帖子标题之前附加一个自定义的分类术语。
而不是:topic/whatever
使用:general-forum/sub-forum/whatever
这是更改链接的功能,它似乎工作正常:
add_filter(\'post_type_link\', \'topic_link\', 10, 4);
function topic_link($link, $post){
if($post->post_type != \'topic\') return $link;
global $wp_post_types;
$terms = get_the_terms($post->ID, \'forum\');
if(!is_wp_error($terms) && !empty($terms)):
usort($terms, \'_usort_terms_by_id\');
$forums = $terms[0]->slug;
if(!empty($terms[0]->parent)):
$parent_item = $terms[0]->parent;
while(!empty($parent_item)):
$parent = get_term($parent_item, \'forum\');
if(!is_wp_error($parent) && !empty($parent))
$forums = $parent->slug.\'/\'.$forums;
$parent_item = empty($parent->parent) ? false : $parent->parent;
endwhile;
endif;
endif;
return str_replace(\'%forum%\', $forums, $link);
}
所以修改后的URL显示得很好,唯一的问题是我得到了一个404错误:)我在初始化代码中做错了什么?
LE: “论坛”分类法:
register_taxonomy(
\'forum\',
array(\'topic\', \'reply\'),
array(
\'public\' => true,
\'name\' => _a(\'Forums\'),
\'singular_name\' => _a(\'Forum\'),
\'show_ui\' => true,
//\'show_tagcloud\' => true,
\'show_in_nav_menus\' => true,
\'hierarchical\' => true,
\'labels\' => array(
\'name\' => _a(\'Forums\'),
\'singular_name\' => _a(\'Forum\'),
\'search_items\' => _a(\'Search Forums\'),
\'popular_items\' => _a(\'Popular Forums\'),
\'all_items\' => _a(\'All Forums\'),
\'parent_item\' => _a(\'Parent Forum\'),
\'parent_item_colon\' => _a(\'Parent Forum:\'),
\'edit_item\' => _a(\'Edit Forum\'),
\'update_item\' => _a(\'Update Forum\'),
\'add_new_item\' => _a(\'Add New Forum\'),
\'new_item_name\' => _a(\'New Forum Name\'),
),
\'query_var\' => true,
\'rewrite\' => array(\'slug\' => \'forums\', \'with_front\' => false, \'hierarchical\' => true),
//\'update_count_callback\' => \'my_custom_count_callback\',
)
);
最合适的回答,由SO网友:John P Bloch 整理而成
我的插件自定义Post Permalinks为您做了这样的事情:
http://wordpress.org/extend/plugins/custom-post-permalinks
如果您想使用自己的解决方案,我需要更多的信息,例如论坛分类的注册码。
只是猜测一下,我认为论坛的regex与重写引擎的主题的regex看起来完全相同。
编辑查看您的代码,看起来您正在使用3.1。这个$args[\'rewrite\'][\'hierarchical\']
3.0中没有用于分类的位。基本上,该参数所做的是更改%forum%
标记自([^/])
到(.+?)
. 这意味着WordPress的重写引擎首先获得与此正则表达式的匹配:
@/(.+?)/(.+?)/?$
比如
/generic-forum/specific-forum/specific-topic
, 将解析为:
index.php?forum=generic-forum&topic=specific-forum/specific-topic
要测试这是否真的是导致404的原因,请更改分类法的重写参数,以便
[\'rewrite\'][\'hierarchical\']
未设置或设置为false,刷新重写规则,并修改您的主题链接函数,以不向链接添加父链接;然后测试新链接是否有效。
如果这是问题的原因,有几种方法可以解决。最简单的方法是在Per马斯truct中添加一点纯文本,如下所示:%forum%/topic/%topic%
. 这将为您提供如下链接:/general-forum/sub-forum/topic/whatever
. 另一种方法是添加另一个重写标记,如下所示:
$wp_rewrite->add_rewrite_tag( \'%post_type_topic%\', \'(topic)\', \'post_type=\' );
然后将permastruct更改为\'%forum%/%post\\u type\\u topic%/%topic%\'。