您的代码中有两个错误。
First one 字段名称不一致。这是您的复选框字段:
<input type="checkbox" name="competence-<?php echo esc_attr( $term->slug ); ?>" id="competence-<?php echo esc_attr( $term->slug ); ?>" value="<?php echo esc_attr( $term->slug ); ?>" <?php checked( true, is_object_in_term( $user->ID, \'competence\', $term ) ); ?> />
下面是您正在检查的部分:
foreach($terms as$term){$term=esc\\u attr($\\u POST[$term->slug]);
所以您的字段有名称competence-<TERM_SLUG>
, 但你只能用<TERM_SLUG>
.
它应该是:
foreach ( $terms as $term ) {
$term = esc_attr( $_POST[ \'competence-\' . $term->slug] );
Second problem 是设置对象术语的方式:
wp_set_object_terms( $user_id, array( $term ), \'competence\', false);
看看
wp_set_object_terms docs. 这是此函数的默认调用:
wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
如您所见,最后一个参数是
$append
它告诉我们这个词是应该附加到现有的词上,还是应该覆盖现有的词。您将false作为该参数的值传递,因此您的foreach循环将覆盖现有术语-因此只保存最后一个术语。
一种修复方法如下:
$terms = array();
foreach ( $terms as $term ) {
$term = esc_attr( $_POST[ \'competence-\' . $term->slug] );
$terms[] = $term;
}
wp_set_object_terms( $user_id, $terms, \'competence\', false);