web-dev-qa-db-ja.com

Wordpress Rewriteまたは.htaccessによるURL書き換え

私がこれをどのように解決したかを見るには、EDIT8にジャンプします


Wordpressブログ:www.animals.comです。テーマディレクトリに特定のPHPファイルがあります:www.animals.com/wp-content/themes/mytheme/db.php。また、そのためのカスタムテンプレートがあります。 Wordpress管理パネルで新しいページを作成して、db.phpを表示します:www.animals.com/database

したがって、ライオンについて何かを読みたい場合は、www.animals.com/database/?animal=lionに移動します(これは、PDOなどを使用して、$ _ GET ['animal']からの値をクエリに挿入するPHPを作成する方法であるためです)。

今、www.animals.com/database/?animal=lionwww.animals.com/lionとしてアクセスしたいと思います。

.htaccessまたはWordpress Rewriteを使用する必要がありますか?.htaccessは、Wordpressフォルダーのルート(wp-config.phpおよびこれらのファイル)または私のテーマディレクトリ?

ルートからのものはRewriteBase /とWordpressからのものをデフォルトで持っています。私が望むものを達成するために何を書くべきですか?それを既存のコードの前または後に置くべきですか?

[〜#〜] edit [〜#〜]:これは私のpublic_html .htaccessであり、これは私が本当にしたいことです:I www.domain.comのウェブサイトがあり、これをhttp://www.domain.com/dios/?dios=agniと入力すると、アグニ神に関する情報が表示されます。 Agni神に関する情報にアクセスするには、www.domain.com/dioses/agniと入力します。 PHPファイルはwww.domain.com/wp-content/themes/smitespain/dios.phpにありますx_xが機能していません

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^dioses/(\w*)$ dios/?dios=$1 [NC,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

EDIT2:私はマルチサイトを使用しています(EDIT4をチェック)、そして/ database// dios /と/ dioses /はnot実際のフォルダーです私が作成したのは、Wordpressで作成したページの名前です。問題は、タブのタイトル:Sに神の名前を表示することです。これは、変数$ _GET ['dios']が設定されていることを意味しますが、ファイル(dios.php)をロードしません= /

EDIT:具体的にはdomain.com/dios/?dios=agniにアクセスする必要があります。これは、PHPファイル(dios.php)をワードプレスからget_header()をロードするので、ファイルに直接アクセスできません

EDIT4:マルチサイトのものを削除することにしました

EDIT5:これらはWordpress私が持っているページ:domain.com/dioses/ for (www.domain.com/wp-content/themes/smitespain/dioses.php)
domain.com/dios/?dios=thor for (www.domain.com/wp-content/themes/smitespain/dios.php)

EDIT6:wordpress codex ..で何かを読んでいましたが、domain.com/diosesにアクセスしたい場合、domain.com/index.php?pagename=diosesまたはdomain.com/?pagename=diosesにアクセスしてアクセスできます。
それで、これをRewritebase /と次のルールの間に追加しました:RewriteRule example/test ?pagename=diosesdomain.com/example/testは私をdomain.com/diosesにリダイレクトしますが、アドレスバーのURLも変更します:(
これを試してみると、RewriteRule example/test ?pagename=dios&dios=thorを指定すると、「?dios = thor」なしで「dios」ページに移動します。

EDIT7:wordpress rewriteを使用し始めました。これをテーマのfunctions.phpに追加しました:

function my_rewrite_rules() {  
    add_rewrite_rule(  
        'blah',
        'index.php?pagename=dios&dios=agni',  
        'top'  
    );  
}  
add_action( 'init', 'my_rewrite_rules' );

そして再び..itは?dios = agniなしでページdiosをロードします

EDIT8:そして最後に、なんとかそれを機能させることができました=)
最初に知っておく必要があるのは、新しい?dios=XXXX$_GET['dios']で使用できなくなり、代わりに$wp_query->query_vars['dios']を呼び出す必要があるため、これをテーマのfunctions.phpに追加したことです。

function add_query_vars($new_var) {
$new_var[] = "dios";
return $new_var;
}
add_filter('query_vars', 'add_query_vars');

function add_rewrite_rules($rules) {
$new_rules = array('([^/]+)' => 'index.php?pagename=dios&dios=$matches[1]');
$rules = $new_rules + $rules;
return $rules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');

$wp_query->query_vars['dios']が実際に設定されていることを確認します
その後、通常のルールを追加します

13
johnRivs

WordPressに触れずに解決する別の方法があります。

.htaccessに追加

RewriteRule ^lion /indexw.php?pagename=db&dios=$1 [L,E=URI:/detail/]

Indexw.phpファイルを作成します。

<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");

使い方? mod_rewriteは、E = URI:value引数で指定されたREDIRECT_URIを設定します。 indexw.phpはREQUEST_URIを正しい値で上書きするだけです(これに関する洞察を提供してくれたRavi Thapliyalに感謝)

3
huksley

WordPressは、識別されていないすべてのもの(つまり、既存のファイルやフォルダーではない/index.php)のルートにグローバルリダイレクトを配置します。一方、それらを?animal=unidentifiedにリダイレクトしたいとします。したがって、動物のキーワードのリストが修正されない限り、提案された解決策はWordPressを台無しにする可能性があります。

もし10奇数の動物がいたら、以下のように.htaccessに追加できます(ルート/)

RewriteEngine on
RewriteBase /

RewriteRule ^(lion|leopard|tiger|dog|cat)/?$ database/?animal=$1 [NC,L]

# WordPress rules come here

40奇数の動物の場合は、動物のディレクトリ(存在する必要はありません)のプレフィックスを付けることをお勧めします。

RewriteRule ^a/(.+?)/?$ database/?animal=$1 [NC,L]

これにより、/a/critterdatabase/?animal=critterにリダイレクトされ、手動で.htaccessに追加する必要がなくなります。両方のルールを共存させることもできます。これにより、/pantherの.htaccessを変更していない場合でも、/a/pantherでアクセスできます。

編集:
さて、調査しましたが、PHPスクリプトがこのリクエストをインターセプトしてindex.phpに転送するためのスクリプトを書くことなくしては不可能です。mutisiteの仕組みは次のとおりです。書き換えに一致するものがないため、WordPressのphpコードのエントリポイントであるindex.phpに移動します。どこか深いところで、コードはREQUEST_URIヘッダーをチェックして、マルチサイト(/dios)および存在する場合は、構成されたページ(dios.php)に要求を転送します。

/dioses/agniに対して.htaccessリダイレクトを実行すると、index.phpをヒットできますが([L]を削除することにより)、REQUEST_URIヘッダーは同じまま(/ dioses/agni)であり、そのために構成されたmulisite。したがって、リダイレクトは失敗します。

1
Ravi Thapliyal
RewriteEngine On
RewriteCond %{QUERY_STRING}  ^$
RewriteRule ^www\.animals\.com/lion$ /www.animals.com/database/?animal=lion [R=301,NE,NC,L]

このコードを使用してください。うまくいくことを願っています。

1
Arafin Rubab

URLの書き換えは、add_filter('rewrite_rules_array', function() {})を呼び出しても、add_rewrite_rule()を呼び出しても機能しません。どうやらフィルター'rewrite_rules_array'はフロントエンドWebサイトのページを開いたときにトリガーされなかったため、書き換えは生成されませんでした。

解決策は、管理エリアに移動し、ページの設定->パーマリンクを開くことでした。書き換えを変更するたびに、これを行う必要があります。

Vanilla Wordpressがそのように機能するかどうかはわかりません。これはおそらく、インストールされているプラ​​グイン/テーマが原因です。

0
gvlasov