2016-09-14 3 views
1

Я создал простой код для вывода терминов атрибутов и ссылки на их соответствующие архивы. Я хотел бы иметь возможность разделить результаты по буквам, так что они будут выведены следующие:Shortcode - Показать все условия атрибута в упорядоченный список по алфавиту.

A 
Adidas 
Askwith 

B 
Bonham 
Burberry 

... который бы в HTML выглядеть следующим образом:

<span id="a">A</span> 
<ul class="brandlist"> 
<li><a href="/brand/adidas">Adidas</a></li> 
<li><a href="/brand/askwith">Askwith</a></li> 
</ul> 

<span id="b">B</span> 
<ul class="brandlist"> 
<li><a href="/brand/bonham">Bonham</a></li> 
<li><a href="/brand/burberry">Burberry</a></li> 
</ul> 

Но я в немного потерять, как это сделать. Я прочитал несколько статей, в которых предлагается создать новую пользовательскую таксономию для писем, но, похоже, это далеко не так, чтобы делать то, что, я надеюсь, разрешимо более простым способом.

Вот шорткод я создал до сих пор:

function brands_output($atts){ 

    ob_start(); 
    echo '<ul class="brandlist">'; 

    $terms = get_terms(array(
     'taxonomy' => 'pa_brand', 
     'orderby' => 'name', 
     'hide_empty' => false, 
     ) 
    ); 

    foreach ($terms as $term) { 
    $brand = $term->name; 
    $slug = $term->slug; 

    echo '<li><a href="/brand/'.$slug.'/">'.$brand.'</a></li>'; 
    } 

    echo '</ul>'; 
    $output = ob_get_clean(); 
    return $output; 

} 
add_shortcode('showbrands', 'brands_output'); 

Как может достичь этого?

Спасибо

ответ

2

Вот ваш полностью функциональный короткий код. Я тестировал его с другим набором терминов, и он отлично работает (поэтому я надеюсь, что ваше правильно и работает тоже).

Сначала я подготовлю данные в двумерном массиве с алфавитными буквами на уровне 1 и соответствующими словами парное имя/slug на уровне2.

После того как я итерация в этом би-х мерном массиве, чтобы сделать экран, который вы хотите иметь ...

Вот код:

if (!function_exists('showbrands')) { 

    function showbrands(){ 

     $term_arr = array(); 

     $terms = get_terms(array(
      'taxonomy' => 'pa_brand', 
      'orderby' => 'name', 
      'hide_empty' => false, 
     )); 

     foreach ($terms as $term) { 
      $brand = $term->name; 
      $slug = $term->slug; 

      // Getting the first letter of $brand term name 
      $letter = substr($brand, 0, 1); 

      // PREPARING DATA IN A BI DIMENSIONAL ARRAY 

      // Inserting the $letter in an array just once (array level 1) 
      // Inserting for each letter all the corresponding pairs "$brand => $slug" (array level 2) 
      if(!array_key_exists($letter, $term_arr)) 
       $term_arr[$letter] = array($slug => $brand); 
      else 
       $term_arr[$letter][$slug] = $brand; 
     } 

     $output = '<div class="brandlist-container">'; 

     // ITERATING IN THE BI DIMENTIONAL $TERM_ARR ARRAY 

     // first level the letters 
     foreach($term_arr as $key_letter => $terms_in_letter){ 
      $output .= '<span id="'. strtolower($key_letter) .'">'. $key_letter .'</span> 
        <ul class="brandlist">'; 

      // second level the $brand/$slug pairs 
      foreach($terms_in_letter as $key => $value){ 
       $output .= '<li><a href="/brand/'.$key.'/">'.$value.'</a></li>'; 
      } 
      $output .= '</ul>'; 
     } 
     $output .= '</div>'; 

     return $output; 
    } 

    add_shortcode('showbrands', 'showbrands'); 

} 

Этот код идет на function.php файл вашей активной дочерней темы (или темы) или в любом файле плагина.

Этот код проверен и работает.

+0

Thats awesome, спасибо, однако его выводящий слизью как бренд и бренд, как слизняк, например awdis-academy, когда он должен быть Awdis Academy. – d1ch0t0my

+0

Я правильно ответил на ответ, но не мог ли вы исправить его так, чтобы он правильно выводил ссылку? Для тех, кто это проверял, я просто переключил $ output. = '

  • '.$value.'
  • '; до $ output. = '
  • '.$key.'
  • '; Приветствия. – d1ch0t0my

    +0

    @ d1ch0t0my ах да ... извините, просто немного инверсии ... Я обновил код. благодаря – LoicTheAztec