Custom Post Type在启用rewrite的情况下,为了让rewrite rule生效,需要更新固定链接(flush rewrite rules),有两种方法可以实现:第一,到后台->设置->固定链接界面重新保存一下固定链接;第二,执行flush_rewrite_rules()函数更新固定链接。本文介绍通过插件注册Custom Post Type时,如何在启用插件时将需要的rewrite rule自动加入,以及在禁用插件式自动删除该rewrite rule。
准备知识
flush_rewrite_rules()会删除rewrite rules并重新建立,所以应该用在插件启用或者禁用的情况使用,否则没产生一次页面请求都会执行一次,浪费资源。
注册启用和禁用插件式执行的函数
//myplugin_activate是插件启用时执行的函数 register_activation_hook( __FILE__, 'myplugin_activate' ); //myplugin_deactivate是插件禁用时执行的函数 register_deactivation_hook( __FILE__, 'myplugin_deactivate' );
注册Custom Post Type
简单的过程如下,注册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目录下,就可以在后台插件列表中看到,启用后即可看到效果。