| 1 |
<?php |
| 2 |
|
| 3 |
/** |
| 4 |
* @class LP_Polylang |
| 5 |
* |
| 6 |
* @since 4.1.5 |
| 7 |
* @version 1.0.0 |
| 8 |
* @author tungnx |
| 9 |
*/ |
| 10 |
|
| 11 |
if ( ! defined( 'ABSPATH' ) ) { |
| 12 |
exit; // Exit if accessed directly |
| 13 |
} |
| 14 |
|
| 15 |
class LP_Polylang { |
| 16 |
protected static $instance; |
| 17 |
|
| 18 |
protected function __construct() { |
| 19 |
$this->hooks(); |
| 20 |
} |
| 21 |
|
| 22 |
public function hooks() { |
| 23 |
add_filter( 'learn-press/general-settings-fields', [ $this, 'general_settings_fields' ], 10, 2 ); |
| 24 |
add_filter( 'learn_press_get_page_id', [ $this, 'get_page_id' ], 10, 2 ); |
| 25 |
add_filter( 'lp/template/archive-course/skeleton/args', [ $this, 'wpml_arg_query_course' ] ); |
| 26 |
add_filter( 'lp/profile/args/user_courses_attend', [ $this, 'wpml_arg_query_course' ] ); |
| 27 |
add_filter( 'lp/profile/args/user_courses_created', [ $this, 'wpml_arg_query_course' ] ); |
| 28 |
add_filter( 'lp/profile/args/user_courses_statistic', [ $this, 'wpml_arg_query_course' ] ); |
| 29 |
add_filter( 'learnpress/rest/frontend/profile/course_tab/query', [ $this, 'args_query_user_courses' ], 10, 2 ); |
| 30 |
add_filter( 'lp/course/query/filter', [ $this, 'filter_query_courses' ], 10 ); |
| 31 |
add_filter( 'lp/user/course/query/filter', [ $this, 'filter_query_user_courses' ], 10 ); |
| 32 |
add_filter( 'pll_the_language_link', [ $this, 'get_link_switcher' ], 10, 3 ); |
| 33 |
} |
| 34 |
|
| 35 |
/** |
| 36 |
* Get page_id config on LP Settings |
| 37 |
* |
| 38 |
* @param int $page_id |
| 39 |
* @param string $name |
| 40 |
* |
| 41 |
* @return int |
| 42 |
*/ |
| 43 |
public function get_page_id( int $page_id = 0, string $name = '' ): int { |
| 44 |
if ( ! is_callable( 'pll_default_language' ) ) { |
| 45 |
return $page_id; |
| 46 |
} |
| 47 |
|
| 48 |
$lang_default = pll_default_language(); |
| 49 |
$lang_current = pll_current_language(); |
| 50 |
|
| 51 |
if ( $lang_current != $lang_default ) { |
| 52 |
$page_id = absint( LP_Settings::get_option( "{$name}_page_id_{$lang_current}" ) ); |
| 53 |
} |
| 54 |
|
| 55 |
return $page_id; |
| 56 |
} |
| 57 |
|
| 58 |
/** |
| 59 |
* @param array $args |
| 60 |
* |
| 61 |
* @return array |
| 62 |
*/ |
| 63 |
public function wpml_arg_query_course( array $args ): array { |
| 64 |
if ( ! function_exists( 'pll_current_language' ) ) { |
| 65 |
return $args; |
| 66 |
} |
| 67 |
|
| 68 |
$args['pll-current-lang'] = pll_current_language(); |
| 69 |
|
| 70 |
return $args; |
| 71 |
} |
| 72 |
|
| 73 |
/** |
| 74 |
* Query get course by current language |
| 75 |
* |
| 76 |
* @param LP_Course_Filter $filter |
| 77 |
* |
| 78 |
* @return LP_Course_Filter |
| 79 |
*/ |
| 80 |
public function filter_query_courses( LP_Course_Filter $filter ): LP_Course_Filter { |
| 81 |
$pll_current_lang = LP_Helper::sanitize_params_submitted( $_REQUEST['pll-current-lang'] ?? '' ); |
| 82 |
|
| 83 |
if ( empty( $pll_current_lang ) ) { |
| 84 |
return $filter; |
| 85 |
} |
| 86 |
|
| 87 |
$lp_db = LP_Database::getInstance(); |
| 88 |
|
| 89 |
$filter->join[] = "INNER JOIN $lp_db->tb_term_relationships AS r_term ON p.ID = r_term.object_id"; |
| 90 |
$filter->join[] = "INNER JOIN $lp_db->tb_terms AS term ON r_term.term_taxonomy_id = term.term_id"; |
| 91 |
$filter->where[] = $lp_db->wpdb->prepare( 'AND term.slug = %s', $pll_current_lang ); |
| 92 |
|
| 93 |
return $filter; |
| 94 |
} |
| 95 |
|
| 96 |
/** |
| 97 |
* Profile filter query get user course by current language |
| 98 |
* |
| 99 |
* @param LP_User_Items_Filter $filter |
| 100 |
* |
| 101 |
* @return LP_User_Items_Filter |
| 102 |
*/ |
| 103 |
public function filter_query_user_courses( LP_User_Items_Filter $filter ): LP_User_Items_Filter { |
| 104 |
$pll_current_lang = LP_Helper::sanitize_params_submitted( $_REQUEST['pll-current-lang'] ?? '' ); |
| 105 |
|
| 106 |
if ( empty( $pll_current_lang ) ) { |
| 107 |
return $filter; |
| 108 |
} |
| 109 |
|
| 110 |
$lp_db = LP_Database::getInstance(); |
| 111 |
|
| 112 |
$filter->join[] = "INNER JOIN $lp_db->tb_term_relationships AS r_term ON ui.item_id = r_term.object_id"; |
| 113 |
$filter->join[] = "INNER JOIN $lp_db->tb_terms AS term ON r_term.term_taxonomy_id = term.term_id"; |
| 114 |
$filter->where[] = $lp_db->wpdb->prepare( 'AND term.slug = %s', $pll_current_lang ); |
| 115 |
|
| 116 |
return $filter; |
| 117 |
} |
| 118 |
|
| 119 |
/** |
| 120 |
* Profile filter query get course by current language |
| 121 |
* |
| 122 |
* @param LP_Course_Filter $filter |
| 123 |
* @param array $args |
| 124 |
* |
| 125 |
* @return LP_Course_Filter |
| 126 |
*/ |
| 127 |
/*public function profile_filter_query_courses( LP_Course_Filter $filter, array $args ): LP_Course_Filter { |
| 128 |
$pll_current_lang = $args['pll-current-lang'] ?? ''; |
| 129 |
|
| 130 |
if ( empty( $pll_current_lang ) ) { |
| 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 ON p.ID = r_term.object_id"; |
| 137 |
$filter->join[] = "INNER JOIN $lp_db->tb_terms AS term ON r_term.term_taxonomy_id = term.term_id"; |
| 138 |
$filter->where[] = $lp_db->wpdb->prepare( 'AND term.slug = %s', $pll_current_lang ); |
| 139 |
|
| 140 |
return $filter; |
| 141 |
}*/ |
| 142 |
|
| 143 |
/** |
| 144 |
* Args get course by current language |
| 145 |
* |
| 146 |
* @param array $args |
| 147 |
* @param WP_REST_Request $request |
| 148 |
* |
| 149 |
* @return array |
| 150 |
*/ |
| 151 |
public function args_query_user_courses( array $args, WP_REST_Request $request ): array { |
| 152 |
$pll_current_lang = LP_Helper::sanitize_params_submitted( $request['pll-current-lang'] ?? '' ); |
| 153 |
|
| 154 |
if ( empty( $pll_current_lang ) ) { |
| 155 |
return $args; |
| 156 |
} |
| 157 |
|
| 158 |
$args['pll-current-lang'] = $pll_current_lang; |
| 159 |
|
| 160 |
return $args; |
| 161 |
} |
| 162 |
|
| 163 |
/** |
| 164 |
* Create new fields of languages not default |
| 165 |
*/ |
| 166 |
public function general_settings_fields( array $fields ): array { |
| 167 |
$default_lang = pll_default_language(); |
| 168 |
$current_lang = pll_current_language(); |
| 169 |
|
| 170 |
$field_arr = [ 'courses_page_id', 'profile_page_id', 'checkout_page_id', 'become_a_teacher_page_id', 'term_conditions_page_id' ]; |
| 171 |
$field_arr = apply_filters( 'lp_pll/settings/name-fields', $field_arr ); |
| 172 |
|
| 173 |
if ( $default_lang != $current_lang ) { |
| 174 |
// Set name field with lang |
| 175 |
foreach ( $fields as $k => $field ) { |
| 176 |
if ( isset( $field['id'] ) && in_array( $field['id'], $field_arr ) ) { |
| 177 |
$fields[ $k ]['id'] = $field['id'] . '_' . $current_lang; |
| 178 |
} |
| 179 |
} |
| 180 |
} |
| 181 |
|
| 182 |
return $fields; |
| 183 |
} |
| 184 |
|
| 185 |
public function get_link_switcher( $url, $slug, $locale ) { |
| 186 |
$slug_lang = ''; |
| 187 |
|
| 188 |
if ( $slug !== pll_default_language() ) { |
| 189 |
$slug_lang = '_' . $slug; |
| 190 |
} |
| 191 |
|
| 192 |
$arr_page = array( LP_PAGE_COURSES, LP_PAGE_PROFILE ); |
| 193 |
|
| 194 |
if ( in_array( LP_Page_Controller::page_current(), $arr_page ) ) { |
| 195 |
$name_page = str_replace( 'lp_page_', '', LP_Page_Controller::page_current() ); |
| 196 |
$url = get_permalink( LP_Settings::get_option( $name_page . '_page_id' . $slug_lang ) ); |
| 197 |
} |
| 198 |
|
| 199 |
return $url; |
| 200 |
} |
| 201 |
|
| 202 |
/** |
| 203 |
* @return LP_Polylang |
| 204 |
*/ |
| 205 |
public static function instance(): LP_Polylang { |
| 206 |
if ( is_null( self::$instance ) ) { |
| 207 |
self::$instance = new self(); |
| 208 |
} |
| 209 |
|
| 210 |
return self::$instance; |
| 211 |
} |
| 212 |
} |
| 213 |
|