Использование пользовательского шаблона для определенных URL

10 нояб. 2014 г., 17:37:12
Просмотры: 3.49K
Голосов: 1

Я создаю простой сайт с двумя языками. Использую Polylang для записей, а также имею пользовательский тип записи "Artist". Чтобы упростить бэкенд, я не использую Polylang для этого типа, только несколько пользовательских полей для языка у каждого исполнителя.

Когда я загружаю site.com/artist/johnny-cash, используется шаблон single-artist.php в моей теме. Вопрос: как мне загрузить пользовательский шаблон при загрузке, например, site.com/en/artist/johnny-cash?

То есть вкратце:

site.com/artist/johnny-cash → Загружает single-artist.php (отлично)

site.com/en/artist/johnny-cash → Как перенаправить на пользовательский шаблон?

7
Комментарии

как вы сделали так, чтобы оба URL указывали на ваш пользовательский тип записи?

Milo Milo
10 нояб. 2014 г. 17:53:54

Не уверен, что понял вас (возможно, я неясно объяснил). Я зарегистрировал пользовательский тип записи, и его ярлык (slug) — "artist", поэтому WordPress автоматически загружает single-artist.php при обращении к /artist/john-doe

Ignacio Ignacio
10 нояб. 2014 г. 17:56:32

и как происходит, что при посещении этого URL с добавленным /en/ также отображается ваш тип записи? Или сейчас это вызывает 404 ошибку?

Milo Milo
10 нояб. 2014 г. 17:59:26

Сейчас происходит перенаправление на ту же страницу без /en/, например /artist/johnny-cash. Не понимаю почему. Я думал, что должно быть 404, но нет...

Ignacio Ignacio
10 нояб. 2014 г. 18:00:52

WordPress пытается найти то, что вы хотели загрузить, прежде чем вернуть 404, и перенаправляет на это. Так что у вас есть дополнительный шаг перед работой с шаблонами - добавление правил перезаписи, чтобы запросы с /en/ загружали правильный объект.

Milo Milo
10 нояб. 2014 г. 18:05:27

@Milo Спасибо. Не могли бы вы указать мне какую-то документацию или пример чего-то подобного?

Ignacio Ignacio
10 нояб. 2014 г. 18:08:57

Если вы поищете add_rewrite_rule здесь, вы найдёте множество примеров. У меня нет времени написать код прямо сейчас, но я могу указать вам направление. Когда вы добавляете правило перезаписи для обработки запросов вашего пользовательского типа записи с /en/, вы также можете добавить дополнительную переменную запроса, чтобы идентифицировать эти запросы отдельно от запросов без en. Затем вы можете отфильтровать single_template, проверить эту переменную запроса и загрузить специальный шаблон в этом случае.

Milo Milo
10 нояб. 2014 г. 18:12:17
Показать остальные 2 комментариев
Все ответы на вопрос 1
1

Спасибо @Milo за комментарии, я публикую свой ответ:

Сначала я добавил это правило:

add_rewrite_rule(  
    "en/artist/([^/]+)/?",  
    'index.php?pagename=post_type=artist&artist=$matches[1]&gal_template=en',
    "top"); 

Затем этот фильтр:

add_filter( 'query_vars', 'gal_query_vars' );
function gal_query_vars( $query_vars )
{
    $query_vars[] = 'gal_template';
    return $query_vars;
}

И наконец, отфильтровал шаблон single:

add_filter( 'single_template', 'get_custom_post_type_template' );
function get_custom_post_type_template($single_template) {
     global $post;

     if ($post->post_type == 'artist') {

            $q = get_query_var('gal_template');

            if ($q === 'en') {
                $single_template = dirname( __FILE__ ) . '/single-artist-en.php';
            }


     }
     return $single_template;
}

Затем в single-artist-en.php я сделал:

get_template_part('single-artist')

Но вы можете реализовать любую необходимую логику.

10 нояб. 2014 г. 19:28:38
Комментарии

Вот актуальное и полное решение от WordPress: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule

Imran Zahoor Imran Zahoor
12 сент. 2015 г. 20:18:15