WordPress: Archiv příspěvků nebo taxonomií sdružených podle prvního písmene jejich titulků

wordpress

Pokud na webu řešíš třeba slovník výrazů seřazený podle jejich prvního písmena, tak tady najdeš pár kousků kódu, které to vyřeší

Vypsání příspěvků sdružených podle prvního písmena

Při vypisování příspěvků si nejdříve definuj argumenty ($args) pro query příspěvků, které budou načtené skrze funkci get_posts(). V ukázce jsem nastavil argumenty, které mi vrátí všechny příspěvky patřící k typů příspěvků navody , seřázené vzestupně podle názvu a bude přitom ignorovat zvýrazněné příspěvky.

K tomu si vytvořím prázdné pole $posts_array, do kterého se o kousek níže budou řadit příspěvky sdružené pod svým prvním znakem.

Takže příspěvky načtené funkcí get_posts() se proženou foreach loopem. Obvykle se get_post() nejdříve natáhne do proměnné, pak se ověří, jestli není proměnná prázdná a až pak se povolí provést foreach, ale když víš, že u post typu máš alespoň jeden příspěvek, tak to můžeš s klidem vynechat. Uvnitř foreach si nejdřív otestuju pomocí preg_match(), jestli první znak není číslice. Dělám to jen kvůli tomu, že chci mít všechny příspěvky začínající číslicí sdružené spolu pod označením 0-9, pokud chceš mít každou číslici zvlášť, tak tam z celé té if/else podmínky nech jen $group_index = substr($post_item->post_title, 0, 1);.

Foreach mi naplnil $posts_array a můžu přistoupit k vypsání výsledku dalším foreachem. $posts_array obsahuje id všech příspěvků v proměnné $post_id, takže si do loopu můžeš vytáhnout k příspěvku libovolná data nebo náhledový obrázek.

<?php
  // Argumenty pro výběr příspěvků
  $args = [
   'post_type' => 'navody',
   'orderby'   => 'title',
   'order'     => 'ASC',
   'ignore_sticky_posts' => 1,
   'posts_per_page'      => -1,
  ];
  // Prázdné pole připravené pro další použití
  $posts_array = [];

  // Načtení příspěvků a jejich iterace
  foreach( get_posts( $args ) as $post_item ){

      // Test jestli je první znak číslice
      if ( preg_match('/^[0-9]{1,}/', substr( $post_item->post_title, 0, 1 ) ) ){
          // Pokud je číslice sdruží všechny Příspěvky s číslicí pod
          // jednu skupinu a nastaví index skupiny na hodnotu 0-9
          $group_index = '0-9';

      } else {
          // Pokud první znak není číslice, ale písmeno, 
          // sdruží je pod prvním písmenem a nastaví jej jako index skupiny 
          $group_index = substr($post_item->post_title, 0, 1);

      }
      // Poté doplníme do předem vytvořeného pole $posts_array
      // Uložíme si jen to, co budeme potřebovat
      $posts_array[$group_index][$post_item->ID] = [
        'name'  => $post_item->post_name,
        'title' => $post_item->post_title,
        'url'   => get_the_permalink($post_item->ID)
      ];
  }

  // A teď si náš seznam pěkně vyrenderujeme. Foreachem iterujeme pole v proměnné $posts_array,
  // tentokrát jako páry klíč => hodnota, kdy klíč je naše první písmeno nebo "0-9" a $group_val
  // obsahuje pole s příslušnými příspěvky.
  foreach($posts_array as $group_index => $group_val){

      echo '<div class="letter-box">'
          . '<h2 class="letter-header" id="index-'.$group_index.'">'.$group_index.'</h2>'
          . '<ul>';

      // A tady je iterace příspěvků
      foreach($group_val as $post_id => $post_value){
      
          echo '<li ' . post_class() . '><a href="'. esc_url( $post_value['url'] ) .'" rel="bookmark" title="Odkaz pro'. esc_attr( $post_value['title'] ) .'">'. esc_attr( $post_value['title'] ) . '</a></li>';
      
      }

      echo '</ul'
        . '</div>';
  }   

Vypsání taxonomií sdružených podle prvního písmena

Výpis taxonomií se od příspěvků moc neliší. Pro načtení všech termínů pro vybranou taxonomii použij funkci get_terms(). Pak je rozdíl ve volání názvu z objektu. Zatímco u příspěvků to bylo $post_item->post_title, tak u termínů taxonomií je to $term_item->name a $post_item->ID je tady $term_item->term_id .


$terms = get_terms( [
  'taxonomy'   => 'post_tag', // category, product_tag, custom_taxonomy, ...
  'hide_empty' => false, // zobrazí i termíny bez příspěvků
] );
$terms_array = [];

foreach($terms as $term_item){

    if ( preg_match('/^[0-9]{1,}/', substr( $term_item->name, 0, 1 ) ) ){

        $group_index = '0-9';

    } else {

        $group_index = substr($term_item->name, 0, 1);

    }

    $terms_array[$group_index][$term_item->term_id] = [
      'title' => $term_item->name,
      'url'   => get_term_link($term_item)
    ];
}

foreach($terms_array as $group_index => $group_obj){

    echo '<div class="letter-box">'
          . '<h2 class="letter-header" id="index-' . $group_index . '">' . $group_index . '</h2>'
          . '<ul>';
          
    foreach($group_obj as $term){
      
      echo '<li><a href="'. esc_attr( $term['url'] ) .'" rel="bookmark" title="Odkaz pro'. esc_attr( $term['title'] ) .'" class="item">'. esc_attr( $term['title'] ) . ' (' . $term['count'] . ')</a></li>';
    
    }
    echo '</ul>'
      . '</div>';
}

Ukázka použití

Chceš tento návod vidět v akci? Podívej se na stránku přehled štítků pro získání lepší představy o čem jsem tu vlastně psal.

Zdroje

Reklama
Reklama zdarma, zvýšení návštěvnostiZobrazeno 580 krát.
%d bloggers like this: