Opprette kontekstavensitiv sidebarnavigasjon i WordPress

Noen ganger får jeg en klientjobb som krever et nettsted som er bygget helt på sider. Ingen fancy databasespørsmål, ingen ekstra malfiler - bare en hel rekke sider i en hierarkisk struktur.

Et veldig stort nettsted bygget på sider kan bli uhåndterlig og forvirrende for brukere hvis navigasjonen ikke er ferdig riktig, så det er nyttig å gi en liste over alle sidene i den nåværende grenen av sidenhierarkiet på hver side. 

For eksempel, hvis nettstedet ditt er for en organisasjon, og hver av organisasjonens funksjoner har en toppnivåside med delsider for individuelle avdelinger, vil du ønske å liste alle disse avdelingene sammen med en lenke til toppnivåfunksjonssiden. Du vil gjerne gjøre dette på hver av disse avdelingssidene og på eventuelle delsider de kan ha, så vel som med toppnivået selv.

For å gjøre dette kan du ikke sende ut lister over relatert innhold ved å kjøre spørringer på gjeldende posttype eller taksonomi. I stedet må du identifisere hvor i strukturen den nåværende siden er, og deretter vise en liste over koblinger tilsvarende.

Her vil jeg vise deg hvordan du gjør nettopp dette ved å opprette en funksjon du kan legge til i sidebarfilen eller kanskje over innholdet i malfilene dine (eller aktivere via en krok hvis temaet ditt bruker dem).

Dette består av to faser:

  1. identifisere hvor den nåværende siden er i strukturen
  2. skriver ut en liste over sider

Hva du trenger

For å fullføre denne opplæringen må du:

  • en installasjon av WordPress
  • en tekstredigerer

Opprette ditt plugin

Jeg skal lage denne funksjonen i et plugin slik at temaet er uavhengig. Så ditt første skritt er å lage en plugin-fil. Mine er kalt tutsplus-liste-subpages.php.

Åpne pluginfilen din og legg til følgende:

Tydeligvis vil koden din være annerledes som pluginforfatteren og nettadressen vil endres, og du vil kanskje endre beskrivelsen. 

Inkludert navnet på funksjonen i beskrivelsen er nyttig, da det betyr at når du installerer pluginet ditt på et nettsted, trenger du ikke å sjekke koden for å minne deg selv om hvordan du bruker den.

Identifisering av gjeldende side i hierarkiet

For å finne ut hvor den nåværende siden er i sidenhierarkiet, må du gjøre fire ting:

  1. Sjekk at dette faktisk er en side
  2. Sjekk om dette innlegget har foreldre
  3. Hvis ikke, vet du at det er toppnivået forfedre for denne delen av hierarkiet
  4. I så fall må du identifisere toppnivå forfedre ved hjelp av get_post_ancestors ()

Så la oss gjøre det!

Opprett en ny funksjon med en betinget kode i den for å sjekke at vi er på en side:

Nå inne i is_page () betinget kode, begynn med å definere $ post global variabel:

Deretter må du identifisere om den nåværende siden har foreldre, som du bruker hvis (& post-> post_parent):

post_parent) ?>

Hvis siden har forfedre, må du identifisere de aller fleste av disse, som du bruker get_post_ancestors ():

post_parent) // hente listen over forfedre $ foreldre = array_reverse (get_post_ancestors ($ post-> ID)); // få toppnivå forfedre returnere $ foreldre [0]; ?>

Dette definerer en ny variabel av $ foreldre hvis verdi er ID for den øverste siden i nåværende gren av hierarkiet. Køen returnere $ foreldre [0]; utganger som verdier slik at du kan bruke den i en senere funksjon.

Til slutt må du definere hva som skjer hvis den nåværende siden ikke har foreldre, det vil si om det er den øverste forfaren selv. I så fall vil du sende ut den nåværende sidens ID, så du legger til følgende for din funksjon:

