Answers:
是的,这是可能的,但是如果插件正在使用rewrite => array('slug' => 'post_type')
参数创建自定义帖子类型,那么您将不可能替换该子弹。
每当创建自定义帖子类型时,URL重写规则都会写入数据库。根据哪个操作触发自定义帖子类型的创建(例如init操作),WordPress将刷新重写规则并还原自定义帖子类型的标记,无论您尝试进行何种更改。
也就是说,您可以为自定义帖子类型提供自定义标签。以下示例假定您的自定义帖子类型为movies
,并且您尝试将/movies/
slug 更改为/films/
。
为了完整起见,这是用于定义movies
自定义帖子类型的基本功能。您要引用的插件应该执行以下操作:
function movies_register_post_type() {
register_post_type(
'movies',
array(
'labels' => array(
'name' => __('Movies'),
'singular_name' => __('Movie')
),
'public' => true,
'has_archive' => true,
'rewrite' => array(
'slug' => 'movies'
)
)
);
} // end example_register_post_type
add_action('init', 'movies_register_post_type');
您可以通过基于现有帖子类型提供自己的自定义规则来修改选项表。
基本上,我们将这样做:
这是您可以执行的操作:
function add_custom_rewrite_rule() {
// First, try to load up the rewrite rules. We do this just in case
// the default permalink structure is being used.
if( ($current_rules = get_option('rewrite_rules')) ) {
// Next, iterate through each custom rule adding a new rule
// that replaces 'movies' with 'films' and give it a higher
// priority than the existing rule.
foreach($current_rules as $key => $val) {
if(strpos($key, 'movies') !== false) {
add_rewrite_rule(str_ireplace('movies', 'films', $key), $val, 'top');
} // end if
} // end foreach
} // end if/else
// ...and we flush the rules
flush_rewrite_rules();
} // end add_custom_rewrite_rule
add_action('init', 'add_custom_rewrite_rule');
现在,您将有两种访问电影的方式:
/movies/Back-To-The-Future
/films/Back-To-The-Future
请注意,我不建议add_custom_rewrite_rule
将该init
操作挂入操作,因为它会触发得太频繁。这只是一个例子。应用此功能的一个更好的地方是主题激活,插件激活,或者save_post操作等。根据您需要执行的操作,您可能只需要触发一次或几次即可。
此时,您可能需要考虑更新自定义帖子类型的永久链接以使用' /movies/
子弹。例如,如果您导航到/films/
,您将看到所有电影的列表,但将鼠标悬停在标题上将显示该/movies/
子弹仍在使用中。
要更进一步,从技术上讲,您可以设置301重定向以捕获所有/movies/
要重定向到其/films/
对应链接的链接,但这全都取决于您要执行的操作。
$post
在该add_custom_rewrite_rule()
函数中使用,但是它在WP Admin中引发错误,提示“试图获取非对象的属性”。如何获取$ post以获得元值?
该代码对于我的孩子主题非常有效。需要将“程序”子弹更改为“地方”。
/*
CHANGE SLUGS OF CUSTOM POST TYPES
*/
function change_post_types_slug( $args, $post_type ) {
/*item post type slug*/
if ( 'program' === $post_type ) {
$args['rewrite']['slug'] = 'place';
}
return $args;
}
add_filter( 'register_post_type_args', 'change_post_types_slug', 10, 2 );
/*
CHANGE SLUGS OF TAXONOMIES, slugs used for archive pages
*/
function change_taxonomies_slug( $args, $taxonomy ) {
/*item category*/
if ( 'program-category' === $taxonomy ) {
$args['rewrite']['slug'] = 'locations';
}
return $args;
}
add_filter( 'register_taxonomy_args', 'change_taxonomies_slug', 10, 2 );
$args['has_archive'] = false
但这确实可行。