Kun rakennat malleja WordPressille, sinulla on yleensä sivutustoimintoja, jotka tulevat itse sovelluksesta.
Näihin kuuluvat mm.
Ja on muutamia muita viestejä, jotka antavat sinulle paremman tarkkuuden taksonomioiden suhteen, kuten get_adjacent_post().
Suosittelen lukemaan kaikki yllä olevat linkit, koska ne ovat hyödyllisiä, jos rakennat teemaa, työskentelet mukautettujen viestityyppien kanssa tai haluat vain ymmärtää joitakin yleisiä mallitunnisteita.
Jos kuitenkin etsit helppoa tapaa kirjoittaa WordPress-sivutusapuohjelma (jonka selitän perustelut hetkeksi), tämän viestin loppuosa kattaa juuri sen.
Mukautettu WordPress-sivutus
Ensinnäkin aina, kun rakennat verkkosovellusta jollekin, on varmasti vivahteita, joissa alkuperäiset WordPress-toiminnot eivät välttämättä toimi. Ehkä se ei toimi odotetulla tavalla, se ei toimi tarkoitetulla tavalla tai se ei palvele tarpeitasi.
Joka tapauksessa, se ei tarkoita, ettei sivutusta voida rakentaa palvelemaan tavoitteitasi. Loppujen lopuksi sivuttamisen ydin – varsinkin kun se liittyy yhden postin sivuttamiseen – on pohjimmiltaan tämä:
Katso nykyisestä viestistä, onko viesti olemassa ennen sitä ja onko viesti olemassa sen jälkeen. Jos jompikumpi viestityyppi on olemassa, anna linkki siihen; muuten älä.
Tästä voimme päätellä, että tarvitsemme seuraavat ominaisuudet:
- tapa määrittää, onko nykyisen viestin takana viesti,
- tapa määrittää, onko viesti olemassa nykyisen viestin jälkeen,
- tapa hakea tietty viesti,
- tapa saada pysyvä linkki kyseiseen viestiin.
Pyrin kuitenkin olemaan erittäin tarkka yllä olevan kielen suhteen, koska tietyn postauksen "takana" tai "jälkeen" olevalla viestillä ei välttämättä ole tunnusta, joka on yksi vähemmän kuin nykyisen viestin tunnus.
Se on yksinkertaisesti ensimmäinen julkaistu viesti, jonka voi hakea kumpaankin suuntaan, eikö niin?
Tämä tarkoittaa, että tarvitsemme kaksi kyselyä:
- kysely nykyisen viestin takana olevan viestin hakemiseksi,
- kysely, jolla haetaan viesti nykyisen viestin jälkeen.
Tässä esimerkissä oletan, että sinulla on pääsy nykyisen viestin tunnukseen get_the_ID() – funktion kautta.
Hanki postaus nykyisen viestin taakse
Tätä varten meidän on luotava yksinkertainen kysely, joka nappaa yhden julkaistun viestin määritetyn viestityypin tietokannasta ja joka liittyy nykyisen viestin sijaintiin.
Voimme tehdä tämän rajoittamalla tulosjoukon yhteen, järjestämällä tulokset laskevassa järjestyksessä ja vertaamalla viestitunnuksen arvoa:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID < (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID DESC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID DESC
LIMIT 1
",
get_the_ID(),
'acme-custom-post-type',
'publish',
'acme-custom-post-type',
'publish') );
Tämä palauttaa joukon tuloksia, joita voimme hallita hetkessä.
Hanki viesti nykyisen viestin jälkeen
Seuraavaa viestiä varten kirjoitamme samanlaisen kyselyn. Mutta sen sijaan etsimme seuraavaa arvoa, joka on suurempi ja joka on nykyisen tunnuksen edellä:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID > (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC
LIMIT 1
",
get_the_ID(),
'acme-custom-post-type',
'publish',
'acme-custom-post-type',
'publish') );
Tarvitsemme nyt muutamia toimintoja määrittääksemme, onko viestejä olemassa. Voimme tehdä tämän palautetulla tulostaulukolla.
Tarkista, onko viestiä olemassa
Huomaa, että seuraavassa esimerkissä funktio hyväksyy tulosjoukon ja yksinkertaisesti palauttaa, jos on edellinen viesti. Tähän funktioon välitettävien tulosten tulee olla edellisestä yllä olevasta viestikyselystä.
Toiseksi, huomaa, että se on yksityinen. Haluat ehkä tehdä omasi julkiseksi riippuen siitä, miten haluat rakentaa mallisi.
<?php
/**
* @param array $results the results of the query to determined if there are past posts
*
* @return bool true if there is a previous post; otherwise, false
*/
private function hasPreviousPost($results)
{
return isset($results[0]);
}
Ja sitten seuraavassa viestissä se näyttää samalta, mutta muista, että tähän toimintoon välitetyt tulokset ovat eri kyselystä.
<?php
/**
* @param array $results the results of the query to determined if there are future posts
*
* @return bool true if there is a next post; otherwise, false
*/
private function hasNextPost($results)
{
return isset($results[0]);
}
Ja lopuksi, voimme käyttää näitä ehdollisia toimintoja pysyvän linkin saamiseksi.
Hanki linkki
Muista, että tapa, jolla käytät tätä toimintoa, voi poiketa tarjoamastani toteutuksesta. Joten jos et tarvitse sitä yksityiseksi, muuta sen näkyvyyttä ja käytä sitä mallissasi tarpeen mukaan .
<?php
/**
* @param array $results the results of the array from which to retrieve the post ID
*
* @return string the ID of the post to which we're going to link
*/
private function getPostLink($results)
{
return get_the_permalink($results[0]->ID);
}
Huomaa lopuksi, että tämä funktio hyväksyy tulokset, jotka annat sille kummasta tahansa kyselystä, ja noutaa ID-ominaisuuden tulosten ensimmäisestä hakemistosta.
Tämä johtuu siitä, että tulokset rajoittuvat yhteen ja se perustuu ehdollisten funktioiden käyttöön. Eli voit tehdä jotain kuten:
- jos on seuraava postaus niin hanki seuraavan postauksen linkki
Mutta toteutuksesi voi vaihdella.
Miksi tätä tarvitaan?
Sitä ei ehkä tarvita. Siinä on koko juttu: Jos käytät WordPressiä heti valmiina ja hyvin vähän mukautettuja tai laajennuksia, etkä tarvitse tehdä muuta kuin mitä se voi tarjota, et ehkä tarvitse tätä.
Jos toisaalta etsit tapaa esitellä WordPressin sivutustoiminto yhdessä viestissä, tämä on tapa tehdä se, joka pystyy käsittelemään oikein viestit, jotka ovat tietyntyyppisiä, mutta eivät t ovat peräkkäisiä tunnuksia (ja jotka toimivat vain julkaisun tilan kanssa).