假设调用了自定义分类法artist
(并且不覆盖rewrite
参数)您可以使用重写标记%artist%
. WordPress实现了几乎所有在post permalinks中使用这些重写标记的功能。只需要进行一些小的调整。
首先,您需要使用post_link
用于替换请求结构中的自定义»标记«的筛选器:
/**
* replace the \'%artist%\' tag with the first
* term slug in the artist taxonomy
*
* @wp-hook post_link
* @param string $permalink
* @param WP_Post $post
* @return string
*/
function wpse_56769_post_link( $permalink, $post ) {
$default_term = \'no_artist\';
$terms = wp_get_post_terms( $post->ID, \'artist\' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) )
$term = current( $terms )->slug;
else
$term = $default_term;
$permalink = str_replace( \'%artist%\', $term, $permalink );
return $permalink;
}
add_filter( \'post_link\', \'wpse_56769_post_link\', 10, 2 );
此函数(
wpse_56769_post_link
):
定义默认术语slug(no_artist
) 如果贴子在艺术家分类法中没有指定术语,则将其用作回退,获取艺术家分类法的第一个指定术语(按字母顺序),替换标记%artist%
用这个词的鼻涕虫现在,进入菜单设置→ Permalinks,选择选项»Custom Structure«并写入:/%artist%/%postname%/
.
因此,post permalink应该如下所示:
现在,post permalinks包含了第一个艺术家术语slug,让我们看看路由。
更新永久链接(路由)
您会注意到,永久链接已正确解析为单个帖子。不幸的是,页面永久链接被破坏。
要解决此问题,不一定需要修改重写规则。我们唯一需要做的就是改变WP_Rewrite
. 财产WP_Rewrite::use_verbose_page_link
需要设置为TRUE
. (这是WP_Rewrite
使用时%category%
或%author%
标记作为post permalinks的基础。)
/**
* set WP_Rewrite::use_verbose_page_rules to TRUE if %artist%
* is used as the first rewrite tag in post permalinks
*
* @wp-hook do_parse_request
* @wp-hook page_rewrite_rules
* @global $wp_rewrite
* @param mixed $pass_through (Unused)
* @return mixed
*/
function wpse_56769_rewrite_verbose_page_rules( $pass_through = NULL ) {
$permastruct = $GLOBALS[ \'wp_rewrite\' ]->permalink_structure;
$permastruct = trim( $permastruct, \'/%\' );
if ( 0 !== strpos( $permastruct, \'artist%\' ) )
return $pass_through;
$GLOBALS[ \'wp_rewrite\' ]->use_verbose_page_rules = TRUE;
return $pass_through;
}
add_filter( \'page_rewrite_rules\', \'wpse_56769_rewrite_verbose_page_rules\', PHP_INT_MAX );
add_filter( \'do_parse_request\', \'wpse_56769_rewrite_verbose_page_rules\', PHP_INT_MAX );
必须在两个点更改状态:
do_parse_request
因为
WP::parse_request()
请求此状态和
page_rewrite_rules
当重写规则生成时。
现在,路由已修复,页面永久链接工作正常。(再次冲洗permalinks后。)
处理no_artist
伪术语no_artist
事情:如果这个职位真的没有分配给artist
在分类法中,permalink被解析为以下查询变量:
name => \'sample_post\'
artist => \'no_artist\'
page => \'\'
这将导致404,因为该术语不存在。作为岗位的
name
应该是唯一的我们可以删除
artist
上的查询变量
request
过滤器:
/**
* check for existing artist and set query to 404 if necessary
*
* @wp-hook parse_query
* @param array $request_vars
* @return array
*/
function wpse_56769_request_vars( $request_vars ) {
if ( ! isset( $request_vars[ \'artist\' ] ) )
return $request_vars;
if ( ! isset( $request_vars[ \'name\' ] ) )
return $request_vars;
if ( \'no_artist\' == $request_vars[ \'artist\' ] )
unset( $request_vars[ \'artist\' ] );
return $request_vars;
}
add_filter( \'request\', \'wpse_56769_request_vars\' );
有了这个过滤器
http://wordpress.dev/no_artist/sample-post/
将正确找到。