Wordpress:即使条件有对象,get_terms()也不会返回任何内容

时间:2016-09-30 11:35:52

标签: php wordpress custom-taxonomy taxonomy-terms polylang

如果没有分配帖子,get_terms的正常行为不会返回条款。但事实并非如此,我可以看到在管理员中分配的术语,并检查数据库,一切似乎都很好。另请查看此代码:

$p = get_post(5018); // correctly returns the post

// works: returns the assigned term
$post_terms = wp_get_post_terms($p->ID, 'solutions_sectors', array("fields" => "all"));

// now the opposite:
$first = $post_terms[0];
$tid = $first->term_id;
// works: gives a list of post ids
$term_posts = get_objects_in_term($tid, 'solutions_sectors');

// still, this will output an empty array:
$terms = get_terms(array('taxonomy' => 'solutions_sectors');

// while this will output the right array (obviously):
$terms = get_terms(array('taxonomy' => 'solutions_sectors', 'hide_empty' => false));

所以,我的帖子确实有条款,但get_terms似乎没有意识到。为什么呢?

请注意以下事项:

  • 我使用带有自定义分类的自定义帖子类型

  • 我使用polylang作为语言插件(但所有帖子和术语似乎都已正确翻译和分配)

2 个答案:

答案 0 :(得分:1)

发现问题:term_taxonomy表的count字段为空,这是因为我在自定义导入期间使用wp_insert_post()批量保存了我的帖子。

wp_insert_post()似乎有一个错误:它正确地将指定的字词应用于新帖子,但没有更新term_taxonomy计数。

这里的解决方案是对wp_update_term_count_now()的一次性调用。

由于我必须检索在创建分类法之前执行的文件上的所有术语ID,因此我必须将代码包装在初始化操作中。

add_action('init','reset_counts', 11, 0);
function reset_counts(){
  // I'm currently using polylang so first I get all the languages
  $lang_slugs = pll_languages_list(array('fields' => 'slug'));

  foreach($lang_slugs as $lang){
    $terms_ids = get_terms(array(
      'taxonomy' => 'solutions_sectors'
      ,'fields' => 'ids'
      ,'lang' => $lang
      ,'hide_empty' => false
    ));

    // it's important to perform the is_array check 
    if(is_array($terms_ids)) wp_update_term_count_now($terms_ids, 'solutions_sectors');
  }
}

这就是诀窍。运行后,注释掉init动作调用非常重要。

答案 1 :(得分:0)

如果 get_terms 由于某种奇怪的原因不起作用,自定义分类法未显示已注册,请尝试使用 WP_Term_Query

$term_query = new WP_Term_Query( array( 
    'taxonomy' => 'regions', // <-- Custom Taxonomy name..
    'orderby'                => 'name',
    'order'                  => 'ASC',
    'child_of'               => 0,
    'parent' => 0,
    'fields'                 => 'all',
    'hide_empty'             => false,
    ) );


// Show Array info
echo "<pre>";
print_r($term_query->terms);
echo "</pre>";


//Render html
if ( ! empty( $term_query->terms ) ) {
foreach ( $term_query ->terms as $term ) {
echo $term->name .", ";
echo $term->term_id .", ";
echo $term->slug .", ";
echo "<br>";
}
} else {
echo '‘No term found.’';
}

从这里获取所有参数:https://developer.wordpress.org/reference/classes/WP_Term_Query/__construct/