WordPress pre_get_posts redirect для мультиязычного контента с помощью wpml

Появилась необходимость реализовать следующий функционал:

есть несколько языков на сайте: английский, испанский и китайский. Новости пишут только на английском языке. Для остальных языковых версий нужно сделать тизер для каждой новости (превью / лид-текст новости) и если пользователь кликает по не ней — то переводить его на английскую версию сайта и открывать интересующую новость на английском языке.

Задача не тривиальная. Решение весьма простое.

Был написал следующий функционал в файле functions.php

add_action('pre_get_posts', function(){
if(in_array( get_post_type(), ['event', 'post']) && is_single())
{
    $wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink(), 'en' );
    if(ICL_LANGUAGE_CODE != 'en' && !empty($wpml_permalink))
    {
        $wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink(), 'en' );
        echo '<script type="text/javascript">';
        echo 'window.location = "'.$wpml_permalink.'";';
        echo '</script>';
    }
}
});

Здесь мы проверяем

in_array( get_post_type(), [‘event’, ‘post’])

тип нашего поста event или post? Если да, то проходим к дальнейшей проверке:

is_single()

тут мы проверяем — является ли наша запись к существующему отдельному представлению. Это необходимо для того, чтобы в админке WordPress не выполнялся дальнейший код.

Собственно далее мы проверяем, не английский ли у нас язык (используется WPML плагин для мультиязычности) и если это так, то редиректим страницу на английскую версию сайта.

echo '<script type="text/javascript">';
        echo 'window.location = "'.$wpml_permalink.'";';
        echo '</script>';

где $wpml_permalink это ссылка на текущую новость на английском языке:

$wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink(), 'en' );

Добавить комментарий