好吧,经过一些更深入的研究和许多错误,我得到了一个似乎合法的修复。
首先,我在自定义帖子类型中保留了重写规则,但确实更改了名称:
\'rewrite\' => array(
\'slug\' => \'/%designer%/\',
),
然后,我需要将%designer%指向正确的字段(在我的示例中,这是由ACF创建的自定义字段。我的操作如下:
add_filter( \'post_type_link\', \'art_post_type_link\', 10, 4 );
function art_post_type_link( $post_link, $post, $leavename, $sample )
{
if ( \'art\' == $post->post_type ) {
$designer = get_field( \'designer\', $post->ID );
$post_link = str_replace( \'%designer%\', $designer[\'user_nicename\'], $post_link );
}
return $post_link;
}
然后我需要确保设计者/作者有自己的URL,没有/作者/基础。还有/%作者%/%艺术名称%作品。我用下面的作者重写了这篇文章。
add_filter( \'author_rewrite_rules\', \'no_author_base_rewrite_rules\' );
function no_author_base_rewrite_rules( $author_rewrite ) {
global $wpdb;
$author_rewrite = array();
$authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");
foreach($authors as $author) {
$author_rewrite["({$author->nicename})/?$"] = \'index.php?author_name=$matches[1]\';
$author_rewrite["({$author->nicename})/([^/]+)/?$"] = \'index.php?post_type=art&name=$matches[2]\';
}
return $author_rewrite;
}
然后,如果不是在admin中,我需要在全局$wp\\u rewrite中禁用author\\u base:
if( !is_admin() ) {
add_action(\'init\', \'author_rewrite_base_null\');
}
function author_rewrite_base_null() {
global $wp_rewrite;
if( \'author\' == $wp_rewrite->author_base ) $wp_rewrite->author_base = null;
}
这对我起到了作用,希望对其他人有所帮助。