web-dev-qa-db-ja.com

URLの書き換えとページ付け

私はWordpressのカスタムURLの書き換えを完全にこなしていると言わなければなりません。 URLリライト用の正しいパターンを決定して書き込む方法の明確な説明を見つけるために、私は過去何日も検索しました。私はそれに渡されたクエリ変数を使用するカスタムページテンプレートを持っています。 http://example.com/pagename?user=username 。この「pagename」はカスタムページテンプレートを指し、「user」はカスタムクエリvarを指します。これをURL http://example.com/pagename/username を使って表現する必要があります。

私はまた、ページ付けで動作するために上記を必要とします。だから http://example.com/pagename/username/page/2 は表現できるはずです http://example.com/pagename/page/2?user=username

誰かが実用的な例とURL書き換えのための正しいパターンを決定して書く方法の説明を私に提供できれば素晴らしいでしょう。

よろしく、ジョン

3
John

@Stephen Harrisの優れた回答を拡張して、私は選択します。

add_action( 'generate_rewrite_rules', 'my_rewrite_rules' );
function my_rewrite_rules( $wp_rewrite )
{
    $wp_rewrite->rules = array(
        'mypageslug/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?pagename=mypageslug&user=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
        'mypageslug/([^/]+)/?$' => $wp_rewrite->index . '?pagename=mypageslug&user=' . $wp_rewrite->preg_index( 1 )

    ) + $wp_rewrite->rules;
}

これはWordPressコアで使用されている事実上の正規表現に従います。 Stephenのコードサンプルからの主な変更点は、書き換えが確実にWordPressにパススルーされるようにするための$wp_rewrite->indexの使用です(そうでなければ、それは 'external'rewriteリストに追加されるかもしれません)。

第二に、そして最も重要なことに、クエリ文字列でpagename変数を渡す - これはWordPressが普通スラッグmypageslugでページをロードしているかのように振る舞うことを意味します。

更新: userがパブリッククエリvarであることを確認して追加を忘れました。そうでなければWordPressはURLからそれをマッピングしません。 query_varsでそれをフィルタリングするか、グローバル$wpを使ってそれを追加します。

add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $vars )
{
    $vars[] = 'user';
}

// my preferred method - make sure you run this only after 'init' has fired!
$GLOBALS['wp']->add_query_var( 'user' );

// then once the request has been parsed (anything after the action 'parse_request')
$user = get_query_var( 'user' );
1
TheDeadMedic

私は同様の問題を抱えており、それをうまく解決しました。実際、私は最近 このブログ記事 を書いた。

WordPressはURlsをきれいにするためにルールを使用します。アイデアはルールを追加する関数を呼び出すためにフィルタを使用することです(そして設定>固定リンクへ行き、そして保存をクリックした後ルールを追加するべきです)。これはコードです:

add_action('generate_rewrite_rules', 'my_rewrite_rules');
function my_rewrite_rules( $wp_rewrite ) {
  $new_rules = array(
     'pagename/(.+)' => 'pagename?user='.$wp_rewrite->preg_index(1),
       );

  // Add the new rewrite rule into the top of the global rules array
  $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

その考えは、WordPressがURLがwww.example.com/pagename/somethingの形式であるかどうかを確認し、それを使ってユーザー変数を設定するというものです。

ページネーションを機能させるには、$ new_rules配列に次のルールを追加する必要があります - above すでに存在するルール(これはWordPressがルールを順番にチェックするためです)。

    'pagename/(.+)/page/?([0-9]{1,})' => 'pagename?user='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2),

同様に、www.example.com/pagename/something/page/2 sayをチェックし、これをexample.com/pagename?user=username&paged=2として解釈します。 (Pagedは、ページ割りでページを決定するためにWordPressによって認識されるクエリ変数です)。

お役に立てれば!

0
Stephen Harris