Custom Post Type在启用rewrite的情况下,为了让rewrite rule生效,需要更新固定链接(flush rewrite rules),有两种方法可以实现:第一,到后台->设置->固定链接界面重新保存一下固定链接;第二,执行flush_rewrite_rules()函数更新固定链接。本文介绍通过插件注册Custom Post Type时,如何在启用插件时将需要的rewrite rule自动加入,以及在禁用插件式自动删除该rewrite rule。

准备知识

flush_rewrite_rules()

flush_rewrite_rules()会删除rewrite rules并重新建立,所以应该用在插件启用或者禁用的情况使用,否则没产生一次页面请求都会执行一次,浪费资源。

注册启用和禁用插件式执行的函数

//myplugin_activate是插件启用时执行的函数
register_activation_hook( __FILE__, 'myplugin_activate' );

//myplugin_deactivate是插件禁用时执行的函数
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

注册Custom Post Type

参考Codex中的例子

简单的过程如下,注册book类型

function codex_custom_init() {
    $args = array( 'public' => true, 'label' => 'Books' );
    register_post_type( 'book', $args );
}
add_action( 'init', 'codex_custom_init' );

插件启用/禁用时刷新rewrite rules

<?php
/*
Plugin Name: Flush Rewrite Rules Test
*/

register_activation_hook( __FILE__, 'myplugin_activate' );
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );
add_action( 'init', 'codex_custom_init' );

function codex_custom_init() {
    $args = array( 'public' => true, 'label' => 'Books' );
    register_post_type( 'book', $args );
}

function myplugin_activate() {
	codex_custom_init();
	flush_rewrite_rules();
}

function myplugin_deactivate() {
	flush_rewrite_rules();
}
?>

结合文章《如何修改自定义文章类型的固定链接》中介绍的方法,用post_id当做custom post type的固定链接,并且让这种自定义固定链接格式在插件启用时一并生效,代码如下。

/*
Plugin Name: Flush Rewrite Rules Test
*/

register_activation_hook( __FILE__, 'myplugin_activate' );
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );
add_action( 'init', 'codex_custom_init' );
add_action( 'init', 'custom_book_rewrites_init' );
add_filter('post_type_link', 'custom_book_link', 1, 3);

function codex_custom_init() {
    $args = array( 'public' => true, 'label' => 'Books' );
    register_post_type( 'book', $args );
}

function myplugin_activate() {
	codex_custom_init();
	custom_book_rewrites_init();
	flush_rewrite_rules();
}

function myplugin_deactivate() {
	flush_rewrite_rules();
}
  
function custom_book_link( $link, $post = 0 ){
    if ( $post->post_type == 'book' ){
        return home_url( 'book/' . $post->ID );
    } else {
        return $link;
    }
}
  
function custom_book_rewrites_init(){
    add_rewrite_rule(
        'book/([0-9]+)?$',
        'index.php?post_type=book&p=$matches[1]',
        'top' );
}
?>

以上两段代码是以插件形式呈现的,将代码保存到一个php文件中,将文件放在plugins目录下,就可以在后台插件列表中看到,启用后即可看到效果。