web-dev-qa-db-ja.com

カスタムリライトルールはすべてをindex.phpに送信しています

私は、ユーザーがチームで協力して映画を制作するサイトを作成しています。現在、私はチームマネージャのためにフロントエンドに編集ページを設定しています。ビューを新しいテンプレートページに送信するための値を指定せずに、単純にisset()でクエリvarをチェックしました。そのため、クエリvarの値に関係なく、URLで呼び出された場合は新しいテンプレートに移動します。

その部分は働いています。テンプレートは/ team /(teamname)?manageで正常にロードされています。そして私がやろうとしているのは、代わりに/ team /(teamname)/ manageのように書き直すことです。

しかし、私の問題はそれが機能していないこと、そしてフロントエンドのすべてのページがindex.phpにリダイレクトされていることです。 index.php?team = blah&manage、および?team =で呼び出される他のカスタム投稿を除くすべて。

これが私のカスタム書き換えルールのファイルです。

function generate_manage_rewrite_rules() {
    global $wp_rewrite;

    $new_rules = array(
        "(team|film)/([^/]+)/manage/?$" => "index.php?".$wp_rewrite->preg_index(1)."=".$wp_rewrite->preg_index(2)."&manage" 
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

add_filter('rewrite_rules_array', 'generate_manage_rewrite_rules');

私が触れていない私の.htaccessファイル:

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

# END WordPress

テンプレートリダイレクトとクエリ変数を設定するための私のファイル(私はこれが問題だとは思わないにもかかわらず):

function templateInclude( $template )
{
    if (is_single()) {

        global $wp_query;

        if( isset ( $wp_query->query_vars['manage'] ) ) {

            if ( is_manager() ) {

                $new_template = locate_template( array( '/template-team-manage.php' ) );
                if ( '' != $new_template ) {
                    return $new_template ;
                }
            }
        }
    }

    return $template;
}
add_action( 'template_include', 'templateInclude' );

また、 Rewrite Analyzerプラグイン をインストールして問題を解決しようとしましたが、インストール後にまったくロードされません。

3
Aly

ついにそれを考え出した。 1)最初の関数を単にinitではなく、rewrite_rules_arrayで呼び出していました。 2)それにはまだ何か問題がありましたが、私は今明らかになっていると思われる別の領域を探りましたが、それはあるように思われたので最初に私はそれを見ました。

https://codex.wordpress.org/Rewrite_API/add_rewrite_endpointhttps://make.wordpress.org/ plugins/2012/06/07/rewrite-endpoints-api /

エンドポイントを作成するだけです。 Wordpressには、私がやろうとしていたことを実行するための機能がすでに組み込まれていますが、検索するのに3日かかりました。

私は文字通り(.htaccessを除いて)上記のすべてを次のように置き換えました。

function manage_endpoint() {

    add_rewrite_endpoint( 'manage', EP_PERMALINK );

}
add_filter('init', 'manage_endpoint');
1
Aly