| Server IP : 172.67.147.195 / Your IP : 216.73.216.142 Web Server : Apache/2 System : Linux hosting8537.lvs 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 User : mienphi ( 1014) PHP Version : 8.2.14 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /home/mienphi/public_html/wp-content/plugins/learnpress-wpml/inc/hooks/ |
Upload File : |
<?php
/**
* Class LP_Addon_WPML_Hooks
*
* @since 4.0.0
* @version 1.0.0
* @author Minhpd
*/
class LP_Addon_WPML_Hooks {
private static $instance;
/**
* @var array $wpml_setting
*/
public $wpml_setting = array();
/**
* @var int $wpml_setting_course
*/
public $wpml_setting_course = 0;
/**
* @var SitePress $sitepress
*/
public $sitepress;
public static function instance(): self {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
self::$instance->wpml_setting = get_option( 'icl_sitepress_settings', array() );
self::$instance->wpml_setting_course = self::$instance->wpml_setting['custom_posts_sync_option']['lp_course'] ?? 0;
}
return self::$instance;
}
/**
* LP_Addon_WPML_Hooks constructor.
*/
protected function __construct() {
global $sitepress;
$this->sitepress = $sitepress;
// Add param lang when call api course page profile
add_filter( 'lp/profile/args/user_courses_created', array( $this, 'lp_wpml_add_params_lang_restapi' ), 10 );
add_filter( 'lp/profile/args/user_courses_attend', array( $this, 'lp_wpml_add_params_lang_restapi' ), 10 );
add_filter( 'lp/user/course/query/filter', array( $this, 'lp_wpml_filter_user_course' ), 10 );
// Hook get query courses by lang
add_filter( 'lp/template/archive-course/skeleton/args', array( $this, 'lp_wpml_add_params_lang_restapi' ), 10 );
add_filter( 'learn-press/courses/handle_params_for_query_courses', array(
$this,
'lp_wpml_filter_query_courses'
), 10, 2 );
// Hook get statistic info on profile
add_filter( 'lp/profile/args/user_courses_statistic', array( $this, 'lp_wpml_add_params_lang_restapi' ), 10 );
// Hook change link
add_filter( 'learn_press_get_page_id', array( $this, 'get_page_id' ), 10, 2 );
// Set language default for course, items' course when created course via LP Tool
add_action( 'lp/background/course/save', array( $this, 'set_course_sample_default_lang' ), 10, 2 );
add_action( 'lp/section/clone/success', array( $this, 'set_section_lang' ), 10, 1 );
// Set save translation completed
add_filter( 'wpml_translation_editor_save_job_data', array( $this, 'save_job_data_to_complete' ), 20, 1 );
// Auto create translate items of courses
add_filter( 'wpml_pro_translation_completed', array( $this, 'sync_lp_items_translate' ), 10, 3 );
// Check sections and items of course was translate.
add_filter( 'lp/section/can-clone', array( $this, 'check_section_translated' ), 10, 4 );
add_filter( 'lp/section/item/can-clone', array( $this, 'check_section_item_translated' ), 10, 2 );
add_filter( 'lp/quiz/question/can-clone', array( $this, 'check_quiz_question_translated' ), 10, 2 );
// create item translate when duplicate post
add_action( 'learn-press/item/after-duplicate', array( $this, 'translate_item_after_duplicated' ), 10, 2 );
// change item when change setting format url wpml
add_filter( 'learn-press/course/item-link', array( $this, 'lp_wpml_course_item_link' ), 10, 2 );
// change rest url wpml
add_filter( 'rest_url', array( $this, 'lp_wpml_rest_url' ), 9999, 4 );
// Search items by lang in single course admin section
add_filter( 'learn-press/modal-search-items/args', array( $this, 'lp_wpml_modal_search_items_args' ), 10, 1 );
}
/**
* Add param lang when call api course tabs , statistic,... page profile
*
* @param array $args
*
* @return array
*/
public function lp_wpml_add_params_lang_restapi( array $args ): array {
$current_lang = apply_filters( 'wpml_current_language', null );
$default_lang = apply_filters( 'wpml_default_language', null );
// url format setting
$language_negotiation_type = $this->wpml_setting['language_negotiation_type'];
if ( $language_negotiation_type == 1 ) {
$args['lang'] = $current_lang;
} elseif ( $current_lang != $default_lang ) {
$args['lang'] = $current_lang;
}
return $args;
}
/**
* custom filter tab purchased with current language
*
* @param LP_User_Items_Filter $filter
*
* @return LP_User_Items_Filter $filter
* @throws Exception
*/
public function lp_wpml_filter_user_course( LP_User_Items_Filter $filter ): LP_User_Items_Filter {
$wpml_default_lang = apply_filters( 'wpml_default_language', null );
$wpml_current_lang = $_REQUEST['lang'] ?? $wpml_default_lang;
if ( ! isset( $wpml_current_lang ) ) {
return $filter;
}
$lp_wpml_db = LP_WPML_DB::getInstance();
$filter->join[] = "INNER JOIN $lp_wpml_db->tb_icl_translations as wpml ON ui.item_id = wpml.element_id";
if ( $this->wpml_setting_course == 1 ) { // Get courses has translated by lang
$filter->where[] = $lp_wpml_db->wpdb->prepare( 'AND wpml.language_code = %s AND wpml.element_type = %s', $wpml_current_lang, LP_WPML_COURSE_CPT );
} elseif ( $this->wpml_setting_course == 2 ) { // Get courses has translated, if not get course by default lang
if ( $wpml_current_lang === $wpml_default_lang ) {
$filter->where[] = $lp_wpml_db->wpdb->prepare( 'AND wpml.language_code = %s AND wpml.element_type = %s', $wpml_current_lang, LP_WPML_COURSE_CPT );
} else {
// Get courses id by lang
$wpml_filter = new LP_WPML_Filter();
$wpml_filter->return_string_query = true;
$wpml_filter->language_code = $wpml_current_lang;
$query_course_wpml_by_lang = $lp_wpml_db->get_courses_by_lang( $wpml_filter );
// Get trid by lang
$wpml_filter = new LP_WPML_Filter();
$wpml_filter->language_code = $wpml_current_lang;
$wpml_filter->return_string_query = true;
$query_trid_course_translated = $lp_wpml_db->get_trid_by_lang( $wpml_filter );
// Query get courses not translate lang, will get default lang
$wpml_filter = new LP_WPML_Filter();
$wpml_filter->return_string_query = true;
$wpml_filter->language_code = $wpml_default_lang;
$query_course_wpml_not_translate_by_lang = $lp_wpml_db->get_courses_by_default_lang_not_translate_by_lang( $wpml_filter, $query_trid_course_translated );
$filter->where[] = 'AND (ui.item_id IN (' . $query_course_wpml_by_lang . ') OR ui.item_id IN (' . $query_course_wpml_not_translate_by_lang . '))';
}
}
return $filter;
}
/**
* custom filter courses page archive course
*
* @param LP_Course_Filter $filter
* @param array $params
*
* @return LP_Course_Filter
* @throws Exception
*/
public function lp_wpml_filter_query_courses( LP_Course_Filter $filter, array $params ): LP_Course_Filter {
$lp_wpml_db = LP_WPML_DB::getInstance();
$wpml_default_lang = apply_filters( 'wpml_default_language', null );
$wpml_current_lang = $params['lang'] ?? $_REQUEST['lang'] ?? $wpml_default_lang;
if ( ! isset( $wpml_current_lang ) ) {
return $filter;
}
$filter->join[] = "INNER JOIN {$lp_wpml_db->tb_icl_translations} as wpml ON p.ID = wpml.element_id";
if ( $this->wpml_setting_course == 1 ) { // Get courses has translated by lang
$filter->where[] = $lp_wpml_db->wpdb->prepare( 'AND wpml.language_code = %s AND wpml.element_type = %s', $wpml_current_lang, LP_WPML_COURSE_CPT );
} elseif ( $this->wpml_setting_course == 2 ) { // Get courses has translated, if not get course by default lang
if ( $wpml_current_lang === $wpml_default_lang ) {
$filter->where[] = $lp_wpml_db->wpdb->prepare( 'AND wpml.language_code = %s AND wpml.element_type = %s', $wpml_current_lang, LP_WPML_COURSE_CPT );
} else {
// Get courses id by lang
$wpml_filter = new LP_WPML_Filter();
$wpml_filter->return_string_query = true;
$wpml_filter->language_code = $wpml_current_lang;
$query_course_wpml_by_lang = $lp_wpml_db->get_courses_by_lang( $wpml_filter );
// Get trid by lang
$wpml_filter = new LP_WPML_Filter();
$wpml_filter->language_code = $wpml_current_lang;
$wpml_filter->return_string_query = true;
$query_trid_course_translated = $lp_wpml_db->get_trid_by_lang( $wpml_filter );
// Query get courses not translate lang, will get default lang
$wpml_filter = new LP_WPML_Filter();
$wpml_filter->return_string_query = true;
$wpml_filter->language_code = $wpml_default_lang;
$query_course_wpml_not_translate_by_lang = $lp_wpml_db->get_courses_by_default_lang_not_translate_by_lang( $wpml_filter, $query_trid_course_translated );
$filter->where[] = 'AND (p.ID IN (' . $query_course_wpml_by_lang . ') OR p.ID IN (' . $query_course_wpml_not_translate_by_lang . '))';
}
}
return $filter;
}
/**
* Get page_id config on LP Settings
*
* @param int $page_id
* @param string $name
*
* @return int
*/
public function get_page_id( int $page_id = 0, string $name = '' ): int {
$wpml_default_lang = apply_filters( 'wpml_default_language', null );
$wpml_current_lang = ICL_LANGUAGE_CODE;
if ( $wpml_current_lang != $wpml_default_lang ) {
$page_id = absint( LP_Settings::get_option( "{$name}_page_id_{$wpml_current_lang}" ) );
}
return $page_id;
}
/**
* Set language default for course when created course via LP Tool
*
* @param LP_Course $course
* @param array $data
*/
public function set_course_sample_default_lang( $course, $data ) {
if ( ! isset( $data['data_sample'] ) ) {
return;
}
$post_id = $course->get_id();
$this->set_default_lang_for_item( $post_id );
$course_item_ids = $course->get_items();
foreach ( $course_item_ids as $item ) {
$this->set_default_lang_for_item( $item->item_id );
}
}
/**
* Set language default for section's course.
* Save text lang code after name section.
*
* @param array $args
*
* @return int
*/
public function set_section_lang( array $args ): int {
$lp_wpml_db = LP_WPML_DB::getInstance();
$section_new = $args['section_new'] ?? [];
$section_origin = $args['section_origin'] ?? [];
$course_id_new = $args['course_id_new'] ?? [];
$section_id_new = $section_new['id'] ?? $section_new['section_id'] ?? 0;
$translation_id = 0;
$section_id_origin = $section_origin['id'] ?? $section_origin['section_id'] ?? 0;
$element_type = 'post_lp_section';
if ( ! isset( $_POST['id_new'] ) || ! isset( $_POST['job'] ) ) {
return $translation_id;
}
try {
$job = LP_Helper::sanitize_params_submitted( $_POST['job'] );
$source_lang_code = $job['source_language_code'] ?? '';
$lang_code = $job['language_code'] ?? '';
if ( empty( $source_lang_code ) || empty( $lang_code ) ) {
return $translation_id;
}
// Get trid of section origin.
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->element_id = [ $section_id_origin ];
$filter->language_code = $source_lang_code;
$section_trid = $lp_wpml_db->get_trid( $filter );
if ( ! $section_trid ) {
return $translation_id;
}
/**
* @var SitePress $sitepress
*/
global $sitepress;
// Set language translate for new section.
$set_language_args = array(
'element_id' => $section_id_new,
'element_type' => $element_type,
'trid' => $section_trid,
'language_code' => $lang_code,
'source_language_code' => $source_lang_code,
);
$sitepress->set_element_language_details_action( $set_language_args );
// Update title section.
$lp_section_curd = new LP_Section_CURD( $course_id_new );
$section_new['section_name'] = $section_new['section_name'] . ' - ' . $lang_code;
$lp_section_curd->update( $section_new );
return $translation_id;
} catch ( Throwable $e ) {
error_log( $e->getMessage() );
}
return $translation_id;
}
/**
* Set default lang for section.
*
* @param int $section_id
*
* @return int
*/
public function set_section_default_lang( int $section_id ): int {
/**
* @var SitePress $sitepress
*/
$translation_id = 0;
$sitepress = $this->sitepress;
$lp_wpml_db = LP_WPML_DB::getInstance();
try {
$default_language = $sitepress->get_default_language();
$filter_trid_max = new LP_WPML_Filter();
$trid_max = $lp_wpml_db->get_trid_max( $filter_trid_max );
if ( ! $trid_max ) {
return $translation_id;
}
$trid_max ++;
$data = array(
'element_id' => $section_id,
'element_type' => 'post_lp_section',
'trid' => $trid_max,
'language_code' => $default_language,
'source_language_code' => null,
);
$lp_wpml_db->wpdb->insert( $lp_wpml_db->tb_icl_translations, $data, array( '%d', '%s', '%d', '%s', '%s' ) );
$filter_get_trid = new LP_WPML_Filter();
$filter_get_trid->element_id = [ $section_id ];
$filter_get_trid->trid = [ $trid_max ];
$filter_get_trid->language_code = $default_language;
$translation_id = $lp_wpml_db->get_trid( $filter_get_trid );
} catch ( Throwable $e ) {
error_log( $e->getMessage() );
}
return $translation_id;
}
/**
* Set language default for post(course, item's course) when created course via LP Tool
*
* @param int $post_id
*/
public function set_default_lang_for_item( int $post_id = 0 ) {
$wpml_settings = array();
global $wpdb;
if ( ! $post_id ) {
return;
}
$wpml = new WPML_Admin_Post_Actions( $wpml_settings, $wpdb );
$wpml->save_post_actions( $post_id, get_post( $post_id ) );
}
/**
* Set 100% completed translation, to pass condition and can call hook 'wpml_pro_translation_completed'
*
* @param array $data
*
* @return array
* @see WPML_Save_Translation_Data_Action::save_translation
* Line 85 if ( ! empty( $data['complete'] ) && ! $is_incomplete )
*
*/
public function save_job_data_to_complete( array $data ): array {
if ( ! empty( $data ) && ! empty( $data['job_post_type'] ) && 'post_' . LP_COURSE_CPT === $data['job_post_type'] ) {
$data['complete'] = 'on';
foreach ( $data['fields'] as $key => $field ) {
$data['fields'][ $key ]['finished'] = 'on';
}
}
return $data;
}
/**
* Auto create translate items of courses
*
* @param int $id_new
* @param array $data_fields
* @param object $job
*/
public function sync_lp_items_translate( $id_new, $data_fields, $job ) {
if ( empty( $id_new ) || empty( $job ) ) {
return;
}
if ( LP_COURSE_CPT !== get_post_type( $id_new )
&& LP_QUIZ_CPT !== get_post_type( $id_new )
&& LP_QUESTION_CPT !== get_post_type( $id_new ) ) {
return;
}
$params = array(
'id_new' => $id_new,
'job' => $job,
);
$bg = LP_WPML_BG_Translate::instance();
$bg->data( $params )->dispatch();
}
/**
* Check clone section, items of section.
* Update order of section and items.
*
* @param bool $can_clone
* @param int $course_id_new
* @param LP_Course $course_origin
* @param array $section_origin
*
* @return bool
*/
public function check_section_translated( bool $can_clone, int $course_id_new, LP_Course $course_origin, array $section_origin ): bool {
$lp_wpml_db = LP_WPML_DB::getInstance();
$section_trid = 0;
$section_id_origin = $section_origin['id'] ?? 0;
if ( ! $section_id_origin || ! $course_id_new ) {
return $can_clone;
}
if ( ! isset( $_POST['id_new'] ) || ! isset( $_POST['job'] ) ) {
return $can_clone;
}
$job = LP_Helper::sanitize_params_submitted( $_POST['job'] );
$source_lang_code = $job['source_language_code'] ?? '';
$lang_code = $job['language_code'] ?? '';
$element_type = 'post_lp_section';
try {
// Get trid of section origin.
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->element_id = [ $section_id_origin ];
$filter->language_code = $source_lang_code;
$section_trid = $lp_wpml_db->get_trid( $filter );
// Set default lang for origin section if not exists.
if ( ! $section_trid ) {
$section_trid = $this->set_section_default_lang( $section_id_origin );
}
// Check section has translated
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->language_code = $lang_code;
$filter->source_language_code = $source_lang_code;
$filter->trid = [ $section_trid ];
$section_translated = $lp_wpml_db->get_icl_translations( $filter );
if ( $section_translated ) {
$can_clone = false;
// Update order of section.
$section_curd = new LP_Section_CURD( $course_id_new );
$section_id_new = $section_translated[0]->element_id;
$course = learn_press_get_course( $course_id_new );
$section_new = $course->get_sections_data_arr( $section_id_new );
if ( ! isset( $section_new['section_order'] ) || $section_new['section_order'] !== $section_origin['order'] ) {
$section_new['section_order'] = $section_origin['order'];
$section_curd->update( $section_new );
}
// Update items for section
$course_curd = new LP_Course_CURD();
$course_curd->duplicate_section_items( $section_id_new, $section_curd, $section_origin );
}
} catch ( Throwable $e ) {
error_log( $e->getMessage() );
}
return $can_clone;
}
/**
* Check item of section is translated.
* Update order of section and items.
*
* @param bool $can_clone
* @param array $args
*
* @return bool
*/
public function check_section_item_translated( bool $can_clone, array $args ): bool {
$lp_wpml_db = LP_WPML_DB::getInstance();
$lp_section_items_db = LP_Section_Items_DB::getInstance();
if ( ! isset( $_POST['id_new'] ) || ! isset( $_POST['job'] ) ) {
return $can_clone;
}
$job = LP_Helper::sanitize_params_submitted( $_POST['job'] );
$source_lang_code = $job['source_language_code'] ?? '';
$lang_code = $job['language_code'] ?? '';
/** @var array $item_origin */
$item_origin = $args['item_origin'] ?? [];
/** @var int $section_id_new */
$section_id_new = $args['section_id_new'] ?? 0;
/** @var LP_Section_CURD $section_curd_new */
$section_curd_new = $args['section_curd_new'] ?? 0;
/** @var array $course */
$section_origin = $args['section_origin'] ?? 0;
if ( empty( $item_origin ) ) {
return $can_clone;
}
$item_id_origin = $item_origin['id'] ?? 0;
try {
$item_type = get_post_type( $item_id_origin );
$element_type = 'post_' . $item_type;
// Check item has default lang.
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->element_id = [ $item_id_origin ];
$filter->language_code = $source_lang_code;
$item_trid = $lp_wpml_db->get_trid( $filter );
if ( ! $item_trid ) {
return $can_clone;
}
// Check section has translated.
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->language_code = $lang_code;
$filter->source_language_code = $source_lang_code;
$filter->trid = [ $item_trid ];
$item_translated = $lp_wpml_db->get_icl_translations( $filter );
if ( $item_translated ) {
// Update item (translated) order.
$item_id_translated = $item_translated[0]->element_id;
if ( ! $item_id_translated ) {
$filter_del = new LP_WPML_Filter();
$filter_del->collection = $lp_wpml_db->tb_icl_translations;
$filter_del->where[] = $lp_wpml_db->wpdb->prepare( 'AND translation_id = %d', $item_translated[0]->translation_id );
$lp_wpml_db->delete_execute( $filter_del );
} else {
$can_clone = false;
// Update order of item.
$filter_update = new LP_Section_Items_Filter();
$filter_update->where[] = $lp_section_items_db->wpdb->prepare( 'AND item_id = %d', $item_id_translated );
$filter_update->set[] = $lp_section_items_db->wpdb->prepare( 'item_order = %d', $item_origin['order'] );
$lp_section_items_db->update( $filter_update );
// Assign item to translated section if not.
$item = [
'item_id' => $item_id_translated,
'item_order' => $item_origin['order'],
'item_type' => get_post_type( $item_id_translated ),
];
$section_curd_new->assign_item_section( $section_id_new, $item );
// If item is quiz, sync questions of quiz.
if ( LP_QUIZ_CPT === $item_type ) {
// Set quiz id origin for sync.
$job['original_doc_id'] = $item_id_origin;
$params = array(
'id_new' => $item_id_translated,
'job' => $job,
);
$translate_questions_of_quiz = LP_WPML_BG_Translate::instance();
$translate_questions_of_quiz->data( $params )->dispatch();
}
}
}
} catch ( Throwable $e ) {
error_log( $e->getMessage() );
}
return $can_clone;
}
/**
* Check item of section is translated.
* Update order of section and items.
*
* @param bool $can_clone
* @param array $args
*
* @return bool
* @version 1.0.0
* @since 4.0.1
*/
public function check_quiz_question_translated( bool $can_clone, array $args ): bool {
$lp_wpml_db = LP_WPML_DB::getInstance();
$lp_section_items_db = LP_Section_Items_DB::getInstance();
$lp_quiz_questions_db = LP_Quiz_Questions_DB::getInstance();
if ( ! isset( $_POST['id_new'] ) || ! isset( $_POST['job'] ) ) {
return $can_clone;
}
$job = LP_Helper::sanitize_params_submitted( $_POST['job'] );
$source_lang_code = $job['source_language_code'] ?? '';
$lang_code = $job['language_code'] ?? '';
/** @var int $question_id_origin */
$question_id_origin = $args['question_id_origin'] ?? 0;
/** @var LP_Quiz $quiz_origin */
$quiz_origin = $args['quiz_origin'] ?? null;
/** @var int $quiz_id_new */
$quiz_id_new = $args['quiz_id_new'] ?? 0;
if ( ! $quiz_origin ) {
return $can_clone;
}
$quiz_id_origin = $quiz_origin->get_id();
try {
$element_type = 'post_' . LP_QUESTION_CPT;
// Check question has default lang.
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->element_id = [ $question_id_origin ];
$filter->language_code = $source_lang_code;
$question_trid = $lp_wpml_db->get_trid( $filter );
if ( ! $question_trid ) {
return $can_clone;
}
// Check question has translated.
$filter = new LP_WPML_Filter();
$filter->element_type = $element_type;
$filter->language_code = $lang_code;
$filter->source_language_code = $source_lang_code;
$filter->trid = [ $question_trid ];
$item_translated = $lp_wpml_db->get_icl_translations( $filter );
if ( $item_translated ) {
$can_clone = false;
$question_id_translated = $item_translated[0]->element_id;
// Assign question translated to quiz translated if not.
$quiz_clone_curd = new LP_Quiz_CURD();
$quiz_clone_curd->add_question( $quiz_id_new, $question_id_translated );
// Get order of question origin.
$filter_get_question_origin = new LP_Quiz_Questions_Filter();
$filter_get_question_origin->quiz_ids = [ $quiz_id_origin ];
$filter_get_question_origin->question_ids = [ $question_id_origin ];
$filter_get_question_origin->field_count = 'quiz_question_id';
$questions = $lp_quiz_questions_db->get_quiz_questions( $filter_get_question_origin );
if ( $questions ) {
$question_order_origin = $questions[0]->question_order;
// Update question (translated) order.
$filter_update = new LP_Quiz_Questions_Filter();
$filter_update->collection = $lp_quiz_questions_db->tb_lp_quiz_questions;
$filter_update->set[] = $lp_section_items_db->wpdb->prepare( 'question_order = %d', $question_order_origin );
$filter_update->where[] = $lp_section_items_db->wpdb->prepare( 'AND question_id = %d', $question_id_translated );
$lp_quiz_questions_db->update_execute( $filter_update );
}
}
} catch ( Throwable $e ) {
error_log( $e->getMessage() );
}
return $can_clone;
}
/**
* Translate item of course when clone success.
*
* @param int $id_origin
* @param int $id_new
*/
public function translate_item_after_duplicated( int $id_origin, int $id_new ) {
$sitepress = $this->sitepress;
try {
if ( ! isset( $_POST['id_new'] ) || ! isset( $_POST['job'] ) ) {
$this->set_default_lang_for_item( $id_origin );
return;
}
$job = LP_Helper::sanitize_params_submitted( $_POST['job'] );
$source_lang_code = $job['source_language_code'] ?? '';
$lang_code = $job['language_code'] ?? '';
// Update item title
$post_type = get_post_type( $id_new );
$trid = $sitepress->get_element_trid( $id_origin, 'post_' . $post_type );
$element_type = 'post_' . get_post_type( $id_new );
$title_new = get_the_title( $id_origin ) . ' - ' . $lang_code;
wp_update_post(
array(
'ID' => $id_new,
'post_title' => $title_new,
)
);
$set_language_args = array(
'element_id' => $id_new,
'element_type' => $element_type,
'trid' => $trid,
'language_code' => $lang_code,
'source_language_code' => $source_lang_code,
);
$sitepress->set_element_language_details_action( $set_language_args );
} catch ( Throwable $e ) {
error_log( $e->getMessage() );
}
}
/**
* It takes the course link and adds the item slug to it
*
* @param item_link The link to the item.
* @param item_id The ID of the item.
*/
public function lp_wpml_course_item_link( $item_link, $item_id ) {
global $sitepress;
$item_type = get_post_type( $item_id );
$course_curd = new LP_Course_CURD();
$course_id = $course_curd->get_course_by_item( $item_id );
if ( ! empty( $course_id ) ) {
if ( (int) $this->wpml_setting['language_negotiation_type'] == 3 ) {
$trid_item = $sitepress->get_element_trid( $course_id[0], 'post_' . LP_COURSE_CPT );
$translations = apply_filters( 'wpml_get_element_translations', null, $trid_item, 'post_' . LP_COURSE_CPT );
$default_lang = apply_filters( 'wpml_default_language', null );
foreach ( $translations as $lang => $translation ) {
if ( ! $translation->original && $translation->element_id == $course_id[0] ) {
$course = get_post( $course_id[0] );
$course_link = $course->guid;
$item_slug = get_post_field( 'post_name', $item_id );
$slug_prefixes = apply_filters(
'learn-press/course/custom-item-prefixes',
array(
LP_QUIZ_CPT => sanitize_title_with_dashes( LearnPress::instance()->settings->get( 'quiz_slug', 'quiz' ) ),
LP_LESSON_CPT => sanitize_title_with_dashes( LearnPress::instance()->settings->get( 'lesson_slug', 'lesson' ) ),
),
$course->ID
);
$slug_prefix = trailingslashit( $slug_prefixes[ $item_type ] ?? '' );
$item_link = $course_link . $slug_prefix . $item_slug . '/?lang=' . $lang;
}
}
}
}
return $item_link;
}
public function lp_wpml_rest_url( $url, $path, $blog_id, $scheme ) {
if ( empty( $path ) ) {
$path = '/';
}
$path = '/' . ltrim( $path, '/' );
if ( is_multisite() && get_blog_option( $blog_id, 'permalink_structure' ) || get_option( 'permalink_structure' ) ) {
global $wp_rewrite;
if ( $wp_rewrite->using_index_permalinks() ) {
$url = get_home_url( $blog_id, $wp_rewrite->index . '/' . rest_get_url_prefix(), $scheme );
} else {
$url = get_home_url( $blog_id, rest_get_url_prefix(), $scheme );
}
$url .= $path;
} else {
$url = trailingslashit( get_home_url( $blog_id, '', $scheme ) );
// nginx only allows HTTP/1.0 methods when redirecting from / to /index.php.
// To work around this, we manually add index.php to the URL, avoiding the redirect.
if ( 'index.php' !== substr( $url, 9 ) ) {
$url .= 'index.php';
}
$url = add_query_arg( 'rest_route', $path, $url );
}
if ( is_ssl() && isset( $_SERVER['SERVER_NAME'] ) ) {
// If the current host is the same as the REST URL host, force the REST URL scheme to HTTPS.
if ( parse_url( get_home_url( $blog_id ), PHP_URL_HOST ) === $_SERVER['SERVER_NAME'] ) {
$url = set_url_scheme( $url, 'https' );
}
}
if ( is_admin() && force_ssl_admin() ) {
/*
* In this situation the home URL may be http:, and `is_ssl()` may be false,
* but the admin is served over https: (one way or another), so REST API usage
* will be blocked by browsers unless it is also served over HTTPS.
*/
$url = set_url_scheme( $url, 'https' );
}
return $url;
}
/**
* It allows you to search for posts in the modal search box
*
* @param array $args .
*
* @return array
*/
public function lp_wpml_modal_search_items_args( array $args ): array {
$args['suppress_filters'] = false;
return $args;
}
}
LP_Addon_WPML_Hooks::instance();