【问题标题】:Shortcode - Display all terms of an attribute into an ordered list by alphabetical letters简码 - 按字母顺序将属性的所有术语显示到有序列表中
【发布时间】:2016-09-14 11:34:51
【问题描述】:

我创建了一个简单的简码来输出属性术语并链接到它们各自的档案。我希望能够按字母拆分结果,以便它们输出如下:

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' );

我如何做到这一点?

谢谢

【问题讨论】:

    标签: php wordpress woocommerce shortcode taxonomy


    【解决方案1】:

    这是您功能齐全的简码。我已经用一组不同的术语对其进行了测试,并且效果很好(所以我希望你的术语是正确的并且也可以正常工作)。

    首先,我将数据准备在一个二维数组中,第 1 层是字母,第 2 层是对应的术语对名称/slug。

    在我迭代这个二维数组以制作您想要的显示之后……

    代码如下:

    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 文件或任何插件文件中。

    此代码已经过测试并且可以工作。

    【讨论】:

    • 太棒了,谢谢,但是它输出 slug 作为品牌和品牌作为 slug 例如 awdis-academy 当它应该是 Awdis 学院
    • 我已将答案标记为正确,但您能否修复它以便正确输出链接?对于任何检查这一点的人,我只是切换了 $output .= '
    • '.$value.'
    • ';到 $output .= '
    • '.$key.'
    • ';干杯。
  • @d1ch0t0my 啊是的……抱歉,只是有点颠倒……我已经更新了代码。谢谢
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签