PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.3.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.3.9
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / Services / UserService.php

UserService.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.3.9, at inc/Services/UserService.php

172 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace LearnPress\Services;
4
5 use Exception;
6 use LearnPress\Helpers\Singleton;
7 use LearnPress\Models\UserModel;
8 use Throwable;
9 use WP_Error;
10 use WP_User;
11
12
13 /**
14 * Class UserService
15 *
16 * Handle logic business for user.
17 *
18 * @since 4.3.4
19 * @version 1.0.0
20 */
21 class UserService {
22 use Singleton;
23
24 public function init() {}
25
26 /**
27 * Check if pretty slug exists of another user.
28 *
29 * @param string $slug
30 *
31 * @return false|UserModel
32 * @throws Exception
33 * @version 1.0.1
34 * @since 4.3.4
35 */
36 /*public function get_user_by_pretty_slug( string $slug ) {
37 if ( '' === $slug ) {
38 return false;
39 }
40
41 $lp_user_db = UserDB::getInstance();
42 $filter = new UserFilter();
43 $filter->only_fields = [ 'u.ID' ];
44 $lp_user_db->get_query_single_row( $filter );
45 $filter->join[] = "INNER JOIN {$lp_user_db->wpdb->usermeta} AS um ON um.user_id = u.ID";
46 $filter->where[] = $lp_user_db->wpdb->prepare( 'AND um.meta_key = %s', UserModel::META_KEY_USER_SLUG );
47 $filter->where[] = $lp_user_db->wpdb->prepare( 'AND um.meta_value = %s', $slug );
48 $query = $lp_user_db->get_users( $filter );
49
50 $user_id = (int) $lp_user_db->wpdb->get_var( $query );
51
52 return UserModel::find( $user_id, true );
53 }*/
54
55 /**
56 * Generate pretty slug for all users who don't have it yet.
57 *
58 * @return array [ 'processed' => int, 'generated' => int, 'skipped' => int, 'failed' => int ]
59 * @since 4.3.4
60 * @version 1.0.0
61 */
62 public function generate_users_pretty_slug(): array {
63 $user_ids = get_users(
64 [
65 'fields' => 'ids',
66 'number' => - 1,
67 ]
68 );
69
70 $result = [
71 'processed' => 0,
72 'generated' => 0,
73 'skipped' => 0,
74 'failed' => 0,
75 ];
76
77 foreach ( $user_ids as $user_id ) {
78 $user_id = (int) $user_id;
79 ++ $result['processed'];
80
81 $userModel = UserModel::find( $user_id, true );
82 if ( ! $userModel instanceof UserModel ) {
83 ++ $result['failed'];
84 continue;
85 }
86
87 if ( '' !== $userModel->get_slug_link() ) {
88 ++ $result['skipped'];
89 continue;
90 }
91
92 $generated = $this->generate_pretty_slug( $userModel );
93 if ( is_wp_error( $generated ) ) {
94 ++ $result['failed'];
95 } else {
96 ++ $result['generated'];
97 }
98 }
99
100 return $result;
101 }
102
103 /**
104 * Create a unique pretty slug for user.
105 *
106 * If the user already has a pretty slug, it will return the existing one without generating a new one.
107 * The slug is generated based on the user's first name and last name.
108 * If empty user's first name and last name, it will use the username with uniqid() to generate a slug.
109 *
110 * @return string|WP_Error
111 * @since 4.3.4
112 * @version 1.0.1
113 */
114 public function generate_pretty_slug( UserModel $userModel ) {
115 $user_slug_new = '';
116
117 try {
118 // Check if pretty slug already exists, if exists, return it without generating a new one.
119 $existing_slug = $userModel->get_slug_link();
120 if ( ! empty( $existing_slug ) ) {
121 return $existing_slug;
122 }
123
124 // Generate pretty slug based on first name and last name.
125 $first_name = $userModel->get_meta_value_by_key( 'first_name', '' );
126 $last_name = $userModel->get_meta_value_by_key( 'last_name', '' );
127 $base_source = trim( "{$first_name} {$last_name}" );
128 $base_slug = sanitize_title( $base_source );
129
130 if ( empty( $base_slug ) ) {
131 // Shuffle username with uniqid to make it more unique and less guessable, get first 10 characters to make slug shorter.
132 $base_slug = substr( str_shuffle( sanitize_title( $userModel->user_login . uniqid() ) ), 0, 10 );
133 } else {
134 $base_slug = $base_slug . substr( str_shuffle( uniqid() ), 0, 3 );
135 }
136
137 // Check slug exists.
138 $userModelFind = UserService::instance()->get_user_by_slug_link( $base_slug );
139 if ( ! $userModelFind ) {
140 $userModel->user_nicename = $base_slug;
141 $userModel->save();
142 } else {
143 // Regenerate slug by adding random string at the end of base slug until it is unique.
144 $user_slug_new = $this->generate_pretty_slug( $userModel );
145 }
146 } catch ( Throwable $e ) {
147 return new WP_Error( 'lp_user_slug_generation_failed', $e->getMessage() );
148 }
149
150 return $user_slug_new;
151 }
152
153 /**
154 * Detected user by slug link.
155 *
156 * @param string $slug_link
157 *
158 * @return false|UserModel
159 * @since 4.3.6
160 * @version 1.0.0
161 */
162 public function get_user_by_slug_link( string $slug_link ) {
163 // Get from column `user_nicename` in table `wp_users`.
164 $wp_user = get_user_by( 'slug', $slug_link );
165 if ( ! $wp_user instanceof WP_User ) {
166 return false;
167 }
168
169 return new UserModel( $wp_user->data );
170 }
171 }
172