web-dev-qa-db-ja.com

正しいページをロードしていないadd_rewrite_ruleが変数を取得していない

Showreelのタイトルと動画のIDをURLに変換して、そのページにアクセスできるようにしています。

私は同じURLに2つを持っていて、それがうまくいかないか、どちらか一方だけが入ってくるのです。現在、ページは見つかりませんか? (私は常にパーマリンクをフラッシュしています)

変数を取得したいURLは、director/test-director/showreel / showreel-name / video / 111 /のようになります。

このサイトは現在independent_02という名前のテスト用フォルダに置かれていますが、それが何かに影響を与えるかどうかはわかりませんか?

これがコードです。

function wpse13483_init() {

    add_rewrite_rule( 'directors/(.+?)/showreels/([^/]+)?/?$', 'index.php?category_name=$matches[1]&showreel=a', 'top' );
    add_rewrite_rule( 'directors/(.+?)/showreels/([^/]+)/video/([^/]+)?/?$', 'index.php?category_name=$matches[1]&showreel=c1&video=c2', 'top' );
    // directors is a custom post_type and should go to single-directors.php

    add_rewrite_rule( 'showreels/(.+?)/video/([^/]+)?/?$', 'index.php?category_name=$matches[1]&video=b', 'top' );
    // showreels is a custom post_type and should go to single-showreels.php

}
add_action( 'init', 'wpse13483_init' );

どんな助けにも感謝します!


_ updates _ - このルールは、ほとんどがうまく機能し、変数を捕らえています。しかし、それはarchive.phpで、directors-single.phpではなくです。

add_rewrite_rule( 'directors/(.+?)/showreels/([^/]*)/video/([^/]*)/?', 'index.php?post_type=directors&showreel=$matches[2]&video=$matches[3]', 'top' );
// directors is a custom post_type and should go to single-directors.php

私は '?post_type = directors'と関係があると思いますが、single.phpをロードするためにこれがどうなるべきかについての参照を見つけることができません。

UPDATE 2 Rewrite analyseriを見ると、post_type変数がないと思いますか。 rules

4
v3nt

これはうまくいくようです!

post_type = director& name = $ matches [1]がキーと思われる

add_rewrite_rule( 'directors/([^/]*)/showreels/([^/]*)/video/([^/]*)/?', 'index.php?post_type=directors&name=$matches[1]&showreel=$matches[2]&video=$matches[3]', 'top' );

だから今最終コード。

function wpse13483_init() {

    add_rewrite_rule( 'directors/([^/]*)/showreels/([^/]*)/video/([^/]*)/?', 'index.php?post_type=directors&name=$matches[1]&showreel=$matches[2]&video=$matches[3]', 'top' );

}
add_action( 'init', 'wpse13483_init' );

function wpa52794_query_vars( $vars) {
    $vars[] = 'video';
    $vars[] = 'showreel';

    return $vars;
}
add_filter( 'query_vars', 'wpa52794_query_vars' );
2
v3nt

WordPressは、デフォルトでは理解できないクエリ変数を取り除きます。そのため、カスタム書き換えルールを登録することに加えて、alsoカスタムクエリ変数を登録する必要があります。

add_filter( 'query_vars', 'wpa52794_query_vars' );
function wpa52794_query_vars( $vars ) {
    $vars[] = 'video';
    $vars[] = 'showreel';

    return $vars;
}

答えをさらに完成させるために、通常のクエリ変数WordPressが期待しているものも指定する必要があります。あなたの元の例は、あなた自身のコメントですでにメモしたように、post_typeまたは投稿を識別するもの(ID、名前、スラッグなど)を渡していません。これがないと、WordPressはリクエストを内部的にルーティングする方法を理解しません。

書き換えアナライザーでこれを発見したことに対する称賛。それは確かに行方不明の部分でした。

2
EAMann

@EAMannの回答に加えて、私はあなたが書き換えルールをフラッシュする必要があると言うことができます。

@EAMannの回答

add_filter( 'query_vars', 'wpa52794_query_vars' );
function wpa52794_query_vars( $vars) {
    $vars[] = 'video';
    $vars[] = 'showreel';

    return $vars;
}

書き換えルールをフラッシュします

function myplugin_activation() {
    flush_rewrite_rules();
}
register_activation_hook ( __FILE__, 'myplugin_activation' );

function myplugin_deactivation() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivation' );
0
Eugene Manuilov