web-dev-qa-db-ja.com

フィルタリングのためにURLをハイジャックする

そう、これが契約です。私は、ニュースの投稿を表示するループを持っています。これらの投稿は特別なカテゴリ(通常のカテゴリではない)に属することができ、それらによってフィルタリングできるようにしたいです。

私が美学にあまり興味がなかったら私はこのようなリンクを使用したいと思います:

domain.com/news?filter=cat1

しかし、代わりに私がやりたいことはこれです("書き換え):

domain.com/news/cat1 » domain.com/news/?filter=cat1

.htaccessの値をGET変数として渡すようにcat1を変更しました。

RewriteEngine On
RewriteBase /
RewriteRule ^news/(.*)/$ /news/?filter=$1 [L,QSA]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

問題は、これがfilter変数を正常に渡しているにもかかわらず、WordPressが/cat1/をページとして扱うため、明らかにそれが見つからないため、404がスローされることです。

WordPressが404を起動せずにこの特定のURLの書き換えを許可する方法はありますか? URLをアドレスバーに取り込んで解析しているようです。書き換えられたURLを解析することが本当に必要なのです。

ありがとう

3
Ben Everard

WordPressには書き換えメカニズムもあります。.htaccessファイルではなく、それを使用することをお勧めします。

独自の書き換え規則を追加することができます。あなたの場合はcat1部分を別のクエリ変数に格納したいので、このクエリ変数を許可するようにWordPressに指示する必要があります(安全のためホワイトリストを使用します)。

書き換え規則の正確な形式はhttp://domain.com/news/の内容によって異なります。カスタムテンプレートを含むページなのか、それとも他のものなのか。 (my Rewrite analyzer plugin を使って)これを見つけて、これを書き換えルールに追加してください。

add_action( 'init', 'wpse16819_init' );
function wpse16819_init()
{
    // Base form, will probably not work because it does nothing with the `news` part
    add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?wpse16819_filter=$matches[1]', 'top' );
    // Use this instead if `news` is a page
    add_rewrite_rule( 'news/([^/]+)/?$', 'index.php?wpse16819_filter=$matches[1]&pagename=news', 'top' );
}

add_filter( 'query_vars', 'wpse16819_query_vars' );
function wpse16819_query_vars( $query_vars )
{
    $query_vars[] = 'wpse16819_filter';
    return $query_vars;
}

このコードを追加した後は、flush(書き換えルールをデータベースに保存してください)を忘れないでください。これを行うには、管理領域のパーマリンクページにアクセスします。

get_query_var( 'wpse16819_filter' );wpse16819_filter変数にアクセスできます。

2
Jan Fabry