route du plugin personnalisée dans Wordpress

10

D'accord, ma question est assez simple. Je dois implémenter des règles de routage personnalisées pour mon plugin. Ces routes ne prendraient qu’un seul argument (donc rien de compliqué) et ressembleraient à: enlace

Et idéalement, ceci appellerait une classe personnalisée et afficherait un modèle personnalisé (pouvant directement accéder à la classe).

Quelle est la meilleure approche pour cela? A la vôtre

    
posée Fran 10.07.2012 - 21:14

2 réponses

12

Vous devez faire 3 choses importantes.

  1. Créer une règle de réécriture personnalisée pour transformer des parties de l'URI en valeurs transmises à index.php
  2. Ajouter myroute et myargument en tant que requête vars à wordpress sait qu'ils sont des paramètres valides $ _GET lorsque les règles de réécriture leur transmettent quelque chose
  3. Videz les règles de réécriture.

Tout d'abord, je vais vous recommander au lieu de http://www.example.org/myroute/myargument , de choisir un préfixe ou un suffixe spécial pour indiquer quand l'uri doit être considéré comme l'un de ces "itinéraires" spéciaux. Pour les besoins de cet exemple, j'ai choisi le préfixe api , de sorte qu'il s'agisse de http://www.example.org/api/myroute/myargument . J'ai choisi api parce que lorsque j'ai fait quelque chose de reposant, comme ce sur quoi vous semblez travailler, c'était pour une API.

Le code

add_filter( 'rewrite_rules_array','my_insert_rewrite_rules' );
add_filter( 'query_vars','my_insert_query_vars' );
add_action( 'wp_loaded','my_flush_rules' );

// flush_rules() if our rules are not yet included
function my_flush_rules(){
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['api/(.*?)/(.+?)'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

// Adding a new rule
function my_insert_rewrite_rules( $rules )
{
    $newrules = array();
    $newrules['api/(.*?)/(.+?)'] = 'index.php?myroute=$matches[1]&myargument=$matches[2]';
    return $newrules + $rules;
}

// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars )
{
    array_push($vars, 'myroute', 'myargument');
    return $vars;
}

Ventilation rapide

C’est assez simple, le motif regex est ajouté à la liste de toutes les règles de réécriture dans WordPress, et votre motif personnalisé figure en bas de la liste. Lorsqu'il y a correspondance avec le motif, WordPress cesse de regarder et passe les valeurs capturées aux références arrière de la chaîne index.php.

L'ajout des vars de requête les rend myroute et myargument valides pour index.php à gérer.

Autre moyen de "lier l'espacement" à votre itinéraire personnalisé

Si vous souhaitez éviter d'utiliser /api/ comme préfixe, vous pouvez utiliser une chaîne de requête var à la place. Pour faire quelque chose comme ça, changez l'expression rationnelle en quelque chose comme (.*?)/(.+?)\?api=1 puis ajoutez api comme paramètre supplémentaire à la fonction array_push dans my_insert_query_vars() .

Cela modifierait l'itinéraire personnalisé à déclencher à chaque fois qu'il y a http://example.com/anytext/anytext?json=1 .

Ignorez l'utilisation du terme 'namespacing' - vous ne l'avez utilisé que par souci de concision.

Si vous ne possédez pas d’espace de noms avec un préfixe ou un suffixe, vous vous retrouverez avec des motifs uri en collision. En effet, WordPress n'aura aucun moyen de distinguer votre modèle personnalisé de celui destiné à être un message ou une page. Comment wordpress pourrait-il savoir si cette "route" n'est ni une taxonomie, ni un terme, ni une page parente?

J'espère que cela vous aidera.

    
réponse donnée eddiemoya 11.07.2012 - 02:28
4

Pour développer un peu ce que eddiemoya a fait ci-dessus:

À l'instar de l'affiche originale de cette question, je souhaitais créer une réécriture personnalisée et créer un modèle personnalisé pour cette page de réécriture. Le code de edditmoya m'a permis de démarrer dans la bonne direction et j'ai ajouté une fonction supplémentaire pour servir mon modèle personnalisé lors de l'accès à la page.

Le modèle personnalisé peut être situé n'importe où. Dans mon cas, il est stocké dans le répertoire du plugin.

Je voulais aussi seulement vérifier si les règles de réécriture devaient être effacées lors de l'activation du plug-in, je l'ai donc mise sur register_activation_hook

Voir ci-dessous l'exemple complet de ce que j'ai fait:

MISE À JOUR simplifiée grâce aux conseils de milo

class Your_Class
{

    public function init()
    {
        add_filter( 'template_include', array( $this, 'include_template' ) );
        add_filter( 'init', array( $this, 'rewrite_rules' ) );
    }

    public function include_template( $template )
    {
        //try and get the query var we registered in our query_vars() function
        $account_page = get_query_var( 'account_page' );

        //if the query var has data, we must be on the right page, load our custom template
        if ( $account_page ) {
            return PATH_TO_PLUGIN_TEMPLATES_DIR . 'register.php';
        }

        return $template;
    }

    public function flush_rules()
    {
        $this->rewrite_rules();

        flush_rewrite_rules();
    }

    public function rewrite_rules()
    {
        add_rewrite_rule( 'account/(.+?)/?$', 'index.php?account_page=$matches[1]', 'top');
        add_rewrite_tag( '%account_page%', '([^&]+)' );
    }

}

add_action( 'plugins_loaded', array( new Your_Class, 'init' ) );

// One time activation functions
register_activation_hook( PATH_TO_PLUGIN_FILE, array( new Your_Class, 'flush_rules' ) );
    
réponse donnée Matt Keys 24.09.2014 - 01:14

Lire d'autres questions sur les étiquettes