web-dev-qa-db-fra.com

Forcer un modèle spécifique basé sur l'URL

Lorsqu'un utilisateur accède à un URI commençant par "/ forums", WordPress doit appeler un modèle spécifié. Par exemple, toutes ces URL:

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

... devrait appeler le modèle suivant: mytheme/page-forums.php

Je pense que cela implique WP_Rewrite , mais je ne sais pas quoi faire à partir de maintenant.

Des idées?

1
Matt

J'ai inclus du code que j'utilise chaque fois que je dois faire des ajouts aux règles de réécriture de Wordpress. Il injecte des règles supplémentaires dans la logique de réécriture normale de Wordpress afin que vous puissiez diriger Wordpress vers des fichiers de modèle spécifiques basés sur l'URL. Vous pouvez le modifier selon vos besoins en ajoutant plus de règles à la fonction create_rewrite_rules () et de query_vars à la fonction add_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