buddypress.php
11.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
<?php
if ( ! defined( 'ABSPATH' ) ) exit;
if( !is_plugin_active( 'buddypress/bp-loader.php' ) && !function_exists( 'bp_is_active' ) ){
return;
}
class ACUI_Buddypress{
var $fields;
var $profile_groups;
var $plugin_path;
function __construct(){
$this->plugin_path = is_plugin_active( 'buddyboss-platform/bp-loader.php' ) ? WP_PLUGIN_DIR . "/buddyboss-platform/" : WP_PLUGIN_DIR . "/buddypress/";
if( !class_exists( 'BP_XProfile_Group' ) )
require_once( $this->plugin_path . "bp-xprofile/classes/class-bp-xprofile-group.php" );
if( !class_exists( 'BP_Groups_Member' ) )
require_once( $this->plugin_path . "bp-groups/classes/class-bp-groups-member.php" );
$this->profile_groups = $this->get_profile_groups();
$this->fields = $this->get_fields();
}
function hooks(){
add_filter( 'acui_restricted_fields', array( $this, 'restricted_fields' ), 10, 1 );
add_action( 'acui_documentation_after_plugins_activated', array( $this, 'documentation' ) );
add_filter( 'acui_export_columns', array( $this, 'export_columns' ), 10, 1 );
add_filter( 'acui_export_data', array( $this, 'export_data' ), 10, 3 );
add_action( 'post_acui_import_single_user', array( $this, 'import' ), 10, 6 );
add_action( 'post_acui_import_single_user', array( $this, 'import_avatar' ), 10, 3 );
}
function restricted_fields( $acui_restricted_fields ){
return array_merge( $acui_restricted_fields, array( 'bp_group', 'bp_group_role', 'bp_avatar' ), $this->fields );
}
function get_profile_groups(){
return BP_XProfile_Group::get( array( 'fetch_fields' => true ) );
}
public function get_fields(){
$buddypress_fields = array();
if ( !empty( $this->profile_groups ) ) {
foreach ( $this->profile_groups as $profile_group ) {
if ( !empty( $profile_group->fields ) ) {
foreach ( $profile_group->fields as $field ) {
$buddypress_fields[] = $field->name;
}
}
}
}
return $buddypress_fields;
}
function get_field_type( $field_name ){
if ( !empty( $this->profile_groups ) ) {
foreach ( $this->profile_groups as $profile_group ) {
if ( !empty( $profile_group->fields ) ) {
foreach ( $profile_group->fields as $field ) {
if( $field_name == $field->name )
return $field->type;
}
}
}
}
}
function get_type_import_help( $type ){
switch( $type ){
case 'datebox':
$help = __( sprintf( 'Format should be like this: %s-01-01 00:00:00', date( 'Y' ) ), 'import-users-from-csv-with-meta' );
break;
case 'checkbox':
$help = __( 'If you use more than one value, please use ## to separate each item', 'import-users-from-csv-with-meta' );
break;
}
return empty( $help ) ? '' : " <em>($help)</em>";
}
function get_groups( $user_id ){
if( !class_exists( "BP_Groups_Member" ) )
require_once( $this->plugin_path . "bp-groups/classes/class-bp-groups-member.php" );
$groups = BP_Groups_Member::get_group_ids( $user_id );
return implode( ",", $groups['groups'] );
}
function get_member_type( $user_id ){
$member_types = bp_get_member_type( $user_id, false );
return ( is_array( $member_types ) ) ? implode( ",", $member_types ) : $member_types;
}
function documentation(){
?>
<tr valign="top">
<th scope="row"><?php _e( 'BuddyPress/BuddyBoss fields', 'import-users-from-csv-with-meta'); ?></th>
<td><?php _e( 'You can insert any profile from BuddyPress using his name as header. Plugin will check, before import, which fields are defined in BuddyPress and will assign it in the update. You can use this fields:', 'import-users-from-csv-with-meta' ); ?>
<ul style="list-style:disc outside none;margin-left:2em;">
<?php foreach ( $this->get_fields() as $buddypress_field ):
$type = $this->get_field_type( $buddypress_field );
?>
<li><?php echo $buddypress_field; ?> - <?php echo $type . $this->get_type_import_help( $type ); ?></li>
<?php endforeach; ?>
</ul>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php _e( 'BuddyPress/BuddyBoss avatar', 'import-users-from-csv-with-meta' ); ?></th>
<td><?php _e( 'You can import users avatars using a column called <strong>bp_avatar</strong>, in this field you can place:', 'import-users-from-csv-with-meta' ); ?>
<ul style="list-style:disc outside none;margin-left:2em;">
<li>An integer which identify the ID of an attachment uploaded to your media library</li>
<li>A string that contain a path or an URL to the image</li>
</ul>
</td>
</tr>
<tr valign="top">
<th scope="row"><?php _e( "BuddyPress/BuddyBoss groups and roles", 'import-users-from-csv-with-meta' ); ?></th>
<td><?php _e( "You can use the <strong>profile fields</strong> you have created and also you can set one or more groups for each user. For example:", 'import-users-from-csv-with-meta' ); ?>
<ul style="list-style:disc outside none; margin-left:2em;">
<li><?php _e( "If you want to assign an user to a group you have to create a column 'bp_group' and a column 'bp_group_role'", 'import-users-from-csv-with-meta' ); ?></li>
<li><?php _e( "Then in each cell you have to fill with the BuddyPress <strong>group slug</strong>", 'import-users-from-csv-with-meta' ); ?></li>
<li><?php _e( "And the role assigned in this group:", 'import-users-from-csv-with-meta' ); ?> <em>Administrator, Moderator or Member</em></li>
<li><?php _e( "You can also use group ids if you know it using a column 'bp_group_id' instead of 'bp_group'", 'import-users-from-csv-with-meta' ); ?></li>
<li><?php _e( "You can do it with multiple groups at the same time using commas to separate different groups, in bp_group column, i.e.: <em>group_1, group_2, group_3</em>", 'import-users-from-csv-with-meta' ); ?></li>
<li><?php _e( "But you will have to assign a role for each group:", 'import-users-from-csv-with-meta' ); ?> <em>Moderator,Moderator,Member,Member</em></li>
<li><?php _e( "If you choose to update roles and group role is empty, user will be removed from the group", 'import-users-from-csv-with-meta' ); ?></li>
<li><?php _e( "If you get some error of this kind:", 'import-users-from-csv-with-meta' ); ?> <code>Fatal error: Class 'BP_XProfile_Group'</code> <?php _e( "please enable Buddypress Extended Profile then import the csv file. You can then disable this afterwards", 'import-users-from-csv-with-meta' ); ?></li>
</ul>
</td>
</tr>
<?php
}
function export_columns( $row ){
foreach ( $this->fields as $key ) {
$row[ $key ] = $key;
}
$row['bp_group_id'] = 'bp_group_id';
$row['bp_member_type'] = 'bp_member_type';
return $row;
}
function export_data( $row, $user, $args ){
$fields_to_export = ( count( $args['filtered_columns'] ) == 0 ) ? $this->fields : array_intersect( $this->fields, $args['filtered_columns'] );
foreach( $fields_to_export as $key ) {
$row[ $key ] = xprofile_get_field_data( $key, $user, 'comma' );
}
if( count( $args['filtered_columns'] ) == 0 || in_array( 'bp_group_id', $args['filtered_columns'] ) )
$row['bp_group_id'] = $this->get_groups( $user );
if( count( $args['filtered_columns'] ) == 0 || in_array( 'bp_member_type', $args['filtered_columns'] ) )
$row['bp_member_type'] = $this->get_member_type( $user );
return $row;
}
function import( $headers, $row, $user_id, $role, $positions, $form_data ){
$update_roles_existing_users = isset( $form_data["update_roles_existing_users"] ) ? sanitize_text_field( $form_data["update_roles_existing_users"] ) : '';
foreach( $this->fields as $field ){
$pos = array_search( $field, $headers );
if( $pos === FALSE )
continue;
switch( $this->get_field_type( $field ) ){
case 'datebox':
$date = $row[$pos];
switch( true ){
case is_numeric( $date ):
$UNIX_DATE = ($date - 25569) * 86400;
$datebox = gmdate("Y-m-d H:i:s", $UNIX_DATE);break;
case preg_match('/(\d{1,2})[\/-](\d{1,2})[\/-]([4567890]{1}\d{1})/',$date,$match):
$match[3]='19'.$match[3];
case preg_match('/(\d{1,2})[\/-](\d{1,2})[\/-](20[4567890]{1}\d{1})/',$date,$match):
case preg_match('/(\d{1,2})[\/-](\d{1,2})[\/-](19[4567890]{1}\d{1})/',$date,$match):
$datebox= ($match[3].'-'.$match[2].'-'.$match[1]);
break;
default:
$datebox = $date;
}
$datebox = strtotime( $datebox );
xprofile_set_field_data( $field, $user_id, date( 'Y-m-d H:i:s', $datebox ) );
unset( $datebox );
break;
case 'checkbox':
xprofile_set_field_data( $field, $user_id, explode( '##', $row[ $pos ] ) );
break;
default:
xprofile_set_field_data( $field, $user_id, $row[$pos] );
}
}
$pos_bp_group = array_search( 'bp_group', $headers );
$pos_bp_group_id = array_search( 'bp_group_id', $headers );
$pos_bp_group_role = array_search( 'bp_group_role', $headers );
if( $pos_bp_group !== FALSE ){
$groups = explode( ',', $row[ $pos_bp_group ] );
$groups_role = explode( ',', $row[ $pos_bp_group_role ] );
for( $j = 0; $j < count( $groups ); $j++ ){
$group_id = BP_Groups_Group::group_exists( $groups[ $j ] );
if( !empty( $group_id ) ){
$this->add_user_group( $user_id, $group_id, $groups_role[ $j ], $update_roles_existing_users );
}
}
}
if( $pos_bp_group_id !== FALSE ){
$groups_id = explode( ',', $row[ $pos_bp_group_id ] );
$groups_role = explode( ',', $row[ $pos_bp_group_role ] );
for( $j = 0; $j < count( $groups_id ); $j++ ){
$group_id = intval( $groups_id[ $j ] );
if( !empty( $group_id ) ){
$this->add_user_group( $user_id, $group_id, $groups_role[ $j ], $update_roles_existing_users );
}
}
}
$pos_member_type = array_search( 'bp_member_type', $headers );
if( $pos_member_type !== FALSE ){
bp_set_member_type( $user_id, $row[$pos_member_type] );
}
}
function add_user_group( $user_id, $group_id, $group_role, $update_roles_existing_users ){
if( $update_roles_existing_users == 'yes' || $update_roles_existing_users == 'yes_no_override' ){
$member = new BP_Groups_Member( $user_id, $group_id );
$member->remove();
}
if( ( $update_roles_existing_users == 'yes' || $update_roles_existing_users == 'yes_no_override' ) && empty( $group_role ) )
return;
groups_join_group( $group_id, $user_id );
if( $group_role == 'Moderator' ){
groups_promote_member( $user_id, $group_id, 'mod' );
}
elseif( $group_role == 'Administrator' ){
groups_promote_member( $user_id, $group_id, 'admin' );
}
}
function import_avatar( $headers, $row, $user_id ){
$pos = array_search( 'bp_avatar', $headers );
if( $pos === FALSE )
return;
$this->import_avatar_raw( $user_id, $row[ $pos ] );
}
function import_avatar_raw( $user_id, $source ){
$avatar_dir = bp_core_avatar_upload_path() . '/avatars';
if ( ! file_exists( $avatar_dir ) ) {
if ( ! wp_mkdir_p( $avatar_dir ) ) {
return false;
}
}
$avatar_folder_dir = apply_filters( 'bp_core_avatar_folder_dir', $avatar_dir . '/' . $user_id, $user_id, 'user', 'avatars' );
if ( ! is_dir( $avatar_folder_dir ) ) {
if ( ! wp_mkdir_p( $avatar_folder_dir ) ) {
return false;
}
}
$original_file = $avatar_folder_dir . '/import-export-users-customers-bp-avatar-' . $user_id . '.png';
$data = ( (string)(int)$source == $source ) ? file_get_contents( get_attached_file( $source ) ) : file_get_contents( $source );
if ( file_put_contents( $original_file, $data ) ) {
$avatar_to_crop = str_replace( bp_core_avatar_upload_path(), '', $original_file );
$crop_args = array(
'item_id' => $user_id,
'original_file' => $avatar_to_crop,
'crop_x' => 0,
'crop_y' => 0,
);
return bp_core_avatar_handle_crop( $crop_args );
} else {
return false;
}
}
}
$acui_buddypress = new ACUI_Buddypress();
$acui_buddypress->hooks();