在数据库中插入、更新或删除数据(Usermeta)

时间:2020-06-29 作者:Tetragrammaton

我这里有个情况。我正在为WordPress编写一个自定义插件。我正在处理一个问题:

I\'v为自定义帖子类型创建了元框add_meta_box 还有一个回调函数,我在其中生成一个多选框。所有用户都会显示一个用户ID。要点是:自定义帖子类型是一个组,该组可以有多个成员(用户)。我尝试的第一件事是将订阅此组的所有用户保存在Posteta表的一行中,但这不是good solution.

我现在要做的是:在usermeta 具有此键的表_enroll_user_value_key.

我的字段:echo \'<select multiple name="enroll_user_field[]" id="enroll_user_field">\'; 对于每个选定的用户,我要将此值传递给中的新数据库行user_meta. 现在,我仅使用此功能保存此数据:update_user_meta( $enroll_user_data, \'_enroll_user_value_key\', $post->ID ); 但当我选择多个用户时,该行不会更新或创建,因为该字段传递了多个值enroll_user_field[].

我怎样才能解决这个问题?我应该创建foreach loop 然后重复update_user_meta 每次,对于每个选定的用户?如果我从组中删除了一个用户,我应该为此使用单独的删除功能或查询吗?

EDIT:

add_meta_box(
    \'group_member\',
    \'Group members\',
    \'group_members_callback\',
    \'group\',
    \'normal\'
);

function group_members_callback( $post ){
    wp_nonce_field( \'group_members_save\', \'group_members_nonce\' );
        
    $values = get_post_meta($post->ID, \'_group_members_value_key\', true);
    $values = explode(\',\', $values);
    
    echo \'<label for="group_members_field">Assign users to this group. If you want to assign multiple users to this module, hold CTRL while you are selecting</label><br /><br />\';
    
    echo \'<select multiple name="group_members_field[]" id="group_members_field">\';
        $users = get_users();
        
        foreach( $users as $user ){
            if( in_array($user->ID, $values )){
                echo \'<option selected value="\' . $user->ID . \'">\' . esc_attr( $user->user_email ) . \'</option>\';
            }else{
                echo \'<option value="\' . $user->ID . \'">\' . esc_attr( $user->user_email ) . \'</option>\';
            }
        }
    echo \'</select>\';
}


function group_members_save( $post_id ){
    if( ! isset( $_POST[\'group_members_nonce\'] ) ){
        return;
    }
    
    if( ! wp_verify_nonce( $_POST[\'group_members_nonce\'], \'group_members_save\') ){
        return;
    }
    
    if( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE ){
        return;
    }
    
    if( ! current_user_can(\'edit_post\', $post_id ) ){
        return;
    }
    
    if( ! isset($_POST[\'group_members_field\'] ) ){
        return;
    }
    
    $group_members_data = sanitize_text_field( implode(\',\', $_POST[\'group_members_field\'] ) );
    
    update_post_meta( $post_id, \'_group_members_value_key\', $group_members_data );
}

add_action(\'save_post\', \'group_members_save\');
此行update_post_meta( $post_id, \'_group_members_value_key\', $group_members_data ); 应该是update_user_meta, 因为我想把它保存在usermeta 表格,以单独的行显示。

1 个回复
最合适的回答,由SO网友:mozboz 整理而成

因此,post meta或user meta的问题是,如果您的密钥是,例如。_group_members_value_key 每个用户或每个帖子只有一项数据用于存储数据,并且您需要many 每个用户的项目和many 每个职位的项目。这是两列数据,但在元表中只有一列。

假设您有以下数据:

User ID | Group Id
1 | 10
1 | 20 
1 | 30
2 | 10
2 | 40
3 | 30
要将其放入例如user 1的usermeta中,您有以下选择:

user id | meta_key | value
1 | "_group_members_value_key" | "10,20,30"
或:

user id | meta_key | value
1 | "_group_members_value_key_10" | "yes"
1 | "_group_members_value_key_10" | "yes"
1 | "_group_members_value_key_10" | "yes"
注意,在第二种情况下,必须将组ID作为键的一部分。

因此,也许第二种解决方案适合您—只需将组id添加到键中,并使用一些额外的逻辑,如:

要将用户放入组中,请执行以下操作:

update_user_meta($userId, "_group_members_value_key_" . $groupId, "yes")
要从组中删除用户,请执行以下操作:

update_user_meta($userId, "_group_members_value_key_" . $groupId, "no")
要检查用户是否在组中,请执行以下操作:

if (get_user_meta($userId, "_group_members_value_key_" . $groupId) == "yes") {
查找组中的所有用户:

$user_query = new WP_User_Query( array( \'meta_key\' => "_group_members_value_key_" . $groupId, \'meta_value\' => \'yes\' ) );
我不确定这是否适合你想做的事情。让我知道。这些都是代码示例,因此您可能需要对它们进行一些编辑,以满足您的需要,但此数据结构应该适合您的需要。

看起来$_POST[\'group_members_field\'] 将是一个数组,因此如果它是post ID,则需要执行以下操作:

foreach($_POST[\'group_members_field\'] as $postId) {
    update_user_meta($someUserId, \'_group_members_value_key\'.$postId, "yes");
}

相关推荐

如何显示存储为数组的MySQL表数据?

我的WordPress网站上有一个“mlw\\U结果”表,其中存储了测验结果。我使用“测验和调查大师”插件创建这些测验。现在,我需要显示特定测验会话的所有结果(结果Id=7)。虽然我根据需要获取了所有其他字段,但在需要实际值而不是数组的位置会显示两个数组。<?php define( \'SHORTINIT\', true ); require( \'wp-load.php\' ); $id=7; global $wpdb; $result_data = $w