✅ WEB- ja WordPress -uutiset, -teemat, -laajennukset. Täällä jaamme vinkkejä ja parhaita verkkosivustoratkaisuja.

Mukautetut uudelleenkirjoitussäännöt ja sivumallit WordPressissä

13

WordPress Rewrite API on vankka API olettaen, että olet tyytyväinen säännöllisiin lausekkeisiin.

Ja rehellisesti sanottuna, vaikka et olisikaan, PHP Live RegExin kaltaisten työkalujen avulla on todella helppoa testata koodia ennen sen pudottamista add_rewrite_ruleAPI-kutsuun.

Mukautetut uudelleenkirjoitussäännöt ja sivumallit WordPressissä

Joskus saatat kuitenkin joutua tilanteeseen, jossa sinun on työskenneltävä uudelleenkirjoitussääntöjen ja sivupohjien kanssa. Ja kun näin on, se ei aina ole niin yksinkertaista kuin yksinkertaisen kutsun soittaminen yhdellä säännöllisellä lausekkeella.

Syy? Jos sinulla on useita sivuja, jotka käyttävät samaa mallia, sivu ei aina tule olemaan samassa hakemistossa kullakin sivulla suoritettavassa kyselyssä.

Tätä tarkoitusta varten meidän on käsiteltävä sitä hieman eri tavalla kuin esimerkiksi yksinkertaisesti pääsy numeeriseen tietoindeksiin globaalissa kyselyssä.

Kirjoita säännöt ja sivumallit uudelleen

Oletetaan ensin, että meillä on kaksi mallia (jotka eivät ole tietyssä järjestyksessä):

  1. template-alpha.php
  2. template-beta.php

Oletetaan sitten, että haluamme määrittää mukautetun URL-osoitteen sivuille, joilla jokainen käyttää jotakin näistä malleista.

Tämä jakautuisi seuraaviin vaiheisiin:

  1. Iteroi kyselyn viestit,
  2. Tallenna viesti käyttämällä mallia sen vastaavassa taulukossa,
  3. Aseta uudelleenkirjoitussäännöt jokaiselle viestille, jolla on tietty kysely.

Tässä esimerkissä pidän uudelleenkirjoitussäännöt melko yksinkertaisina. Loppujen lopuksi säännöllisten lausekkeiden noudattaminen voi olla tarpeeksi vaikeaa, joten niiden seuraaminen Query-objektin, useiden taulukoiden ja sääntöjen käsittelyn aikana voi olla vähän vaikeaa.

Tässä on esimerkkikoodi, joka on eritelty yllä olevien vaiheiden perusteella. Viestin lopussa jaan katkelman, joka yhdistää kaiken muutamaksi erilliseksi funktioksi, jotta voit nähdä, kuinka tämä kaikki sopii yhteen.

Näin voit käsitellä kaikkia yllä olevia asioita.

1 Uudelleenkirjoitussääntöjen lisääminen

Ensin meidän on luettava joitakin tietoja maailmanlaajuisesta WordPress-kyselyobjektista löytääksemme kaikki sivut, joihin on käytetty malleja.

Tätä varten voimme lukea tiedot globaalista kyselyobjektista paikalliseen muuttujaan. Tämän ansiosta on helppo irrottaa muusta koodista, jos ei ole mitään, minkä kanssa työskennellä.

<?php 

$query = $this->query->query([
    'post_type' => 'page',
    'meta_key' => '_wp_page_template',
    'meta_value' => ['template-alpha.php', 'template-beta.php'],
]);

if (!$query) {
    return;
}

// More to come...

2 Tallenna asiaankuuluvat tiedot taulukkoon

Olettaen, että sivuilla on malleja, jatkamme kunkin sivun tallentamista taulukoihin, jotta voimme helposti hallita niitä vastaavia uudelleenkirjoitussääntöjä.

<?php

foreach ($query as $post) {
    $slug = get_page_template_slug($post->ID);

    if ('template-alpha.php' === $slug) {
        $this->alphaPages[] = $post;
    }

    if ('template-find-a-camp.php' === $slug) {
        $this->betaPages[] = $post;
    }
}

