web-dev-qa-db-ja.com

wordpressで柔軟に「ランブル」URLを書き換える

私はこのようにID 17で私の投稿にアクセスしたいです。

http:// localhost/archives/17/moot-bla-foo-ramble

言い換えれば、idが決定するもので、それ以降のものはすべてナメクジなのかそうでないのかを問わない。同じページにつながるこれらのリンクとよく似ています(他の多くのサイトも同じです)。

私は私の.htaccessの一番上の近くでこのような書き換え規則を定義しようとしました:

RewriteRule ^archives/(\d{1,12})(?:/.*) archives/$1 [NC]

これははほとんどうまく動く、つまり正しいページに行きますが、その場合はpage-not-foundになります。ワードプレスは再びPATH_INFOを見て(筆者は)$query_stringstring attachment=moot-bla-foo-rambleであると述べています

私は301リダイレクトをしたくありません。

私のお気に入りまたはコース、そのようなものがパーマリンク設定にあった場合:カスタム構造

/archives/%post_id%/%wildcard%

それでも「大騒ぎ」を必須にするでしょうが、それ以上に良いのですが….

/archives/%post_id%(/%wildcard%)?

希望的な考えだと思います。

2
Frank Nocke

代わりにhtaccessを使うべきではなく、WordPress APIを使うべきです

例えば.

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'archives/(\d+)(?:/.*)+'    =>  'index.php?p='. $wp_rewrite->preg_index(1)
);

    // ( array merge must be done this way, to ensure new rule comes first )
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );
2
Tom J Nowell

基本的に@ Tomの答えと同じですが、提供された add_rewrite_rule ラッパーを使用します。

add_action('init','wpse48481_rewrite_rules');
function wpse48481_rewrite_rules(){
    add_rewrite_rule('^archives/([0-9]{1,})/','index.php?p=$matches[1]','top');
}

これは以下の形式のURLをチェックします。

 http://www.yoursite.com/archives/99/something-else

iD = 99のpost/page/cptとして解釈します。もちろん、正規表現はあなたが好きなものなら何でも構いません...

1
Stephen Harris

申し訳ありませんが、これらすべてが私を深い悩みの種にしました。タグとカテゴリのURLが突然機能しなくなり、「これは恥ずかしい」という空の検索ページが表示されます。

Anyrulesを追加せずにフラッシュすることによって引き起こされる中立で変化しないコールバックでさえも*/archives/tag/kiwis */archives/categories/fruitsのようなものを壊すでしょう。

すべて削除して/wp-admin/options-permalink.php(数値設定)を保存すると、もう一度修正されます。繰り返します。非常に検証済みwordpress.orgの このスレッド もご覧ください。

基本的に、一日を過ごすと、私はうまくいくように見える非常に単純なハックを思い付きました。これを.htaccesのwordpressブロックの前に追加する

RewriteRule ^archives/(\d{1,12})(?:/.*) archives/$1 [NC,L]

これを私のテーマのfunctions.phpに追加してください。直接。フックはありません。

if ( isset($_SERVER["REDIRECT_URL"]) )
    $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URL"];

うん、かなり汚い、$ _ SERVER変数への書き込み。さて、私のテストケースはすべてうまくいきます(単純なURL、ランダムなURL、タグ、カテゴリなど)(nb:開始ページがうまく動作しなくなった場合を除いて(終わりのないリダイレクトループ)

0
Frank Nocke