WPML - Почему при создании записи через функцию сбрасывается перевод?

Рейтинг: 0Ответов: 1Опубликовано: 27.05.2023

У меня есть сайт на WordPress, в котором установлен плагин мультиязычности WPML. Мой исходный язык сайта - русский. Я хочу сделать так, чтобы выбранный язык пользователей сохранялся в cookie. Это нужно для того, чтобы при повторном входе на сайт - у пользователя сразу открывался язык который он ранее выбирал.

Для этого в header.php после я добавил следующую функцию:

<?php 
$default_lang = apply_filters( 'wpml_default_language', null );
if($default_lang!= ICL_LANGUAGE_CODE) {
    setcookie('language', ICL_LANGUAGE_CODE, time() + 30 * DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
}
if (isset($_COOKIE['language']) && $_COOKIE['language']!= ICL_LANGUAGE_CODE) {
    if($_SERVER['HTTP_REFERER']) {
        setcookie('language', ICL_LANGUAGE_CODE, time() + 30 * DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
    }
    else {
      $wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink() , $_COOKIE['language'] );
      if(isset($wpml_permalink)) {
        wp_redirect( $wpml_permalink );
        exit;
      }
    }
} ?>

Она отлично работает. Если я выбираю Английский язык, у меня открывается ссылка site.ru/en. Если в будущем я повторно захожу на сайт по прямой ссылке site.ru - у меня автоматически открывается site.ru/en, то что мне и нужно.

Но есть одна проблема, которую я не могу решить.

В function.php у меня есть такая функция:

// Обработка отправки формы и создание записи
function my_custom_form_submit_handler() {
    if ( isset( $_POST['currency_export'] ) && wp_verify_nonce( $_POST['_wpnonce'], 'my_custom_form_nonce' ) ) {
        $imaile = sanitize_text_field( $_POST['uemail'] );
        $single_ot = sanitize_text_field( $_POST['currency_export'] );
        $single_po = sanitize_text_field( $_POST['currency_export2'] );
        $single_wallet = sanitize_text_field( $_POST['mywallet'] );
        $single_val_op = sanitize_text_field( $_POST['wallet_ot'] );
        $single_val_po = sanitize_text_field( $_POST['wallet_po'] );
        $single_num = sanitize_text_field( $_POST['single_num'] );
        $single_val_minop = sanitize_text_field( $_POST['wallet_minot'] ); // получаем значение из поля wallet_minot
        // $user_requisites = sanitize_text_field( $_POST['wallet_reqot'] ); // получаем значение из поля wallet_reqot
        $single_val_minpo = sanitize_text_field( $_POST['wallet_minpo'] ); // получаем значение из поля wallet_minpo

        $post_data = array(
            'post_title'    => wp_strip_all_tags( $imaile ),
            'post_content'  => '',
            'post_status'   => 'publish',
            'post_author'   => get_current_user_id(),
            'post_type'     => 'post'
        );

        $post_id = wp_insert_post( $post_data );

        if ( $post_id ) {
            // Сохраняем значения всех полей ACF
            update_field( 'single_ot', $single_ot, $post_id );
            update_field( 'single_po', $single_po, $post_id );
            update_field( 'user_requisites', $single_wallet, $post_id );
            update_field( 'single_mail',$imaile, $post_id );
            update_field( 'single_val_op', $single_val_op, $post_id );
            update_field( 'single_val_po', $single_val_po, $post_id );
            update_field( 'single_num', $single_num, $post_id );
            update_field( 'single_val_minop', $single_val_minop, $post_id ); // сохраняем значение из поля wallet_minot в поле ACF single_val_minop
            // update_field( 'mywallet', $user_requisites, $post_id ); // сохраняем значение из поля wallet_reqot в поле ACF user_requisites
            update_field( 'single_val_minpo', $single_val_minpo, $post_id ); // сохраняем значение из поля wallet_minpo в поле ACF single_val_minpo

            // Отправляем письмо на указанный адрес
            send_email_notification( $post_id, $imaile, $single_ot, $single_po, $single_wallet );

            // Перенаправляем пользователя на страницу созданной записи
            wp_redirect( get_permalink( $post_id ) );
            exit;
        }
    }
}
add_action( 'admin_post_my_custom_form_submit', 'my_custom_form_submit_handler' );
add_action( 'admin_post_nopriv_my_custom_form_submit', 'my_custom_form_submit_handler' );

С помощью неё я могу создать запись через форму на сайте и у меня произойдёт редирект на эту запись. Проблема заключается в том, что при переадресации на созданную запись мой выбранный язык меняется на стандартный. У меня есть подозрение, что это связано с самими настройками WPML.введите сюда описание изображения Каким образом можно сохранять язык при переадресации на запись? Буду крайне признателен за любую помощь, уже несколько дней пытаюсь решить эту проблему :(

Ответы

▲ 0

В общем, решил свой вопрос с помощью костыля.

Внутрь формы вставляем скрытый input, в котором будет определяться текущий язык:

<input type="hidden" name="language" value="<?php echo ICL_LANGUAGE_CODE; ?>">

Далее меняем функцию редиректа на это:

$lang = sanitize_text_field( $_POST['language'] );

// Перенаправляем пользователя на страницу созданной записи с добавлением параметра языка
wp_redirect( add_query_arg( array( 'lang' => $lang ), get_permalink( $post_id ) ) );
exit;