v24 – Routing och templates i WordPress plugins

Med add_rewrite_endpoint() kan din plugin skapa egna routes (URL:er) där du själv bestämmer vad som visas till användare.

Registrera en ny route för en WP plugin


// name of custom route public $route = 'portfolio'; public function __construct() { $this->template_path = plugin_dir_path(MP_PLUGIN_PATH) . '/templates/'; // always add rewrite_rules on WP init add_action('init', array($this, 'rewrite_rules')); add_filter('request', array($this, 'rewrite_vars')); } [ ... ] // adds a custom route (URL) for this plugin // "/portfolio" public function rewrite_rules() { add_rewrite_endpoint($this->route , EP_ALL); } // fix so that our query var is not falsy // for /portfolio/ requests without ID public function rewrite_vars($vars) { if(isset($vars[$this->route]) && !$vars[$this->route]) { // if a user is on our route, but has not requested a specific ID $vars[$this->route] = 'all'; } return $vars; }

Koden ovan körs var gång WordPress ’init’ action anropas. Den lägger då till en rewrite rules som säger:
1. Om URL:en börjar med ”/portfolio/” vill vi att WordPress skapar en query variabel med samma namn som vår route och stoppar in allting som kommer efter i den (/portfolio/ —> index.php?portfolio=). Med hjälp av get_query_var() kan vi sedan plocka upp i vår pluginkod.
2. Om URL:en är ”/portfolio/” finns det inget att lägga in i query variabeln (””), så då använder vi add_filter(’request’) för att ändra query variabeln från en tom sträng till ”all”, så att vi kan veta om en användare är på ”/portfolio/”.

Internt (syns inte till användare) lägger WordPress nu till extra query-parametrar till sin index.php fil som vi kan plocka upp och använda för att bestäma vilken template fil som ska användas vid var anrop.

Inkludera templates för custom routes

Med hjälp av add_filter() kan din plugin nu ändra vilken template fil som WordPress kommer använda vid olika anrop. För att inte ta isönder andra URL:er, måste du dubbelkolla att det är just våran custom route som anropats. Du gör detta genom att leta efter din query variablel som vi bad WordPress skapa åt oss tidigare i koden.

public function __construct() {
    [ ... ]

    // filter template being included for each request
    add_filter( 'template_include', array( $this, 'include_template' ) );
}

[...]

public function include_template( $template ) {
    // try and get the query var we registered in our 
    // $this->rewrite_rules() function
    $portfolio_page = get_query_var( $this->route );

    // if not on a portfolio page (no query var exists), do nothing
    if (!$portfolio_page) { return $template; }

    // if the query var has data, we must be on the right page
    // select && return our custom template

    if ( $portfolio_page != "all" ) {
        // return "item" template
        return plugin_dir_path(MP_PLUGIN_PATH) . '/templates/portfolio_item.php';
    }

    // return "all" template
    return plugin_dir_path(MP_PLUGIN_PATH) . '/templates/portfolio_all.php';
}

Koden ovan körs var gång WordPress fösöker inkludera en template fil. Med hjälp av ett filter samt get_query_var() kan du då kolla om en användare besöker just din custom route och isåfall ändra template till din egen fil.

Ladda ner en exempel custom route class här

Custom WordPress templates i plugins

En custom template är inget mer än en PHP fil som kommer att användas istället för nuvarande temats template. Den kan innehålla vad som helst, men oftast är det bra att anropa get_header() och get_footer() för att få med nuvarande temas header, footer, samt all CSS, JS, etc.

<!-- example contents of a custom template -->
<?php get_header(); ?>
<!-- custom template HTML content goes here... -->
<?php get_footer(); ?>

Läs mer om WordPress custom routes och templates

0 votes