我有一个文本字符串,名为$location_string
它是以下格式的地址:1 Victoria Street,Wellington,New Zealand以及一种称为位置的自定义层次分类法。
我正在努力实现以下目标:
1) 为阵列中的每个对象创建位置术语。国家将是顶级术语,城市是国家的孩子,街道地址是城市的孩子。
2) 将数组中的所有术语分配给由$post_id
我意识到下面的代码有很大的缺陷-有什么想法可以修复它吗?目前,它只创建街道和乡村,还创建了两次街道:
$location_array_reversed = array_reverse( $location_array );
$i = 0;
$len = count($location_array_reversed);
$location_array_ids = array();
foreach( $location_array_reversed as $term ){
if ($i == 0) {
// Top level term
wp_insert_term( $term, \'location\' );
$tag = get_term_by( \'slug\', $term, \'location\' );
$term_id = $tag->term_id;
// Save term ID to array
$location_array_ids[] = $term_id;
} else if ($i == $len - 1) {
wp_insert_term( $term, \'location\', array( \'parent\'=> $term_id ) );
// Child terms
wp_insert_term( $term, \'location\' );
$tag = get_term_by( \'slug\', $term, \'location\' );
$term_id = $tag->term_id;
// Save term ID to array
$location_array_ids[] = $term_id;
}
$i++;
}
// Now assign terms to post
wp_set_object_terms( $post_id, $location_array_ids, \'location\' );
最合适的回答,由SO网友:nmr 整理而成
只添加第一个和最后一个术语,在代码中省略所有其他术语。街道会创建两次,因为您要双重插入数组的最后一个元素。
else if ($i == $len - 1) {
wp_insert_term( $term, \'location\', array( \'parent\'=> $term_id ) );
// Child terms
wp_insert_term( $term, \'location\' );
}
尝试更改
foreach
回路:
$location_array_reversed = array_reverse( $location_array );
$parent_id = 0;
$location_array_ids = [];
$taxonomy_slug = \'location\';
foreach( $location_array_reversed as $term ) {
$res = term_exists( $term, $taxonomy_slug, $parent_id );
if ( $res === NULL || $res == 0 )
$res = wp_insert_term( $term, $taxonomy_slug, [\'parent\' => $parent_id] );
$term_id = (int) $res[\'term_id\']; // ID of existing or inserted term
// Save term ID to array
$location_array_ids[] = $term_id;
$parent_id = $term_id;
}
wp_set_object_terms($post_id, $location_array_ids, $taxonomy_slug);
wp_insert_term()
返回插入术语的ID,因此不需要使用
get_term_by()
获取插入元素的ID。