web-dev-qa-db-ja.com

ロールごとに作者ベーススラッグを変更する

役割に応じて作者ベーススラッグを変更することは可能ですか?たとえば、作者は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;
  }
}

彼らがサイトを閲覧すればそれは未登録の訪問者のために働くべきであり、それはログインした作者と購読者自身のために働くべきです。

8
Maxim Zubarev

あなたの例では、作者はパターンの変更を/author/[authorname]/から/[author_level]/[author_name]/に書き換えます。 [author_level]を何かにすることを許可すると、/[anything]/[anything]/は著者アーカイブまたは通常のサブページになる可能性があるため、ページの規則と矛盾することになります。

このため、私のソリューションでは、作成者レベルの数が限られていると想定しているため、それらを書き換え規則に明示的に含めることができます。 /ninja/[anything]/は作者のアーカイブになりますが、/not-ninja/[anything]/は通常のページになります。

URL構造を変更することは常に2つの部分から成ります:WordPressが受け入れるURLを変更することとWordPressが生成するURLを変更すること。最初に、新しい rewriteタグ を導入して著者のベースをそのタグに設定することによって、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;
}
8
Jan Fabry