WordPress用户分类保存的值

时间:2019-02-26 作者:user3692010

我一直在关注tutorial 在JustinTadlock的网站上设置用户分类。我把一切都做好了,但我想把分类法从单个单选调整为多复选框选择。

// If there are any competence terms, loop through them and display checkboxes.
if ( !empty( $terms ) ) {
    foreach ( $terms as $term ) { ?>
        <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 ) ); ?> />
        <label for="competence-<?php echo esc_attr( $term->slug ); ?>"><?php echo $term->name; ?></label> <br />
    <?php }
}
我已经调整了输入类型和名称值,但无法使复选框值保持选中状态。

我做了一些简单的测试,并将值硬编码到save部分

$term = esc_attr( $_POST[\'competence-photographer\'] );
$term = esc_attr( $_POST[\'competence-server-administrator\'] );
如果检查与否,我可以保留值,因此我创建了一个foreach循环,认为它可以循环所有分类术语,但我肯定做错了什么,因为我无法通过git保存值

function save_user_competence_terms( $user_id ) {

    $tax = get_taxonomy( \'competence\' );

    if ( !current_user_can( \'edit_user\', $user_id ) && current_user_can( $tax->cap->assign_terms ) )
        return false;

    $terms = get_terms( \'competence\', array( \'hide_empty\' => false ) );

    if ( !empty( $terms ) ) {

        foreach ( $terms as $term ) {
        $term = esc_attr( $_POST[$term->slug] );

        wp_set_object_terms( $user_id, array( $term ), \'competence\', false);

        clean_object_term_cache( $user_id, \'competence\' );
        }
    }
}
我相信我处理这个问题的方法是正确的,但我遗漏了一些不允许foreach阅读条款以检查复选框的内容。如有任何见解,将不胜感激。

2 个回复
SO网友:Krzysiek Dróżdż

您的代码中有两个错误。

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);

SO网友:user3692010

我推测,在您的更改中,您试图向我显示内容保存在一个数组中,老实说,我不知道wp\\u set\\u object\\u terms或clean\\u object\\u term\\u cache做了什么。这段代码的大部分来自另一个网站,我只是调整了复选框,做得很差。如果您根据我的“关于”问题以及回复中的更改提供任何其他帮助,我们将不胜感激。

function save_user_competence_terms( $user_id ) {

$tax = get_taxonomy( \'competence\' );

if ( !current_user_can( \'edit_user\', $user_id ) && current_user_can( $tax->cap->assign_terms ) )
    return false;

$terms = get_terms( \'competence\', array( \'hide_empty\' => false ) );

if ( !empty( $terms ) ) {

    $terms = array();
    foreach ( $terms as $term ) {
    $term = esc_attr( $_POST[\'competence-\' . $term->slug] );
    $terms[] = $term;
    }

    wp_set_object_terms( $user_id, $terms, \'competence\', false);
    //clean_object_term_cache( $user_id, \'competence\' );

}
}

相关推荐

Display Custom Taxonomy names

我正在尝试显示自定义帖子类型的自定义分类法。因此,此分类法特定于此自定义帖子类型。不幸的是,我无法让它们显示出来。这是我在函数中的代码。php注册自定义分类法:add_action(\'init\', \'products_categories\', 0); function products_categories(){ $labels = array (\'name\' => _x(\'Product Categories\',\'taxonomy general nam