Huomaa, että edellä viittaan globaaliin taulukkoon. Oletetaan, että tämä on yksinkertaisesti alustettu tyhjäksi taulukoksi luokan rakentajassa.

3 Määritä uudelleenkirjoitussäännöt

Nyt kun meillä on kaksi taulukkoa – yksi kullekin mallille ja sen sisältäville sivuille – voimme iteroida niitä ja määrittää uudelleenkirjoitussäännöt kullekin sivulle.

Oletetaan esimerkiksi, että yhdelle mallille, esimerkiksi alfalle, haluamme määrittää uudelleenkirjoitussäännöt Yhdysvaltoja ja osavaltioita varten.

Tässä koodi kohteelletemplate-alpha.php:

<?php

add_rewrite_tag('%country%', '([^&]+)');
add_rewrite_tag('%state%', '([^&]+)');

foreach ($this->alphaPages as $post) {
    add_rewrite_rule(
        '^'.$post->post_name.'/([^/]*)/([^/]*)/?',
        'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
        'top'
    );

    add_rewrite_rule(
        '^'.$post->post_name.'/([^/]*)/?',
        'index.php?page_id='.$post->ID.'&country=$matches[1]',
        'top'
    );
}

Ja tässä koodi :template-beta.php

<?php

add_rewrite_tag('%acme-id%', '([^&]+)');

foreach ($this->betaPages as $post) {
    add_rewrite_rule(
        '^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
        'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
        'top'
    );
}

Tietenkin yllä olevassa koodissa käytetyt säännölliset lausekkeet ovat vain esittelytarkoituksia. Sinun on kaikki mitä tarvitset projektiisi.

4 Kaikki yhdessä nyt

On tärkeää jakaa kaikki tämä toiminnallisuus omiin menetelmiinsä, jotta ne voidaan tarvittaessa helposti kapseloida ja testata.

Tätä varten koko koodi näyttää tältä:

<?php

public function addRewriteRules()
{
    $query = $this->query->query([
        'post_type' => 'page',
        'meta_key' => '_wp_page_template',
        'meta_value' => ['template-alpha.php', 'template-beta.php'],
    ]);

    if (!$query) {
        return;
    }

    $this->setPageTypes($query);
    $this->setAlphaRewriteRules();
    $this->setBetaRewriteRules();
}

private function setPageTypes($query)
{
    foreach ($query as $post) {
        $slug = get_page_template_slug($post->ID);

        if ('template-alpha.php' === $slug) {
            $this->alphaPages[] = $post;
        }

        if ('template-find-a-camp.php' === $slug) {
            $this->betaPages[] = $post;
        }
    }
}

private function setAlphaRewriteRules()
{
    add_rewrite_tag('%country%', '([^&]+)');
    add_rewrite_tag('%state%', '([^&]+)');

    foreach ($this->alphaRules as $post) {
        add_rewrite_rule(
            '^'.$post->post_name.'/([^/]*)/([^/]*)/?',
            'index.php?page_id='.$post->ID.'&country=$matches[1]&state=$matches[2]',
            'top'
        );

        add_rewrite_rule(
            '^'.$post->post_name.'/([^/]*)/?',
            'index.php?page_id='.$post->ID.'&country=$matches[1]',
            'top'
        );
    }
}

private function setBetaRewriteRules()
{
    add_rewrite_tag('%acme-id%', '([^&]+)');

    foreach ($this->betaPages as $post) {
        add_rewrite_rule(
            '^(.*)?/([A-Za-z0-9-]+-)(d+)/?',
            'index.php?page_id='.$post->ID.'&acme-id=$matches[3]',
            'top'
        );
    }
}

Muista kuitenkin; tämä perustuu vain tässä viestissä jaettuun demokoodiin. Kun työskentelet projektisi parissa, säännölliset lausekkeet, mallit ja niin edelleen vaihtelevat.

Tämä verkkosivusto käyttää evästeitä parantaakseen käyttökokemustasi. Oletamme, että olet kunnossa, mutta voit halutessasi kieltäytyä. Hyväksyä Lisätietoja