将作者基础信息更改为不同的角色


9

是否可以根据他的角色来更改作者的基本资料?例如,作者获得example.com/ninja/%username%,订户获得example.com/trainee/%username%?

我在想类似的东西:

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;
  }
}

如果未注册的访问者浏览该网站,则该方法应该适用;对于已登录的作者和订阅者本身,该方法也应适用。


该插件可以满足您的需求。如果您不想使用插件,则可以在源代码中找到问题的答案。
supajb

我认为通过接触作者库是不可能的。您必须设置单独的重写规则并过滤作者永久链接。
fuxia

Answers:


10

在您的示例中,作者重写模式从更改/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%';
}

如果使用我的重写分析器检查生成的重写规则,您会注意到它包含用于纯/[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;
}

但不是trainee/john/ninja/john/现在一样的作者都有效的URI?仅通过更改重写规则就无法为一位作者创建规范的永久链接,对吗?一个user_meta可以帮助...
福厦

是的,它们都是有效的,但是如果您使用标准功能,则只能通过author_link过滤器链接到其中一个功能。redirect_canonical()如果您真的很在乎,还可以像核心一样添加额外的“规范检查” 。我不知道这对user_meta您有什么帮助?我的author_link示例太简单了,它需要特定于站点的逻辑来将忍者与受训者分开。
1

这仍然是一个非常好的解决方案,非常感谢!您特定于站点的逻辑是什么意思?
Maxim Zubarev

@dotwired:好吧,因为我不知道您的网站如何定义哪些用户是忍者,哪些是受训者,所以您必须自己完成author_link过滤。(实际上,您确实告诉过我-作者是忍者,订阅者是受训者-但我的代码应足以完成该部分并具有足够的通用性,以便其他人也可以从中学到。)
Jan Fabry

是否author_rewrite_rules在每个页面加载时运行?
henrywright 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.