当组中不存在术语时,向分类法的字母分页项添加禁用属性

问题描述 投票:0回答:2

我有一个自定义分类法字母分页,按第一个字母列出术语。

function alpha_pagination() {
  $array = array(
   'A'  =>  __('A',''), 'B' =>  __('B',''), 'C' =>  __('C',''),
   'D'  =>  __('D',''), 'E' =>  __('E',''), 'F' =>  __('F','')
  );
 $html = '';
foreach ( $array as $key=>$value ){
  $active = ( $order == $key ) ? 'selected' : null;
  $html .= '<a class="button '.$active.'"  href="'.get_permalink().'? sortby='.$key.'">'.$value.'</a>';
  }
print $html;
}

当我在分类列表页面上打印该函数时,一切正常,但从 a 到 z 的按钮都是可单击的,即使该术语为空。我想做的是将禁用属性添加到没有术语的字母中。

php wordpress pagination grouping custom-taxonomy
2个回答
0
投票

要将禁用属性添加到空字母分页项,您需要在渲染链接/按钮之前检查每个字母是否有任何术语

  • 遍历字母数组,检查是否有任何字母 使用 get_terms 函数以每个字母开头的术语,以及 然后应用禁用类。

你可以做这样的事情

function alpha_pagination() {
    $letters = array('A', 'B', 'C', 'D', 'E', 'F'); // Extend this array as needed

    // Fetch all terms in the taxonomy
    $all_terms = get_terms(array(
        'taxonomy' => 'your_taxonomy_name', // change to actual taxonomy name
        'hide_empty' => true,
    ));

    // Filter terms by first letter
    $terms_by_letter = [];
    foreach ($all_terms as $term) {
        $first_letter = strtoupper($term->name[0]); // Get the first letter of the term name
        if (!isset($terms_by_letter[$first_letter])) {
            $terms_by_letter[$first_letter] = [];
        }
        $terms_by_letter[$first_letter][] = $term; // Group terms by their first letter
    }

    $html = '';
    foreach ($letters as $letter) {
        $active = (isset($_GET['sortby']) && $_GET['sortby'] == $letter) ? 'selected' : '';
        $disabled = !isset($terms_by_letter[$letter]) ? 'disabled' : ''; // Check if there are terms for this letter

        if (!empty($disabled)) {
            $html .= '<span class="button ' . $active . ' ' . $disabled . '">' . $letter . '</span>';
        } else {
            $html .= '<a class="button ' . $active . '" href="' . get_permalink() . '?sortby=' . $letter . '">' . $letter . '</a>';
        }
    }
    print $html;
}
  • $active 变量应该根据您当前的排序来设置
  • CSS 应该有针对禁用类的样式

0
投票

在您的函数中,您需要首先迭代分类中的所有术语并填充 A-Z 字母数组(以及可能不由 A-Z 表示的任何其他前导字符)。对于每个唯一的前导字符,确保与该字符的大写版本相关的值/标志设置为

true
以指示该字符至少有一个术语。在构建查找数组时,您不需要实际保留所有术语。

然后迭代更新后的数组并使用所需的条件属性打印 HTML 元素。

printf()
是一个很好的工具,因为它最大限度地减少了串联并允许占位符在多个位置访问相同的变量。

确保使用多字节安全函数并编码/转义 HTML 实体,以避免边缘大小写值出现意外错误。

代码:(演示

function alpha_pagination() {
    $chars = array_fill_keys(range('A', 'Z'), false);
    foreach (get_terms(['taxonomy' => 'unknown', 'hide_empty' => true]) as $tax) {
        $chars[mb_strtoupper(mb_substr($tax, 0, 1))] = true;
    }
    ksort($chars);

    foreach ($chars as $char => $hasTerms) {
        printf(
            '<%1$s class="button%2$s%3$s">%4$s</%1$s>' . "\n",
            $hasTerms ? 'a' : 'span',  // %1$s
            ($_GET['sortBy'] ?? '_') === $char ? ' selected' : '',  // %2$s
            $hasTerms ? '" href="' . get_permalink() . '?' . http_build_query(['sortby' => $char]) : ' disable',  // %3$s
            esc_html($char)  // %4$s
        );
    }
}
   

或者如果您更喜欢单独的

printf()
通话:(演示)

foreach ($chars as $char => $hasTerms) {
    $selected = ($_GET['sortBy'] ?? '_') === $char ? ' selected' : '';
    if ($hasTerms) {
        printf(
            '<a class="button%s" href="%s?%s">%s</a>',
            $selected,
            get_permalink(),
            http_build_query(['sortby' => $char]),
            esc_html($char)
        );
    } else {
        printf(
            '<span class="button disabled%s">%s</span>',
            $selected,
            esc_html($char)
        );
    }
    echo "\n";
}
© www.soinside.com 2019 - 2024. All rights reserved.