从子类别中获取父类别字段

时间:2021-08-26 作者:Yco

我正在使用ACF添加类别颜色。我在文章循环中显示它们。

如果子颜色为空,我想检索父类别颜色。如果父级也是空的,则获取主颜色。

以下是我所拥有的:

$terms = get_the_terms( get_the_ID(), \'category\' );
if ( $terms ) {
  foreach ( $terms as $term ) {
    $cat_id = $term->term_id;
  }
  $cat_color = get_field(\'category-color\', \'category\' . \'_\' . $cat_id);
  if ( empty( $cat_color ) ) {
    $cat_color = // Get the parent category color;
  } else {
    $cat_color = get_field(\'primary-color\', \'option\');
  }
  echo \'<div class="post_loop-cat" style="background-color: \'.$cat_color.\';">\' . $term->name . \'</div>\';
}
如何获取父类别的颜色?

2 个回复
最合适的回答,由SO网友:Buttered_Toast 整理而成

您需要获取直接父对象的颜色,或者循环遍历所有Ansestor,直到找到颜色为止
如果未找到颜色,则获取默认值并输出。

我对结构做了一些更改,并为每个步骤添加了所有注释。

请注意,为了获得相同的结果,我提供了两个选项,请选择一个适合您需要的选项。

// get category terms of the current post
if ($terms = get_the_terms( get_the_ID(),\'category\')) {
    // prepare the output for sprintf
    // to avoid repeating ourselves we can create a variable to conatin the output
    // %s is a sting placeholder
    $output = \'<div class="post_loop-cat" style="background-color: %s;">%s</div>\';

    // unless you always have one categpry for every post
    // this will always set $cat_id to the last $term of the loop, always
    // take this into account
    foreach ($terms as $term) {
        $cat_id = $term->term_id;
    }

    // get ACF category color
    $cat_color = get_field(\'category-color\', \'category_\' . $cat_id);

    // because we don\'t know the depth of the category
    // or how high do you want to go to get the parent color
    // we can do either of the following
    // in both options we will first check if $cat color exists

    // option 1
    // using the direct parent only

    if ($cat_color) { // color found, output the html
        echo sprintf($output, $cat_color, $term->name);
    } else {
        // get the parent category color
        $cat_color = get_field(\'category-color\', \'category_\' . $term->parent);

        // if not found, set color to default
        if (empty($cat_color)) $cat_color = get_field(\'primary-color\', \'option\');

        // output the html
        echo sprintf($output, $cat_color, $term->name);
    }

    // option 2
    // using the category ancestors to find the color
    // we loop each ancestor, once we found a color we stop and output

    if ($cat_color) { // color found, output the html
        echo sprintf($output, $cat_color, $term->name);
    } else {
        // get and loop all ansestors
        foreach (get_ancestors($cat_id, \'category\') as $ancestor_id) {
            // get and check category color, if found, break out of the loop
            if ($cat_color = get_field(\'category-color\', \'category_\' . $ancestor_id)) break;
        }

        // if not found, set color to default
        if (empty($cat_color)) $cat_color = get_field(\'primary-color\', \'option\');

        // output the html
        echo sprintf($output, $cat_color, $term->name);
    }
}
为了不重复输出,我使用了一个变量,稍后将与一起使用sprintf, 单击链接了解更多信息
快速描述,sprintf创建格式化字符串。

SO网友:MMK

$terms = get_the_terms( get_the_ID(), \'category\' );
if ( $terms ) {
  foreach ( $terms as $term ) {
    $cat_id = $term->term_id;
    $cat_color = get_field(\'category-color\', \'category\' . \'_\' . $cat_id);
    if ( empty( $cat_color ) && $term->parent != 0) {
        $parent_term = get_term( $term->parent, \'category\' );
        $cat_color = get_field(\'category-color\', \'category\' . \'_\' . $parent_term->term_id);
        //if parent also empty then assign default color
        $cat_color =empty( $cat_color ) ? "white" : $cat_color ;
    }else{
        //assign some default color if term is itself parent
        $cat_color = \'white\';
    } 
    echo \'<div class="post_loop-cat" style="background-color: \'.$cat_color.\';">\' . $term->name . \'</div>\';
  }
}
它将循环遍历所有术语,检查术语是否有颜色,然后将其分配给cat\\u color变量,如果为空,则检查术语是否有父项如果父项为空,则分配$cat\\u color一些默认颜色(您可以根据代码逻辑将其保持为空),如果父项不为空,则($cat\\u color)将获得父项的颜色,如果父颜色也为空,则它将为变量$cat\\u color指定一些默认颜色。

相关推荐

Regarding Tags And Categories

我想为我的网站使用一个新主题,但问题是,在我当前的主题中,它有特殊的标记,例如“abc标记”,而在我的新主题中,它没有。因此,如果我更改主题,所有帖子都会消失(404错误)。我的问题是,是否可以创建一个具有不同名称的新SPESIFI标记(在本例中为abc标记)?或者,即使我的新主题没有abc标记,也可以将旧的abc标记迁移到新的abc标记吗?我尝试过使用elementor,但仍然没有成功,任何帮助都将非常。。非常非常非常感谢!谢谢大家^_^