您的user\\u meta未更新,因为您处理复选框不正确。。。
首先您已将所有复选框的值设置为1。因此,如果选中它们,则它们的值为1-这是保存为user\\u meta的值。
另一方面,如果未选中该复选框,则不会在POST请求中发送该复选框。所以你的foreach
循环不会在它们之间循环-因此user\\u meta将永远不会设置为除1之外的任何值;)
How to fix it?
您不应该迭代发布的数组,而应该循环发布。在该循环中,您应该检查POST请求中是否设置了给定值,并正确处理它(如果设置了值,则将user\\u meta设置为1,如果未设置值,则将其设置为0)。
此外,您不应该如此信任用户输入-如果用户篡改数据并在复选框中对ID进行一些更改,该怎么办?他可以访问其他帖子;)
所以我会这样做:
function save_consultation_user_profile_fields( $user_id ) {
# save my custom field
if( ! current_user_can(\'manage_options\') )
return false;
$query = new WP_Query( // it\'s the same query you use to create checkboxes in form
array(
\'posts_per_page\' => -1,
\'post_type\' => \'consultation\',
\'post_status\' => \'publish\'
)
);
foreach ( $query->posts as $post ) {
if ( isset( $_POST[\'consultation\'][$post->ID] ) && 1 == $_POST[\'consultation\'][$post->ID] ) {
update_user_meta( $user_id, \'consultation\' . $post->ID, 1 );
} else {
delete_user_meta( $user_id, \'consultation\' . $post->ID, 1 );
}
}
}
通过这种方式,您可以确保用户只能访问现有帖子。你们也会对数据库更友好——若用户并没有访问post的权限,那个么数据库中就并没有元数据存储。