web-dev-qa-db-ja.com

作成者ページへの書き換えエンドポイントの追加+ページ付け

URLが次のようになるように、作成者ページに新しいエンドポイントを追加します。

http://example.com/writer/username/articles

これまでのところ、私は持っています:

  • 作者ベースを変更
  • 書き換えルールを追加しました
  • Query_varsを設定します。
  • エンドポイントを追加しました
  • テンプレートを使用するためにtemplate_redirectを使用しました

結果:404ページが見つかりません(書き換えルールをフラッシュした後でも)。私は問題がどこにあるのかわからない。エンドポイントにページ付けを追加したいと思います。以下が私のコードです:

著者ベースを変更しました:

function foo_change_author_base() {
    global $wp_rewrite;
    $wp_rewrite->author_base = 'writer';
}
add_filter( 'init', 'foo_change_author_base', 0 );

書き換え規則を追加しました。

function foo_rewrite_rule()
{
    add_rewrite_rule( 'writer/([^/]+)/articles(/(.*))?/?$', 'index.php?author_name=$matches[1]&articles=$matches[3]', 'top' );
}
add_action( 'init', 'foo_rewrite_rule' );

Query_varsを設定します。

function foo_add_vars($vars) {
    $vars[] = 'articles';   
    return $vars;
}
add_filter('query_vars', 'foo_add_vars');

エンドポイントを追加しました:

function foo_add_endpoint() {
    global $wp_rewrite;
    add_rewrite_endpoint( 'articles', EP_AUTHORS | EP_PAGES );
}
add_action( 'init', 'foo_add_endpoint');

そして私のテンプレートを追加しました:

function foo_rewrite_template()
{
    global $wp_query;

    if ( array_key_exists( 'articles', $wp_query->query_vars ) ) {
        include (get_template_directory_uri() . '/articles.php');
        exit;
    }
}
add_action( 'template_redirect', 'foo_rewrite_template' );
3
chowwy

あなたのコードはうまくいくはずです。この線:

include (get_template_directory_uri() . '/articles.php');

Http経由でファイルをインクルードしようとしているので、サーバー設定でallow_url_include = 1を指定する必要があります。これをチェックできますか?

また、template_redirectを実際のリダイレクトに使用する必要があることを知っておく必要があります。ここで、include()は望ましくない影響を与える可能性があります。本当に欲しいのはtemplate_includeだと思います:

add_filter('template_include', 'my_template_include');

function my_template_include( $template ) {
    global $wp->query;
    if ( array_key_exists( 'articles', $wp_query->query_vars ) ) {
        return get_template_directory() . '/articles.php';
    }
   return $template;
}

だからここに私のコードです:

function foo_change_author_base() {
    global $wp_rewrite;
    $wp_rewrite->author_base = 'writer';
}
add_filter( 'init', 'foo_change_author_base', 0 );

function foo_rewrite_rule()
{
    add_rewrite_rule( 'writer/([^/]+)/articles/page/([0-9]{1,})/?$', 'index.php?author_name=$matches[1]&articles=1&paged=$matches[2]', 'top' );
    //If you don't want the last trailing slash change the las /?$ to just $
    add_rewrite_rule( 'writer/([^/]+)/articles/?$', 'index.php?author_name=$matches[1]&articles=1', 'top' );
}
add_action( 'init', 'foo_rewrite_rule' );

function foo_add_vars($vars) {
    $vars[] = 'articles';   
    return $vars;
}
add_filter('query_vars', 'foo_add_vars');

function foo_add_endpoint() {
    add_rewrite_endpoint( 'articles', EP_AUTHORS );
}
//add_action( 'init', 'foo_add_endpoint'); // Commented out
// Edit: add_rewrite_endpoint is not needed when using add_rewrite_rule


// auto-add the articles endpoint to author links
function foo_author_link_filter( $link, $author_id, $author_nicename ) {
    return user_trailingslashit($link) . 'articles/';
}
add_filter( 'author_link', 'foo_author_link_filter', 20, 3);

add_filter('template_include', 'foo_template_include');
function foo_template_include( $template ) {
    global $wp_query;
    //You may need some other checks
    if ( array_key_exists( 'articles', $wp_query->query_vars ) ) {
        return get_template_directory() . '/articles.php';
    }
    return $template;
}

今すぐyoursite.com/writer/author_name/articles/にアクセスしてください。

4
cybmeta

まずエンドポイントを追加する場合は、書き換え規則を追加する必要はありません。ただし、ページングを処理したい場合は、書き換え規則を使用してください。実際には2つの書き換え規則があります。

その後、あなたの記事のクエリvarは単に存在するかしないかを含むものではありません。このため、存在する場合は1に設定するだけです。

それから、@ cybnetが彼の答えで提案しているように、テンプレートインクルードにフィルタを追加するだけです。

すべてのコードは次のようになります。

function foo_change_author_base() {
    global $wp_rewrite;
    $wp_rewrite->author_base = 'writer';
}
add_filter( 'init', 'foo_change_author_base', 0 );

function foo_add_vars($vars) {
    $vars[] = 'articles';   
    return $vars;
}
add_filter('query_vars', 'foo_add_vars');  

function foo_rewrite_rule() {
    add_rewrite_rule( 'writer/([^/]+)/articles/page/([^/]*)$', 'index.php?author_name=$matches[1]&articles=1&paged=$matches[2]', 'top' );
    add_rewrite_rule( 'writer/([^/]+)/articles(.*)$', 'index.php?author_name=$matches[1]&articles=1', 'top' );
}
add_action( 'init', 'foo_rewrite_rule' );

function foo_rewrite_template( $template ) {
    if ( ! is_author() ) return $template;
    global $wp_query;
    if ( $wp_query->get('articles') ) return ( get_template_directory(). '/articles.php');
    return $template;
}
add_filter( 'template_include', 'foo_rewrite_template' );

// add a filter to author link, so 'get_author_posts_url' return the customized url
function foo_author_link_filter( $link, $author_id, $author_nicename ) {
    return user_trailingslashit($link) . 'articles/';
}
add_filter( 'author_link', 'foo_author_link_filter', 20, 3);

それはページ付けとうまくいくでしょう。パーマリンク設定をもう一度保存することだけを忘れないでください。


このコードをテストする私のテスト環境からの印刷画面の下に、

enter image description here

1
gmazzap