更改不同角色的编写器基础插件

时间:2011-05-12 作者:Maxim Zubarev

有没有可能根据作者的角色来更改作者基础slug?例如,作者可以获得示例。com/ninja/%用户名%和订阅者获得示例。com/培训生/%用户名%?

我在想这样的事情:

add_action(\'init\', \'set_new_author_base\');
function set_new_author_base() {
  global $wp_rewrite;

  if($user->role == \'subscriber\')
    $author_slug = \'trainee\';
    $wp_rewrite->author_base = $author_slug;
  } elseif($user->role == \'author\') {
    $author_slug = \'ninja\';
    $wp_rewrite->author_base = $author_slug;
  }
}
它应该适用于未注册的访问者,如果他们浏览网站,它应该适用于登录的作者和订阅者自己。

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

在您的示例中,作者重写模式从/author/[authorname]//[author_level]/[author_name]/. 如果我们允许[author_level] 无论如何,我们都会与页面规则发生冲突,因为/[anything]/[anything]/ 可以是作者存档或常规子页面。

因此,我的解决方案假设您的作者级别数量有限,因此我们可以将其明确地放入重写规则中。所以/ninja/[anything]/ 将是作者档案,但/not-ninja/[anything]/ 将是常规页面。

更改URL结构通常包括两部分:更改WordPress将接受的URL和更改WordPress将生成的URL。首先,我们将通过引入一个新的重写标记并将作者库设置为该标记来更改WordPress将接受的URL。

// I assume you define these somewhere, this is just to make the example work
$wpse17106_author_levels = array( \'trainee\', \'ninja\' );

add_action( \'init\', \'wpse17106_init\' );
function wpse17106_init()
{
    global $wp_rewrite;
    $author_levels = $GLOBALS[\'wpse17106_author_levels\'];

    // Define the tag and use it in the rewrite rule
    add_rewrite_tag( \'%author_level%\', \'(\' . implode( \'|\', $author_levels ) . \')\' );
    $wp_rewrite->author_base = \'%author_level%\';
}
如果使用my Rewrite Analyzer 您会注意到它包含了平原的额外规则/[author-level]/ 页。这是因为WordPress为每个包含重写标记的目录部分生成规则,如%author_level%. 我们不需要这些,所以请过滤掉所有不包含author_name:

add_filter( \'author_rewrite_rules\', \'wpse17106_author_rewrite_rules\' );
function wpse17106_author_rewrite_rules( $author_rewrite_rules )
{
    foreach ( $author_rewrite_rules as $pattern => $substitution ) {
        if ( FALSE === strpos( $substitution, \'author_name\' ) ) {
            unset( $author_rewrite_rules[$pattern] );
        }
    }
    return $author_rewrite_rules;
}
现在WordPress应该使用这种新模式接受URL。剩下要做的唯一一件事就是更改它在创建指向作者存档的链接时生成的URL。为此,您可以author_link 过滤器,如以下非常基本的示例:

add_filter( \'author_link\', \'wpse17106_author_link\', 10, 2 );
function wpse17106_author_link( $link, $author_id )
{
    if ( 1 == $author_id ) {
        $author_level = \'ninja\';
    } else {
        $author_level = \'trainee\';
    }
    $link = str_replace( \'%author_level%\', $author_levels, $link );
    return $link;
}

结束

相关推荐

将作者slug从用户名更改为昵称

大家好,如果可用,是否可以将默认用户名slug更改为昵称?默认情况下,url类似于:http://domain.tld/author/(admin) ,是否可以重写并更改为http://domain.tld/author/(nickname) 那么,如果用户在个人资料页面上更改昵称,slug也会更改为用户指定的新名称?非常感谢<菲利普