returnere $ post-> ID;

Hele funksjonen din vil nå se slik ut:

post_parent) // hente listen over forfedre $ foreldre = array_reverse (get_post_ancestors ($ post-> ID)); // få toppnivå forfedre returnere $ foreldre [0];  // return id - dette vil være den øverste forfederen hvis det er en, eller den nåværende siden hvis ikke returnere $ post-> ID; ?>

Utarbeide en liste over delsider

Nå som du kjenner IDen til den øverste siden i den nåværende grenen av hierarkiet, er det relativt enkelt å skrive ut en liste over delsider. Du bruker get_pages () å identifisere barnesidene på siden hvis ID du har identifisert. Du må også sende ut en link til forfedersiden i begynnelsen av listen.

Bruke list_pages () for å identifisere delsider

Start med å opprette en ny funksjon med en sjekk at vi er på en side:

Merk at hvis du skal legge til denne funksjonen til din page.php mal, kan du legge ut sjekken om at en side blir vist.

Det første du må gjøre innenfor den betingede taggen, er å trekke i siden ID du identifiserte i tutsplus_check_for_page_tree () funksjon, som du gjør med denne koden:

$ ancestor = tutsplus_check_for_page_tree ();

Nedenfor definerer du argumentene for get_pages () funksjon:

$ args = array ('child_of' => $ forfader, 'depth' => '-1', 'title_li' => ");

La oss få en rask titt på argumentene jeg har brukt:

  • 'child_of' => $ forfedre identifiserer de sidene som er et barn av $ stamfar side
  • 'dybde' => '-1' forteller funksjonen å gå til så mange nivåer i hierarkiet som det er på nettstedet. Du kan endre dette hvis du bare vil vise ett eller to nivåer.
  • 'title_li' => " sikrer at utdataene ikke er pakket inn i noen HTML-koder - siden jeg legger til dem senere.

Deretter må du kjøre list_pages () funksjon:

$ list_pages = get_pages ($ args);

Skriv ut listen over sider

Nå som du har sidene dine, må du sende dem ut med koblinger. For å gjøre dette, må du først sjekke det list_pages () har ikke returnert en tom rekkefølge:

hvis ($ list_pages) 

I den sjekken er den første lenken til toppnivå siden:

  • ">

Og så under det først

  • element men fortsatt inne i
      , bruke wp_list_pages () funksjon for å sende ut en liste over sidene innpakket i hyperkoblinger til dem:

      wp_list_pages ($ args);

      Dette viser en liste over sidetitlene som lenker.

      Hele ditt tutsplus_list_subpages () funksjonen vil nå se slik ut:

       $ ancestor, 'depth' => '-1', 'title_li' => ";) // angi en verdi for get_pages for å sjekke om det er tomt $ list_pages = get_pages ($ args); // Sjekk om $ list_pages har verdier hvis ($ list_pages) // åpne en liste med forfedersiden øverst?> 
      • ">

      Aktiverer funksjonen

      Du kan aktivere funksjonen på to måter:

      • Ved å ringe tutsplus_list_subpages () i et av temaets malfiler, for eksempel sidebar.php fil
      • Ved å feste den til en krok i temaet ditt.

      For eksempel, hvis temaet ditt har en tutsplus_sidebar krok i sidebar.php fil, vil du legge til følgende i din functions.php fil:

      Sammendrag

      Koden jeg har demonstrert, lar deg automatisk legge til en liste over relaterte sider til en side hvor som helst i nettstedets hierarki.

      Hvis du bruker den til klientnettsteder, må du sørge for at klienten forstår hvordan man lager sider hierarkisk, men bortsett fra at det ikke vil bety at de må tenke over det i det hele tatt.

      Hvis du vil gjøre koden enda mer brukervennlig for klienter, kan du opprette en widget (eller kanskje en kortkode) for å sende ut listen over sider, men det er et emne for en annen dag!