将.html(点HTML)扩展名添加到自定义帖子类型


10

有没有办法在没有插件的情况下.html扩展名添加到自定义帖子类型?

对于我可以/%postname.html在永久链接设置上使用的帖子

对于页面,我可以使用:

add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
    global $wp_rewrite;
    if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' ) 
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}

对于自定义帖子类型???

是否有类似于上面的代码片段允许我更改或添加.html自定义帖子类型url?


5
只是想知道出于什么原因要添加.html?
文斯·佩蒂特

好吧,function post-type_permalink会抛出一个错误。如果您没有收到此错误,则说明调试设置有些麻烦。另外,请根据线路上的正确意图重新处理您的问题。谢谢。
kaiser 2012年

@kaiser,只是想知道如何在自定义帖子类型上使用相同的永久链接设置。如果我设置/$postname.html了帖子,如何将其用于自定义帖子类型。
user983248

您没有阅读我在评论中写的一行,对吗?请修正您的代码。同样-在函数名称中也不起作用...
kaiser 2012年

@kaiser是的,我做了,但是我不是Flash,而且我有手部问题,因此我无法按照我的想法或语言进行输入
user983248

Answers:


8

这似乎起作用:

创建类似的重写规则post-type/post-name.html。您可以使用数组为某些帖子类型集创建规则,而不必为所有帖子类型都创建规则。

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

格式化这些帖子类型的新永久链接结构。

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

然后停止重定向规范URL以删除结尾的斜杠。这可能需要更多工作,因为在大多数情况下您可能希望保留重定向。

add_filter( 'redirect_canonical', '__return_false' );

正如其他人在这里所说的那样,完成上述操作后,您需要刷新规则,这可以通过访问中的options-permalink.php管理页面来实现Dashboard -> Settings -> Permalinks


6
Oi Vinicius,一个很好的回答做法是在所有函数名称前添加wpse_59024_ (问题ID),以避免copy / pasta;)的冲突。。。并且具有知道代码属于我们的摘要库中哪个Answer的额外好处。。。。。+1点!
brasofilo 2012年

此代码将覆盖使用该post_type_link过滤器的所有其他过滤器
Tom J Nowell

4

您可以为此添加一个重写规则,以取代内置的永久链接,例如,用于自定义帖子类型“产品”的...

add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
    add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}

(不要忘记通过重新保存永久链接或使用flush_rules上面的@toscho注释来刷新规则)。

注意事项

  • 我认为类似的功能the_permalink()不会使用此功能,因此您可能必须添加一个过滤器post_link以捕获这些链接。您还可以添加到redirect_canonical过滤器中,以重定向默认的永久链接,以便将/ product / foo和/ product / foo /重定向到/product/foo.html。
  • 您将需要为网站使用的其他URL添加附加重写,例如feed URL,后续页面,引用通告等。上面的代码仅适用于“自定义帖子类型”主页面。

2

如果您希望使用WordPress插件来为您处理工作,请在WordPress插件存储库中查看“ 自定义帖子类型”永久链接。在WordPress 3.4.1上进行了测试,效果很好。

激活插件后,只需导航至Dashboard-> Settings-> Permalinks。您可以为每种注册的自定义帖子类型添加特定的重写。


3
不要在每次页面加载时刷新重写规则。
fuxia

该代码不工作,如果你还只是从复制和粘贴代码xplus3.net/2010/05/20/wp3-custom-post-type-permalinks确保其工作正常-1不是测试
user983248

@toscho您打算怎么做或阻止它?
user983248 '07年

1
flush_rules()仅应在取消激活时才调用它,因为它非常慢。您可以检查$GLOBALS['wp_rewrite']->rules规则是否已知。
fuxia

@Michael Ecklund它给出了404我不工作。您是否测试过该代码?
user983248 '07年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.