web-dev-qa-db-ja.com

URL書き換え+ページ+カスタム投稿の種類=異常なリダイレクト

さらに別のURL書き換えの問題:)

問題

私はうまくいくはずのURL書き換えルールを持っていますが、それはクエリvarを渡さずにリダイレクトするすべてのロジックに対してです。

ジューシー詳細

サイトのページ構造は次のように設定されています。

/私たちの会社/株主

また、 " shareholder "という名前のカスタム投稿タイプがあります。私の目標は、この構造を次のように機能させることです。

/私達の会社/株主/素晴らしい株主名

...そして株主ページでは、株主投稿に対するカスタムクエリを実行します。私は通常、株主投稿に書き換えスラグを使用しますが、コンテンツは元のページ構造(our-firm/shareholders)のコンテキストで表示されるようにします。

それを達成するために、私はfunctions.phpにこのコードを追加しました(そしてそれ以来パーマリンクに行き、規則を更新するために保存しました):

add_action( 'init', 'my_custom_rewrites' );
function my_custom_rewrites(){
    add_rewrite_rule(
        'our-firm/shareholders/([^/]+)/?',
        'index.php?pagename=shareholders&shareholder_name=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'my_custom_query_vars' );
function my_custom_query_vars( $query_vars ){
    $query_vars[] = 'shareholder_name';
    return $query_vars;
}

それで、/ our-firm/shareholders/awesome-shareholder-nameにアクセスすると、クエリvarを渡さずにShareholdersページにリダイレクトされ、実際にURLが/ our - 会社/株主/。変なのは、リダイレクトのページ名を他のものに変更した場合、それが機能し、クエリvarを簡単に渡すことです。

さらにテストするために、私は便利なRewrite Analyzerプラグインを使用し、これを入手しました。

書き換えアナライザーテストのスクリーンショット

その他の注意事項

  • 私はWP 3.2.1を実行していて、ローカルでテストしていますが、.htaccessをいじっていません。

  • 私の株主ページテンプレートは珍しいことはしていませんが、見る必要があるかどうかを私に知らせてください。

  • URLを特定するときにWordpressはカスタム投稿タイプのラベルを考慮に入れますか。 「株主」の複数形のラベルは、当然「株主」です。

  • 私はカスタム投稿タイプUIプラグインで "株主" CPTを追加しています。だれかが手助けをしてくれると思うなら、私は手動でコードを追加することができます。これらはCPT設定です:

    rewrite = true、slug = 'shareholder'、with_front = true、query var = true、およびhierarchy = true。

  • 私は以前「株主」として「株主」ポストタイプIDを持っていましたが、すぐにリダイレクトしようとしていたページと同じ名前の問題が発生する可能性があることに気付きました。私はその後投稿の種類を「株主」に変更しましたが、残念ながらこの問題は解決しませんでした。 ポストタイプの「株主」がいたという事実がこれに影響を与えているのだろうか? どこかに私が片付けることができる秘密の魔法のキャッシュがあるかもしれません...

  • Web上に少なくとも5つのbajillion WP URL書き換え投稿があることを私は知っていますが、私の特定の問題に関連するものを見つけることができないようです。私は1つを逃した場合申し訳ありません:)

私はこれで終わりです - I 知っている これでうまくいくはずですが、うまくいきません。うまくいけば、私は痛いほど明白な何かを逃したし、それは簡単な修正です。私がこれ以上詳細/コードなどを提供できるかどうか私に知らせてください。

どうぞよろしくお願いいたします。

3
herronicoras

Add_rewrite_rule()関数で設定した構造と同じように、( 'rewrite'パラメータ/オプションの) 'slug'を 'our-firm/shareholders'に設定してみてください。

書き換えを実際に機能させるには、add_rewrite_rule()の最初のパラメータとカスタム投稿タイプの 'rewrite'設定が等しくなければなりません。

そのため、カスタム投稿タイプの登録をコーディングすることを選択した場合、register_post_type()はこのようなものになります。

$args = array( 'rewrite' => array( 'our-firm/shareholders', 'with_front' => true ) );
register_post_type( 'shareholder', $args );

もちろん、$ args配列を他のキーで埋める必要があります。説明を簡単にするために 'rewrite'を指定しました。適切な登録を作成するためにこの関数のドキュメントに従ってください: http://codex.wordpress.org/Function_Reference/register_post_type

変更が反映されていない場合は、書き換え規則をフラッシュしてみてください。 [管理者ページ]> [設定]> [固定リンク] の[変更を保存]をクリックすると、安全な方法でこれを実現できます。

3
astiam

のドキュメントから

重要:デフォルトでは、WordPressは書き換えに使用されるカスタムクエリ文字列変数を認識しません。クエリ文字列変数をWordPressに登録する必要があります。書き換え後にadd_rewrite_tag()を使用してクエリ文字列変数の値を取得するだけで、上記の書き換えは機能しません。

私はWordPressが "shareholder_name"を認識していないと思います

これをする必要があります

add_action( 'init', 'my_custom_rewrites' );
function my_custom_rewrites(){

    add_rewrite_tag( '%shareholder_name%', '([^/]+)' );

    add_rewrite_rule(
        'our-firm/shareholders/([^/]+)/?',
        'index.php?pagename=shareholders&shareholder_name=$matches[1]',
        'top' );
}
0
rashid

カスタム投稿タイプに個別のsingle.phpファイルがありますか?

私は問題を抱えていました、そしてこれが状況でした:私は3つのカスタム投稿タイプがあります。私は最近新しいものを作成し、そのパーマリンクは私をdiffカスタム投稿タイプのページにリダイレクトします。すべての書き換えフラッシュルールなどを試してみましたが、問題は自分の新しいカスタム投稿タイプ用に個別のsingle.phpファイルがないため、新しい投稿タイプに既存の投稿へのリダイレクトがあることが原因であることがわかりましたデフォルトでは異なるタイプのものです。

ちょっと見てください、多分あなたは私のと同じ状況を持っています。がんばろう!

0
Justine Win

私は非常によく似た問題を抱えていて、書き換えアナライザーが私の書き換え規則に一致していることを示したが、ページが奇妙なリダイレクトをしていたことに当惑しました。私がこの記事を読んだら: http://www.dev4press.com/2012/tutorials/wordpress/practical/how-wordpress-url-rewriting-works/ 私は私がに書き込もうとしていた投稿に気づいた私の書き換え規則は「カスタム投稿タイプ」であるページだったので、wordpressはそのためのURL書き換えをサポートしていません。奇妙なリダイレクトは、その記事の最後にある「Canonical Redirect」のためです。 「ページ」ではなく「投稿」に書き換えてみましたが、うまくいきました。

0
MadMax1138

Add_rewrite_rule()の後に書き換え規則をフラッシュしてみましたか?

function my_custom_rewrites(){
    add_rewrite_rule(
        'our-firm/shareholders/([^/]+)/?',
        'index.php?pagename=shareholders&shareholder_name=$matches[1]',
        'top' );
    flush_rewrite_rules(false);
}

これはあなたが本番環境に残しておくものではありませんが、そのルールがあなたの書き換えに追加されているかどうかを判断することができます。あとで確認することもできます。

global $wp_rewrite;
var_dump($wp_rewrite->rules);

ルールが追加されたかどうかを確認します。

0
Josh