Если не найдете ответ — пишите комментарий, разберу вашу проблему и добавлю решение!
Сменить текущий язык сайта в коде
$lang = 'en';
do_action( 'wpml_switch_language', $lang ); // Меняем язык сайта на тот что в $lang
do_action( 'wpml_switch_language', null ); // Меняем язык сайта на основной
После действий на новом языке, не забудьте вернуть прежний язык при помощи кода в следующей подсказке.
Получить текущий активный язык
$lang = apply_filters( 'wpml_current_language', null );
Используйте перед изменением текущего языка в циклах, чтобы вернуть его в конце.
Получить оригинальный язык
$default_language = apply_filters( 'wpml_default_language', NULL );
Получить ID основного поста по ID перевода
$original_post_id = apply_filters( 'wpml_object_id', $post_id, $post_type, false, $default_language );
Этот код поможет узнать ИД оригинальной записи по ИД перевода
Изменить язык поста
$type_post = 'news'; // post type
$new_language = 'en'; // new lang
$post_id = 1; // post ID
$original_product_id = $post_id;
$translated_tr_product_id = $post_id;
$get_language_args = array('element_id' => $original_product_id, 'element_type' => $type_post );
$original_post_language_info = apply_filters( 'wpml_element_language_details', null, $get_language_args );
$set_language_args = array(
'element_id' => $translated_tr_product_id,
'element_type' => 'post_'.$type_post,
'trid' => $original_post_language_info->trid,
'language_code' => $new_language,
'source_language_code' => $original_post_language_info->language_code
);
do_action( 'wpml_set_element_language_details', $set_language_args );
Укажите $post_id
и $type_post
для правильной работы. Этот код изменяет установленный язык записи на указанный в $lang
Изменить язык поста и привязать в виде перевода
$new_language = 'en';
$post_id = 1; // post ID
$post_id_en = 1; // post ID en
$post_type = 'product';
// Получаем информацию о языке оригинальной записи
$get_language_args = array(
'element_id' => $post_id,
'element_type' => 'post_' . $post_type
);
$original_post_language_info = apply_filters('wpml_element_language_details', null, $get_language_args);
if ($original_post_language_info) {
// Привязываем перевод к оригинальной записи
$set_language_args = array(
'element_id' => $post_id_en, // ID переведенной записи
'element_type' => 'post_' . $post_type,
'trid' => $original_post_language_info->trid, // ID перевода
'language_code' => $new_language, // Код языка перевода
'source_language_code' => $original_post_language_info->language_code // Код языка оригинала
);
do_action('wpml_set_element_language_details', $set_language_args);
}
Этот код особенно полезен когда перевод и оригинальный пост находятся в одном языке, к примеру они оба русские. Укажите ИД оригинального поста и перевода чтобы прикрепить EN перевод к оригинальной записи.
Как в цикле получить записи другого языка
// Установка текущего языка на английский
$lang = 'en';
do_action( 'wpml_switch_language', $lang );
// Аргументы запроса
$args = array(
'post_type' => 'post', // Укажите ваш тип записей
'posts_per_page' => -1, // -1 для вывода всех записей, можно установить любое нужное количество
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
the_title(); // Ваш код вывода поста
endwhile;
else :
echo 'Нет постов на английском языке.';
endif;
wp_reset_postdata(); // Сброс данных запроса
do_action( 'wpml_switch_language', null ); // Восстановление предыдущего языка
Если вам нужно получить записи переводов а параметры lang и language не работают, то воспользуйте переключением активного языка при помощи эксшена switch language.
Получить данные поля из оригинальной записи в переводе
$post_id = get_the_ID();
$youtube_url = get_post_meta( $post_id, '_youtube', true );
if(!$youtube_url){
$default_language = apply_filters( 'wpml_default_language', NULL );
$post_type = 'product';
$original_post_id = apply_filters( 'wpml_object_id', $post_id, $post_type, false, $default_language );
$youtube_url = get_post_meta( $original_post_id, '_youtube', true );
}
Если в оригинале указана ссылка на ютуб видео а в переводе оно пустое, то этот код выведет значение из оригинальной записи.
Привязка терминов из оригинала на перевод.
Получаем термины оригинального поста, потом у этих терминов получем переводы и прикрепляю их к посту-переводу. Этот код нужен когда у основного поста есть категории а у переводов нет категорий. Мы смотрим какие категории у оригинального поста и прикрепляем их к переводу.
// require_once ABSPATH . 'wp-admin/includes/taxonomy.php'; // вдруг потребуется
$new_language = 'en';
$post_id = 1; // post ID
$post_id_en = 1; // post ID en
$post_type = 'product';
if($post_id and $post_id_en){
$taxonomies = get_object_taxonomies($post_type, 'names');
do_action( 'wpml_switch_language', $new_language );
foreach ($taxonomies as $taxonomy) {
$is_translated = apply_filters( 'wpml_is_translated_taxonomy', NULL,$taxonomy );
if(!$is_translated) continue;
$terms = wp_get_post_terms($post_id, $taxonomy);
if (!empty($terms) and !is_wp_error($terms)) {
$translated_term_ids = [];
foreach ($terms as $term) {
$translated_term_id = apply_filters('wpml_object_id', $term->term_id, $taxonomy, false, $new_language);
if ($translated_term_id) {
$translated_term_ids[] = $translated_term_id;
}
}
wp_set_post_terms($post_id_en, $translated_term_ids, $taxonomy);
// or
wp_set_object_terms($post_id_en, $translated_term_ids, $taxonomy, false);
}
}
do_action( 'wpml_switch_language', null );
}
Если что то не работает то проверьте что возвращает функция привязки термина. Если она возвращает ID термина не того языка который вы указали в нее, то ошибка в action wpml_switch_language. Так же попробуйте подключить taxonomy.php, для этого подключите код из первой строки.