it-swarm-eu.dev

Vlastní plugin cesta v Wordpressu

Dobře, takže moje otázka je docela jednoduchá. Potřebuji implementovat vlastní pravidla pro směrování pro můj plugin. Tyto trasy by měly pouze jeden argument (takže nic složitého) a vypadaly by jako: http://www.example.org/myroute/myargument

A v ideálním případě by to bylo volání vlastní třídy a zobrazení vlastní šablony (která by mohla přímo přistupovat ke třídě).

Jaký je nejlepší přístup? Na zdraví

10
Fran

Musíte udělat 3 důležité věci.

  1. Vytvořte vlastní pravidlo přepsání, aby se části uri proměnily na hodnoty předané index.php
  2. Přidat myroute a myargument jako dotaz vars to wordpress ví, že jsou platné $ _GET parametry, když pravidla pro přepsání jim něco předají
  3. Vyprázdněte pravidla pro přepsání.

Za prvé, doporučuji, aby místo http://www.example.org/myroute/myargument, jste se usadili na nějaké speciální předpony nebo přípony, které označují, kdy by měla být uri považována za jednu z těchto speciálních 'cest'. Pro tento příklad jsem si vybral předponu api, takže by to bylo http://www.example.org/api/myroute/myargument. Vybral jsem si api, protože když jsem udělal něco klidného, ​​jako to, na čem se zdá, že pracuje, bylo to API.

Kód

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;
}

Rychlé členění

Jeho všechny poměrně rovně dopředu, regex vzor je přidán do seznamu všech pravidel přepsání v WordPress, a vaše vlastní vzor je na seznamu. Pokud existuje shoda se vzorem, WordPress přestane hledat a předané hodnoty předá zpětným odkazům v řetězci index.php.

Přidání dotazu z nich dělá pouze myroute a myargument platné pro index.php ke zpracování.

Alternativní způsob „jmenování“ vaší vlastní trasy

Pokud jste se chtěli vyhnout použití /api/ jako předpony, můžete místo toho použít řetězec dotazu var. Chcete-li něco takového, měli byste změnit regex na něco jako (.*?)/(.+?)\\?api=1 a pak přidat api jako další parametr do funkce array_Push v my_insert_query_vars().

To by změnilo vlastní trasu, která má být spuštěna, kdykoliv je http://example.com/anytext/anytext?json=1.

Ignorujte použití výrazu „namespacing“ - používáte jej pouze pro stručnost.

Pokud dont 'jmenný prostor' s předponou nebo příponu, budete skončit s kolizí uri vzory. To proto, že WordPress nebude mít žádný způsob, jak odlišit svůj vlastní vzor od jednoho, který má být poštou nebo stránkou. Jak by wordpress věděl, jestli to 'myroute' není taxonomie, nebo termín, nebo rodičovská stránka?

Snad to pomůže.

12
eddiemoya

Chcete-li trochu rozšířit to, co udělal eddiemoya:

Stejně jako původní plakát této otázky jsem chtěl vytvořit vlastní přepsání a také dodat vlastní šablonu pro tuto stránku s přepisem. Kód z edditmoya mě začal správným směrem a přidal jsem další funkci, abych se při přístupu na stránku dostal do své vlastní šablony.

Vlastní šablona může být umístěna kdekoli, v mém případě je uložena v adresáři pluginů.

Chtěl jsem také zkontrolovat, zda je třeba přepsat pravidla pro přepsání během aktivace pluginu, takže jsem to dal na register_activation_hook

Níže naleznete úplný příklad toho, co jsem udělal:

AKTUALIZOVÁNOzjednodušeno na základě doporučení 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' ) );
4
Matt Keys