異なる役割の著者ベーススラッグを変更する


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 '13年

著者ベースを触っては無理だと思います。別の書き換えルールを設定し、作成者のパーマリンクをフィルターする必要があります。
fuxia

回答:


9

あなたの例では、作成者はパターンをから/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%';
}

結果の書き換えルールを私の書き換えアナライザーで確認すると、プレーン/[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ではありませんか?書き換えルールを変更するだけで、1人の作成者用の正規パーマリンクを作成する方法はありません。A user_metaが役立つ可能性があります…
fuxia

はい、どちらも有効ですが、標準関数を使用する場合、author_linkフィルターを介してリンクされるのはそのうちの1つだけです。redirect_canonical()これが本当に気になる場合は、コアと同じように「正規チェック」を追加することもできます。user_metaここでどのように役立つかわかりませんか?私のauthor_link例は単純すぎるため、忍者を訓練生から分離するためにサイト固有のロジックが必要です。
Jan Fabry、

これは本当に素晴らしい解決策です、本当にありがとう!サイト固有のロジックとはどういう意味ですか?
Maxim Zubarev、

@dotwired:まあ、私はあなたのサイトがどのユーザーが忍者でどれが研修生であるかをどのように定義するのかわからないので、あなたはauthor_link自分でそのフィルターを完成させる必要があります。(実際にあなたはそれを伝えました-著者は忍者であり、購読者は訓練生です-しかし私のコードはその部分を完了するのに十分であり、他の人もそれから学ぶことができるように十分に一般的でなければなりません。)
Jan Fabry

ないauthor_rewrite_rulesすべてのページのロード上で実行?
ヘンリーライト、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.