获取分层分类中的术语

时间:2012-12-14 作者:Ethan

我有一个分层自定义分类法(“照片”),有3个父术语

颜色、位置、年份每个父术语都有几个子术语。我将“照片”分类法与页面相关联,并用每个页面的相关术语标记了一组页面。

例如,一页包含以下术语:

红色(“颜色”的子项)sf(“位置”的子项)2010(“年份”的子项)我想做的是使用某种条件标记来显示如下术语:

  • Color: 红色Location: 旧金山Year: 2010年
术语链接。

我试图设置一个条件has_term 但我不知道如何从数组中回显术语:

<strong>Color:</strong> <?php if( has_term( array( \'red\', \'blue\', \'green\' ), \'photos\' )  ) {
    // do something here
}
?>
该代码检查三个术语(“红色”、“蓝色”、“绿色”)中的任何一个是否与该页面相关联,并且可以很好地测试该术语。我只是不知道如何回应这个活跃的术语。

我总是可以为现在的父级术语(“颜色”、“位置”和“年份”)创建分类法,但如果没有单独的分类法,还有其他方法可以做到这一点,那就太好了。

如有任何建议,将不胜感激。

4 个回复
SO网友:circlecube

我可能会建议不要将每种分类组合成层次分类法,而是建立3种不同的分类法。看起来它们是照片的3个不相关属性,因此,我将为它们分离代码。然后,您不会试图围绕嵌套的分类术语进行编码,但可以单独访问它们。分类将是颜色、位置和年份。

SO网友:K Themes

假设颜色项的ID=10。用所需ID替换“10”

<?php
$termID = 10;
$taxonomyname = "photos";
$termchildren = get_term_children( $termID, $taxonomyname );  

if (is_array($termchildren)){
echo "Color: ";
foreach ($termchildren as $child) {
    $term = get_term_by( \'id\', $child, $taxonomyname );
    if (has_term($term->ID, $taxonomyname)){
       echo \'<a href="\' . get_term_link( $term->name, $taxonomyname ) . \'">\' . $term->name . \'</a>\';
    }
}
?>
冲洗并重复其他顶级分类法。

SO网友:gmazzap

以下代码为not 已测试,但应能正常工作:

在里面functions.php

function page_photos_terms($post_id = 0) {
   echo get_color_location_year($post_id, \'photos\'); 
}

function get_color_location_year($post_id = 0, $taxonomy = \'photos\') {
  if ( ! $post_id ) return \'\';
  $color = null;
  $location = null;
  $year = null;
  $out = array();
  $out_str = \'\';
  $ancestors = get_terms($taxonomy, array(\'parent\' => 0) );
  if ( empty($ancestors) || is_wp_error($ancestors) ) return \'\';
  foreach ($ancestors as $ancestor ) {
    if ( $ancestor->slug == \'color\') { $color = $ancestor; }
    if ( $ancestor->slug == \'location\') { $location = $ancestor; }
    if ( $ancestor->slug == \'year\') { $year = $ancestor; }
  }
  $terms = get_the_terms( $post_id, $taxonomy );
  if ( empty($terms ) || is_wp_error($terms) ) return \'\';
  foreach ( $terms as $term ) {
    if ( $color && ($term->parent == $color->term_id) ) {
       $out[\'color\'][] = $term->name;
    } elseif( $location && ($term->parent == $location->term_id) ) {
       $out[\'location\'][] = $term->name;
    } elseif( $year && ($term->parent == $year->term_id ) ) {
       $out[\'year\'][] = $term->name;
    }
  }
  foreach ( array(\'color\', \'location\', \'year\') as $p ) {
    if ( ! empty($out[$p]) && is_object($$p) ) {
      $out_str .= sprintf(\'<li><strong>%s</strong>: \', $$p->name );
      $out_str .= implode(\', \', $out[$p]) . \'</li>\';
    }
  }
  if ( $out_str != \'\' )  $out_str = \'<ul class="photos-meta">\' .  $out_str . \'</ul>\';
  return $out_str;
}
在中page.php (或您需要的任何地方)放置:

page_photos_terms( get_the_id() );
该函数可用于支持照片分类的所有帖子类型。

它甚至可以在循环之外工作(传递页面/帖子id),即使页面/帖子上有多种颜色(或年份或位置)。

希望有帮助。

SO网友:Tessa

在PHP中尝试类似的内容?我相信它可以进一步优化。

$terms = get_the_terms($post_id, \'photos\');//Get the \'photos\' terms for just this page
if($terms) {
   //Loop through each term
   foreach( $terms as $term ) {
      //Check if the term has a parent
      if($term->parent != 0) {
         //Check if the parent term is one you want to include (color, location, and year)
         $parent = get_term($term->parent, \'photos\');
         if($parent->slug == \'color\' || $parent->slug == \'location\' || $parent->slug == \'year\') {
            //Echo out the parent\'s name followed by the term\'s name
            echo(\'<strong>\'.$parent->name.\':</strong> \'.$term->name);
         }
      }
   }
}
使用此选项,您应该能够渲染指定的任何术语,这些术语的父级为颜色、位置或年份。如果您添加或删除术语(如添加黄色),那么这将非常有用,现在您不必更新代码,因为它检查的是父级的slug,而不是特定的颜色。

结束

相关推荐

encoded search terms with %20

<form class=\"search-form\" action=\"<?php echo home_url( \'/suche/\' ); ?>\" method=\"get\"> <input type=\"text\" name=\"s\" class=\"s\" value=\"<?php the_search_query(); ?>\" /> 这是我的searchform.php 样板你知道为什么在搜索例如“

获取分层分类中的术语 - 小码农CODE - 行之有效找到问题解决它

获取分层分类中的术语

时间:2012-12-14 作者:Ethan

我有一个分层自定义分类法(“照片”),有3个父术语

颜色、位置、年份每个父术语都有几个子术语。我将“照片”分类法与页面相关联,并用每个页面的相关术语标记了一组页面。

例如,一页包含以下术语:

红色(“颜色”的子项)sf(“位置”的子项)2010(“年份”的子项)我想做的是使用某种条件标记来显示如下术语:

  • Color: 红色Location: 旧金山Year: 2010年
术语链接。

我试图设置一个条件has_term 但我不知道如何从数组中回显术语:

<strong>Color:</strong> <?php if( has_term( array( \'red\', \'blue\', \'green\' ), \'photos\' )  ) {
    // do something here
}
?>
该代码检查三个术语(“红色”、“蓝色”、“绿色”)中的任何一个是否与该页面相关联,并且可以很好地测试该术语。我只是不知道如何回应这个活跃的术语。

我总是可以为现在的父级术语(“颜色”、“位置”和“年份”)创建分类法,但如果没有单独的分类法,还有其他方法可以做到这一点,那就太好了。

如有任何建议,将不胜感激。

4 个回复
SO网友:circlecube

我可能会建议不要将每种分类组合成层次分类法,而是建立3种不同的分类法。看起来它们是照片的3个不相关属性,因此,我将为它们分离代码。然后,您不会试图围绕嵌套的分类术语进行编码,但可以单独访问它们。分类将是颜色、位置和年份。

SO网友:K Themes

假设颜色项的ID=10。用所需ID替换“10”

<?php
$termID = 10;
$taxonomyname = "photos";
$termchildren = get_term_children( $termID, $taxonomyname );  

if (is_array($termchildren)){
echo "Color: ";
foreach ($termchildren as $child) {
    $term = get_term_by( \'id\', $child, $taxonomyname );
    if (has_term($term->ID, $taxonomyname)){
       echo \'<a href="\' . get_term_link( $term->name, $taxonomyname ) . \'">\' . $term->name . \'</a>\';
    }
}
?>
冲洗并重复其他顶级分类法。

SO网友:gmazzap

以下代码为not 已测试,但应能正常工作:

在里面functions.php

function page_photos_terms($post_id = 0) {
   echo get_color_location_year($post_id, \'photos\'); 
}

function get_color_location_year($post_id = 0, $taxonomy = \'photos\') {
  if ( ! $post_id ) return \'\';
  $color = null;
  $location = null;
  $year = null;
  $out = array();
  $out_str = \'\';
  $ancestors = get_terms($taxonomy, array(\'parent\' => 0) );
  if ( empty($ancestors) || is_wp_error($ancestors) ) return \'\';
  foreach ($ancestors as $ancestor ) {
    if ( $ancestor->slug == \'color\') { $color = $ancestor; }
    if ( $ancestor->slug == \'location\') { $location = $ancestor; }
    if ( $ancestor->slug == \'year\') { $year = $ancestor; }
  }
  $terms = get_the_terms( $post_id, $taxonomy );
  if ( empty($terms ) || is_wp_error($terms) ) return \'\';
  foreach ( $terms as $term ) {
    if ( $color && ($term->parent == $color->term_id) ) {
       $out[\'color\'][] = $term->name;
    } elseif( $location && ($term->parent == $location->term_id) ) {
       $out[\'location\'][] = $term->name;
    } elseif( $year && ($term->parent == $year->term_id ) ) {
       $out[\'year\'][] = $term->name;
    }
  }
  foreach ( array(\'color\', \'location\', \'year\') as $p ) {
    if ( ! empty($out[$p]) && is_object($$p) ) {
      $out_str .= sprintf(\'<li><strong>%s</strong>: \', $$p->name );
      $out_str .= implode(\', \', $out[$p]) . \'</li>\';
    }
  }
  if ( $out_str != \'\' )  $out_str = \'<ul class="photos-meta">\' .  $out_str . \'</ul>\';
  return $out_str;
}
在中page.php (或您需要的任何地方)放置:

page_photos_terms( get_the_id() );
该函数可用于支持照片分类的所有帖子类型。

它甚至可以在循环之外工作(传递页面/帖子id),即使页面/帖子上有多种颜色(或年份或位置)。

希望有帮助。

SO网友:Tessa

在PHP中尝试类似的内容?我相信它可以进一步优化。

$terms = get_the_terms($post_id, \'photos\');//Get the \'photos\' terms for just this page
if($terms) {
   //Loop through each term
   foreach( $terms as $term ) {
      //Check if the term has a parent
      if($term->parent != 0) {
         //Check if the parent term is one you want to include (color, location, and year)
         $parent = get_term($term->parent, \'photos\');
         if($parent->slug == \'color\' || $parent->slug == \'location\' || $parent->slug == \'year\') {
            //Echo out the parent\'s name followed by the term\'s name
            echo(\'<strong>\'.$parent->name.\':</strong> \'.$term->name);
         }
      }
   }
}
使用此选项,您应该能够渲染指定的任何术语,这些术语的父级为颜色、位置或年份。如果您添加或删除术语(如添加黄色),那么这将非常有用,现在您不必更新代码,因为它检查的是父级的slug,而不是特定的颜色。

相关推荐

什么时候应该/不应该使用wp_get_post_Terms与Get_the_Terms?

一位用户在codex中提供了一条注释,指出唯一的区别是get\\u术语使用缓存的数据,我已经知道wp\\u get\\u post\\u术语可以让您通过slug检索数据,但我仍然想知道使用其中一个与另一个的最佳情况是什么。