从数组创建发布术语的继承性并将发布分配给术语

时间:2019-05-16 作者:warm__tape

我有一个文本字符串,名为$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\' );

1 个回复
最合适的回答,由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。

相关推荐

在IS_PAGE(ARRAY())中使用变量

Similarly to this topic 我需要从用户输入中提取一些页面ID(主题选项管理页面),将它们存储在变量中,然后使用is_page() 滤器输入由用换行符分隔的数字ID组成,尽管如果我能做到这一点,我也会进行重构以允许页面插入。基于on the answer to the linked topic, 我有以下内容,但仍然不起作用。该变量输出一个正确的ID数组,但是is_page() 不基于数组进行筛选。// Wordpress my_conditional_load stuff code