web-dev-qa-db-ja.com

URLに基​​づいて特定のテンプレートを強制する

ユーザーが "/ forums"で始まるURIを参照するとき、WordPressは指定されたテンプレートを呼び出すべきです。たとえば、次のURLすべて

  • mysite.com/forums
  • mysite.com/forums/questions
  • mysite.com/forums/questions/1/my-question
  • mysite.com/forums/questions/ask
  • mysite.com/forums/users

...次のテンプレートを呼び出す必要があります。mytheme/page-forums.php

これにはWP_Rewriteが含まれると思いますが、ここから何をすべきかわかりません。

何か案は?

1
Matt

私はWordpressの書き換え規則を追加する必要があるときはいつでも私が使ういくつかのコードを含めました。 URLに基​​づいて特定のテンプレートファイルにWordpressを指示できるように、通常のWordpressの書き換えロジックに追加の規則を挿入します。 create_rewrite_rules()関数にルールを追加し、add_query_vars()関数にquery_varsを追加することで、ニーズに合わせて変更できます。

<?php // Forums Class //
$ForumsCode = new Forums();
register_activation_hook( __file__, array($ForumsCode, 'activate') );

add_filter('rewrite_rules_array', array($ForumsCode, 'create_rewrite_rules'));
add_filter('query_vars',array($ForumsCode, 'add_query_vars'));

add_filter('admin_init', array($ForumsCode, 'flush_rewrite_rules'));
add_filter('template_include', array($ForumsCode, 'template_redirect_intercept'));

class Forums {

     function activate() {
        global $wp_rewrite;
        $this->flush_rewrite_rules();
    }

    function create_rewrite_rules($rules) {
        global $wp_rewrite;
        $newRule = array('forums/(.+)' => 'index.php?forumdata='.$wp_rewrite->preg_index(1));
        $newRule2 = array('forums/questions/(.+)' => 'index.php?questions=true&forumdata='.$wp_rewrite->preg_index(1));
        $newRules = $newRule + $newRule2 + $rules;
        return $newRules;
    }

    function add_query_vars($qvars) {
        $qvars[] = 'forumdata';
        return $qvars;
    }

    function flush_rewrite_rules() {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }

    function template_redirect_intercept($template) {
        global $wp_query;
        if ($wp_query->get('forumdata')) {
            $template = get_bloginfo('template_url') . '/page-forums.php';
        }
        return $template;
    }

    function pushoutput($message) {
        $this->output($message);
    }

    function output( $output ) {
        header( 'Cache-Control: no-cache, must-revalidate' );
        header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' );
        echo json_encode( $output );
    }
}
2
Dave Hunt