WordPress教程

如何修改WordPress主题自定义文章类型的固定连接格式

WordPress日记 2018-09-18 WP主题开发 233 次

自定义文章类型默认输入的固定链接结构为 /%postname%  。假设我们添加的自定义文章类型为 book ,那么默认输出的 book 文章链接一般为 http://域名/book/slug (slug为标题别名)。如果文章标题是中文(比如:一本好书),而且你没有手动或者使用插件翻译为非中文的 slug (a-nice-book),那么显示的链接就会是 http://域名/book/一本好书 ,这样一来,文章链接的中文部分就会显示成乱码,实在不符合我们的审美标准了。

那么,我们可以将 /%postname% 改为 /%post_id% 或 /%post_id%.html 样式,使用ID来显示。要实现这个目的,可以使用 Custom Post Type Permalinks 插件。如果你是插件或主题开发者,一般都喜欢直接通过代码定义好默认的固定链接结构。

可以在插件函数文件或主题的functions.php 文件添加下面的代码:

  1. /**
  2.  * 设置 book 这种自定义文章类型的固定链接结构为 ID.html 
  3.  * https://www.wpdaxue.com/custom-post-type-permalink-code.html
  4.  */
  5. add_filter('post_type_link', 'custom_book_link', 1, 3);
  6. function custom_book_link( $link, $post = 0 ){
  7.     if ( $post->post_type == 'book' ){
  8.         return home_url( 'book/' . $post->ID .'.html' );
  9.     } else {
  10.         return $link;
  11.     }
  12. }
  13. add_action( 'init', 'custom_book_rewrites_init' );
  14. function custom_book_rewrites_init(){
  15.     add_rewrite_rule(
  16.         'book/([0-9]+)?.html$',
  17.         'index.php?post_type=book&p=$matches[1]',
  18.         'top' );
  19.     add_rewrite_rule(
  20.         'book/([0-9]+)?.html/comment-page-([0-9]{1,})$',
  21.         'index.php?post_type=book&p=$matches[1]&cpage=$matches[2]',
  22.         'top'
  23.         );
  24. }

以上代码就可以输出形如 /book/123.html 的链接。请将代码中所有 book 替换为你的自定义文章类型。

如果你要同时定义多种自定义文章类型,可以使用下面的代码:

  1. /**
  2.  * 设置多种自定义文章类型的固定链接结构为 ID.html
  3.  * https://www.wpdaxue.com/custom-post-type-permalink-code.html
  4.  */
  5. $mytypes = array(//根据需要添加你的自定义文章类型
  6.     'type1' => 'slug1',
  7.     'type2' => 'slug2',
  8.     'type3' => 'slug3'
  9.     );
  10. add_filter('post_type_link', 'my_custom_post_type_link', 1, 3);
  11. function my_custom_post_type_link( $link, $post = 0 ){
  12.     global $mytypes;
  13.     if ( in_array( $post->post_type,array_keys($mytypes) ) ){
  14.         return home_url( $mytypes[$post->post_type].'/' . $post->ID .'.html' );
  15.     } else {
  16.         return $link;
  17.     }
  18. }
  19. add_action( 'init', 'my_custom_post_type_rewrites_init' );
  20. function my_custom_post_type_rewrites_init(){
  21.     global $mytypes;
  22.     foreach( $mytypes as $k => $v ) {
  23.         add_rewrite_rule(
  24.             $v.'/([0-9]+)?.html$',
  25.             'index.php?post_type='.$k.'&p=$matches[1]',
  26.             'top'
  27.             );
  28.         add_rewrite_rule(
  29.             $v.'/([0-9]+)?.html/comment-page-([0-9]{1,})$',
  30.             'index.php?post_type='.$k.'&p=$matches[1]&cpage=$matches[2]',
  31.             'top'
  32.             );
  33.     }
  34. }