PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.3.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.3.8
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 / ExternalPlugin / Polylang / class-lp-polylang.php

class-lp-polylang.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.3.8, at inc/ExternalPlugin/Polylang/class-lp-polylang.php

436 lines 13.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * @class LP_Polylang
5 *
6 * @since 4.1.5
7 * @version 1.0.1
8 * @author tungnx
9 */
10
11 use LearnPress\Filters\UserItemsFilter;
12 use LearnPress\Helpers\Singleton;
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit; // Exit if accesDsed directly
16 }
17
18 class LP_Polylang {
19 use Singleton;
20
21 public function init() {
22 $this->hooks();
23 }
24
25 public function hooks() {
26 add_filter( 'learn-press/general-settings-fields', [ $this, 'general_settings_fields' ], 10, 2 );
27 add_filter( 'lp/settings/permalinks', [ $this, 'permalink_settings_fields' ], 10, 2 );
28 add_filter( 'learn_press_get_page_id', [ $this, 'get_page_id' ], 10, 2 );
29 add_filter( 'lp/template/archive-course/skeleton/args', [ $this, 'lang_arg_query_course' ] );
30 add_filter( 'lp/profile/args/user_courses_attend', [ $this, 'lang_arg_query_course' ] );
31 add_filter( 'lp/profile/args/user_courses_created', [ $this, 'lang_arg_query_course' ] );
32 add_filter( 'lp/profile/args/user_courses_statistic', [ $this, 'lang_arg_query_course' ] );
33 add_filter( 'learnpress/rest/frontend/profile/course_tab/query', [ $this, 'args_query_user_courses' ], 10, 2 );
34 add_action( 'learn-press/courses/handle_params_for_query_courses', [ $this, 'filter_query_courses' ], 10, 2 );
35 add_filter( 'lp/user/course/query/filter', [ $this, 'filter_query_user_courses' ], 10 );
36 add_filter( 'pll_the_language_link', [ $this, 'get_link_switcher' ], 10, 3 );
37 add_filter( 'learn-press/rewrite/rules', [ $this, 'pll_rewrite_rules' ] );
38 }
39
40 /**
41 * Get page_id config on LP Settings
42 *
43 * @param int $page_id
44 * @param string $name
45 *
46 * @return int
47 */
48 public function get_page_id( int $page_id = 0, string $name = '' ): int {
49 if ( ! is_callable( 'pll_default_language' ) ) {
50 return $page_id;
51 }
52
53 $lang_default = pll_default_language();
54 $lang_current = pll_current_language();
55 if ( ! $lang_current ) {
56 $lang_current = LP_Request::get_param( 'pll-current-lang' ); // Param this send via lp_archive_skeleton_get_args
57 }
58
59 if ( $lang_current && $lang_current != $lang_default ) {
60 $page_id_trans = absint( LP_Settings::get_option( "{$name}_page_id_{$lang_current}" ) );
61 if ( $page_id_trans ) {
62 $page_id = $page_id_trans;
63 }
64 }
65
66 return $page_id;
67 }
68
69 /**
70 * @param array $args
71 *
72 * @return array
73 */
74 public function lang_arg_query_course( array $args ): array {
75 if ( ! function_exists( 'pll_current_language' ) ) {
76 return $args;
77 }
78
79 $args['pll-current-lang'] = pll_current_language();
80
81 return $args;
82 }
83
84 /**
85 * Query get course by current language
86 *
87 * @param LP_Course_Filter $filter
88 * @param array $param
89 *
90 * @return LP_Course_Filter
91 * @since 4.1.4
92 * @version 1.0.2
93 */
94 public function filter_query_courses( LP_Course_Filter $filter, array $param ): LP_Course_Filter {
95 $pll_current_lang = $param['pll-current-lang'] ?? '';
96 if ( empty( $pll_current_lang ) ) {
97 $pll_current_lang = LP_Request::get_param( 'pll-current-lang' );
98
99 if ( empty( $pll_current_lang ) ) {
100 return $filter;
101 }
102 }
103
104 $lp_db = LP_Database::getInstance();
105 $filter->join[] = "INNER JOIN $lp_db->tb_term_relationships AS r_term_pll ON p.ID = r_term_pll.object_id";
106 $filter->join[] = "INNER JOIN $lp_db->tb_term_taxonomy AS pll_term_taxonomy ON r_term_pll.term_taxonomy_id = pll_term_taxonomy.term_taxonomy_id";
107 $filter->join[] = "INNER JOIN $lp_db->tb_terms AS pll_terms ON pll_term_taxonomy.term_id = pll_terms.term_id";
108 $filter->where[] = $lp_db->wpdb->prepare( 'AND pll_terms.slug = %s', $pll_current_lang );
109
110 return $filter;
111 }
112
113 /**
114 * Profile filter query get user course by current language
115 *
116 * @param LP_User_Items_Filter|UserItemsFilter $filter
117 *
118 * @return LP_User_Items_Filter
119 */
120 public function filter_query_user_courses( $filter ): LP_User_Items_Filter {
121 $pll_current_lang = pll_current_language(); // For query load page
122 if ( ! $pll_current_lang ) { // For query call API
123 $pll_current_lang = LP_Request::get_param( 'pll-current-lang' );
124 }
125
126 if ( empty( $pll_current_lang ) ) {
127 return $filter;
128 }
129
130 if ( $pll_current_lang == pll_default_language() ) {
131 return $filter;
132 }
133
134 $lp_db = LP_Database::getInstance();
135
136 $filter->join[] = "INNER JOIN $lp_db->tb_term_relationships AS r_term_pll ON ui.item_id = r_term_pll.object_id";
137 $filter->join[] = "INNER JOIN $lp_db->tb_term_taxonomy AS pll_term_taxonomy ON r_term_pll.term_taxonomy_id = pll_term_taxonomy.term_taxonomy_id";
138 $filter->join[] = "INNER JOIN $lp_db->tb_terms AS pll_terms ON pll_term_taxonomy.term_id = pll_terms.term_id";
139 $filter->where[] = $lp_db->wpdb->prepare( 'AND pll_terms.slug = %s', $pll_current_lang );
140
141 return $filter;
142 }
143
144 /**
145 * Profile filter query get course by current language
146 *
147 * @param LP_Course_Filter $filter
148 * @param array $args
149 *
150 * @return LP_Course_Filter
151 */
152 /*public function profile_filter_query_courses( LP_Course_Filter $filter, array $args ): LP_Course_Filter {
153 $pll_current_lang = $args['pll-current-lang'] ?? '';
154
155 if ( empty( $pll_current_lang ) ) {
156 return $filter;
157 }
158
159 $lp_db = LP_Database::getInstance();
160
161 $filter->join[] = "INNER JOIN $lp_db->tb_term_relationships AS r_term ON p.ID = r_term.object_id";
162 $filter->join[] = "INNER JOIN $lp_db->tb_terms AS term ON r_term.term_taxonomy_id = term.term_id";
163 $filter->where[] = $lp_db->wpdb->prepare( 'AND term.slug = %s', $pll_current_lang );
164
165 return $filter;
166 }*/
167
168 /**
169 * Args get course by current language
170 *
171 * @param array $args
172 * @param WP_REST_Request $request
173 *
174 * @return array
175 */
176 public function args_query_user_courses( array $args, WP_REST_Request $request ): array {
177 $pll_current_lang = LP_Helper::sanitize_params_submitted( $request['pll-current-lang'] ?? '' );
178
179 if ( empty( $pll_current_lang ) ) {
180 return $args;
181 }
182
183 $args['pll-current-lang'] = $pll_current_lang;
184
185 return $args;
186 }
187
188 /**
189 * Create new fields of languages not default
190 */
191 public function general_settings_fields( array $fields ): array {
192 $default_lang = pll_default_language();
193 $current_lang = pll_current_language();
194
195 $field_arr = [
196 'courses_page_id',
197 'profile_page_id',
198 'checkout_page_id',
199 'become_a_teacher_page_id',
200 'term_conditions_page_id',
201 'instructors_page_id',
202 'single_instructor_page_id',
203 ];
204 $field_arr = apply_filters( 'lp_pll/settings/name-fields', $field_arr );
205
206 if ( $default_lang != $current_lang ) {
207 // Set name field with lang
208 foreach ( $fields as $k => $field ) {
209 if ( isset( $field['id'] ) && in_array( $field['id'], $field_arr ) ) {
210 $fields[ $k ]['id'] = $field['id'] . '_' . $current_lang;
211 }
212 }
213 }
214
215 return $fields;
216 }
217
218 /**
219 * Create new fields of languages not default
220 *
221 * @param array $fields
222 *
223 * @return array
224 * @version 1.0.0
225 * @since 4.2.3.3
226 */
227 public function permalink_settings_fields( array $fields ): array {
228 $default_lang = pll_default_language();
229 $current_lang = pll_current_language();
230
231 $field_arr = [
232 //'lesson_slug',
233 ];
234 $field_arr = apply_filters( 'lp_pll/settings/permalink/name-fields', $field_arr );
235
236 if ( $default_lang != $current_lang ) {
237 // Set name field with lang
238 foreach ( $fields as $k => $field ) {
239 if ( isset( $field['id'] ) && in_array( $field['id'], $field_arr ) ) {
240 $fields[ $k ]['id'] = $field['id'] . '_' . $current_lang;
241 }
242 }
243 }
244
245 return $fields;
246 }
247
248 /**
249 * Handle link swither
250 *
251 * @param $url
252 * @param $slug
253 * @param $locale
254 *
255 * @return false|mixed|string
256 * @version 1.0.1
257 * @since 4.1.5
258 */
259 public function get_link_switcher( $url, $slug, $locale ) {
260 $slug_lang = '';
261 if ( $slug !== pll_default_language() ) {
262 $slug_lang = '_' . $slug;
263 }
264
265 $arr_page = array( LP_PAGE_COURSES, LP_PAGE_PROFILE );
266 if ( in_array( LP_Page_Controller::page_current(), $arr_page )
267 && ! learn_press_is_course_tax()
268 && ! learn_press_is_course_tag() ) {
269 $name_page = str_replace( 'lp_page_', '', LP_Page_Controller::page_current() );
270 $url = get_permalink( LP_Settings::get_option( $name_page . '_page_id' . $slug_lang ) );
271 }
272
273 return $url;
274 }
275
276 /**
277 * Rewrite url with polylang
278 *
279 * @param array $rules
280 *
281 * @return array
282 * @since 4.2.3.3
283 * @version 1.0.1
284 * @uses LP_Query::add_rewrite_rules
285 */
286 public function pll_rewrite_rules( array $rules ): array {
287 if ( ! is_callable( 'pll_default_language' ) || ! is_callable( 'pll_current_language' ) ) {
288 return $rules;
289 }
290
291 $rules_old = $rules;
292
293 $lang_default = pll_default_language();
294 $lang_current = pll_current_language();
295 $pll_options = $this->get_pll_options();
296 $all_lang = pll_languages_list();
297 $hide_default = $pll_options['hide_default'] ?? 1;
298 $force_lang = $pll_options['force_lang'] ?? 1;
299 $force_rewrite = $pll_options['rewrite'] ?? 1;
300
301 $lang_slug = '';
302 $lang = $lang_current;
303 if ( 1 == $force_lang ) { // Pll add slug language to link
304 if ( $force_rewrite == 0 ) {
305 $lang_slug .= 'language/';
306 }
307
308 $lang_slug .= $lang . '/';
309 } else { // Pll add slug language to link
310 $lang_slug .= $lang . '/';
311 }
312
313 $lang_get_option = '';
314 if ( $lang != $lang_default ) {
315 $lang_get_option = '_' . $lang;
316 }
317 if ( $hide_default && $lang_current == $lang_default ) {
318 return $rules;
319 }
320
321 // Add language to rewrite url exits
322 foreach ( $rules_old as $key_group => $group_rule ) {
323 foreach ( $group_rule as $key => $rule ) {
324 $new_key = array_key_first( $rule );
325 $value = $rule[ $new_key ];
326 $new_key = substr_replace( $new_key, '', 0, 1 );
327 $new_key = '^' . $lang_slug . $new_key;
328 $rules[ $key_group ][ $key ] = [ $new_key => $value ];
329 }
330 }
331
332 // Rewrite url for courses
333 // Not use learn_press_get_page_id( 'courses' ) because it $lang_current = false with $pll_options['force_lang'] = 0
334 /*$courses_page_id_lang = LP_Settings::get_option( 'courses_page_id' . $lang_get_option, false );
335 if ( $courses_page_id_lang ) {
336 $courses_slug = get_post_field( 'post_name', $courses_page_id_lang );
337
338 $rules['courses'][ 'pll-archive-' . $lang ] = [
339 "^{$lang_slug}{$courses_slug}/?(?:page/)?([^/][0-9]*)?/?$" =>
340 'index.php?paged=$matches[1]&post_type=' . LP_COURSE_CPT,
341 ];
342 }*/
343
344 // Rewrite url for instructors
345 /*$instructors_page_id_lang = LP_Settings::get_option( 'instructors_page_id' . $lang_get_option, false );
346 if ( $instructors_page_id_lang ) {
347 $instructors_slug = get_post_field( 'post_name', $instructors_page_id_lang );
348
349 $rules['instructors'][ 'pll-archive-' . $lang ] = [
350 "^{$lang_slug}{$instructors_slug}/?(?:page/)?([^/][0-9]*)?/?$" =>
351 'index.php?page_id=' . $instructors_page_id_lang,
352 ];
353 }*/
354
355 // Rewrite url for instructor
356 /*$single_instructor_page_id = LP_Settings::get_option( 'single_instructor_page_id' . $lang_get_option, false );
357 if ( $single_instructor_page_id ) {
358 $instructor_slug = get_post_field( 'post_name', $single_instructor_page_id );
359
360 $rules['instructor'][ 'has_name_' . $lang ] = [
361 "^{$lang_slug}{$instructor_slug}/([^/]+)/?(?:page/)?([^/][0-9]*)?/?$" =>
362 'index.php?page_id=' . $single_instructor_page_id . '&is_single_instructor=1&instructor_name=$matches[1]&paged=$matches[2]',
363 ];
364 $rules['instructor'][ 'no_name_' . $lang ] = [
365 "^{$lang_slug}{$instructor_slug}/?$" =>
366 'index.php?page_id=' . $single_instructor_page_id . '&is_single_instructor=1&paged=$matches[2]',
367 ];
368 }*/
369
370 //$this->add_rewrite_rules_profile( $rules, $lang_slug, $lang_get_option, $lang );
371
372 return apply_filters( 'learn-press/polylang-rewrite-url', $rules );
373 }
374
375 /**
376 * Add rewrite rules for profile page.
377 *
378 * @param $rules
379 * @param $lang_slug
380 * @param $lang_get_option
381 * @param $lang
382 *
383 * @return void
384 */
385 public function add_rewrite_rules_profile( &$rules, $lang_slug, $lang_get_option, $lang ) {
386 $profile_page_id_lang = LP_Settings::get_option( 'profile_page_id' . $lang_get_option, false );
387 if ( $profile_page_id_lang ) {
388 // Rule view profile of user (self or another)
389 $page_profile_slug = get_post_field( 'post_name', $profile_page_id_lang );
390 $rules['profile'][ 'user_' . $lang ] = [
391 "^{$lang_slug}{$page_profile_slug}/([^/]*)/?$" =>
392 "index.php?page_id={$profile_page_id_lang}&user=" . '$matches[1]',
393 ];
394
395 // Rule view profile of user (self or another) with tab
396 $tabs = LP_Profile::get_tabs_arr();
397 if ( $tabs ) {
398 /**
399 * @var LP_Profile_Tab $args
400 */
401 foreach ( $tabs as $tab_key => $args ) {
402 $tab_slug = $args['slug'] ?? $tab_key;
403 $rules['profile'][ $tab_key . '_' . $lang ] = [
404 "^{$lang_slug}{$page_profile_slug}/([^/]*)/({$tab_slug})/?([0-9]*)/?$" =>
405 'index.php?page_id=' . $profile_page_id_lang . '&user=$matches[1]&view=$matches[2]&view_id=$matches[3]',
406 ];
407
408 if ( ! empty( $args['sections'] ) ) {
409 foreach ( $args['sections'] as $section_key => $section ) {
410 $section_slug = $section['slug'] ?? $section_key;
411 $rules['profile'][ $section_key . '_' . $lang ] = [
412 "^{$lang_slug}{$page_profile_slug}/([^/]*)/({$tab_slug})/({$section_slug})/?([0-9]*)?$" =>
413 'index.php?page_id=' . $profile_page_id_lang . '&user=$matches[1]&view=$matches[2]&section=$matches[3]&view_id=$matches[4]',
414 ];
415 }
416 }
417 }
418 }
419 }
420
421 //apply_filters( 'learn-press/rewrite-rules/profile', $rules['profile'], $profile_id );
422 }
423
424 /**
425 * Get polylang settings
426 *
427 * @return array
428 * @version 1.0.1
429 * @since 4.2.3.3
430 */
431 public function get_pll_options(): array {
432 // Not use PLL()->options because it is incorrect.
433 return maybe_unserialize( get_option( 'polylang' ) );
434 }
435 }
436