显示当前帖子类别的最有效方式?

时间:2016-12-29 作者:sinisterOrange

我的Wordpress网站使用类别将产品信息分组到子类别中。例如,对于汽车来说,父类别是品牌,子类别包括本田、丰田、福特等。有时一个职位可以分配多个子类别。此外,有时父+子类别从未分配给帖子。我正在使用自定义页面模板。

我的代码可以工作,但我担心它效率低下,并且会降低我的网站速度

以下是基本要素:

functions.php

global $reviews_cat_id_brand;
$reviews_cat_id_brand = 158; // using # in case string changes

if( !function_exists(\'reviews_has_subcat_link\') ){
  function reviews_has_subcat_link($cat_id){
    $taxonomy_name = \'review-category\';
    // store category data in array
    $cat_array = get_term_by(\'id\', $cat_id, $taxonomy_name);
    $terms = get_the_terms(get_the_ID(), $taxonomy_name);

    foreach ($terms as $term) {
      if($term->parent === $cat_array->term_id) {
        return true;
      }
    }
  }
}

if( !function_exists(\'reviews_print_subcat_link\') ){
  function reviews_print_subcat_link($cat_id){
    $taxonomy_name = \'review-category\';
    // store category data in array
    $cat_array = get_term_by(\'id\', $cat_id, $taxonomy_name);
    $terms = get_the_terms(get_the_ID(), $taxonomy_name);
    $subcat_array = [];

    foreach ($terms as $term) {
      if($term->parent === $cat_array->term_id) {
        $subcat_array[] = \'<a href="\'.get_term_link($term).\'">\'.$term->name.\'</a>\';
      }
    }
    echo implode(\', \', $subcat_array);
  }
}

review-page.php

<?php if( reviews_has_subcat_link($reviews_cat_id_brand) ): ?>
  <tr><td>Brand:</td>
  <td><?php reviews_print_subcat_link($reviews_cat_id_brand); ?></td></tr>
<?php endif; ?>
就是这样。每个评论页面都有大约6个这样的子类别检查,该站点有几百个页面。有没有更好的方法?

在Wordpress编辑器中,当存在子类别时,我会检查父类别。理想情况下,我希望检测是否选中了父对象,然后显示所选的子对象,而不必每次都遍历所有内容。

提前感谢您的指导。

1 个回复
SO网友:sinisterOrange

查看之后get_the_terms() 我想我又找到了一个更好的解决方案:

functions.php

global $reviews_cat_id_brand;
$reviews_cat_id_brand = 158; // using # in case string changes

if( !function_exists(\'reviews_print_subcat_link\') ){
      function reviews_print_subcat_link($cat_id){
        $items = get_the_terms(get_the_ID(), \'review-category\');
        $subcat_array = [];

        foreach ($items as $item) {
            if($item->parent === $cat_id) {
                $subcat_array[] = \'<a href="\'.get_term_link($item).\'">\'.$item->name.\'</a>\';
            }
        }
        return $subcat_array;
      }
    }

review-page.php

$reviews_subcat_links_brand = reviews_print_subcat_link($reviews_cat_id_brand);

if ($reviews_subcat_links_brand) {
  echo \'<tr><td>Brand:</td>\';
  echo \'<td>\'.implode(\', \', $reviews_subcat_links_brand).\'</td></tr>\';
}
也许还有更好的解决方案,但这会大大减少循环。