Маршрутизация URL-адресов Wordpress, несколько постоянных ссылок с разными шаблонами


Этот вопрос основан на вопросе без ответа в Разработке Wordpress, который не получил однозначного ответа.

У меня есть сайт wordpress, на котором перечислены отели. URL-адрес для одного отеля выглядит следующим образом:

/hotels/the-marriot-hotel

У меня также есть пользовательская таксономия для местоположений, которая позволяет мне просматривать отели в разных местах, что отлично работает, URL-адреса такие:

/Locations/Liverpool

Для URL-адресов, подобных /hotels/*, я хотел бы использовать пользовательский шаблон, что я уже сделал и работает нормально.

Проблема в том,

Я также хочу иметь возможность детализировать таксономию местоположений, создавая URL-адрес типа "хлебная крошка", а также использовать другой шаблон для страницы отеля.

Например, если пользователь просматривает /Locations/Liverpool и нажимает на отель Marriot, я бы хотел, чтобы он перешел на /Locations/Liverpool/the-marriot-hotel вместо /hotels/the-marriot-hotel, а также использовал немного другой шаблон, который также может загружать другую боковую панель и рекомендовать другие отели в этом районе специфичный для слага местоположения в URL-адресе

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

Как бы я это реализовал?

Что я пробовал?

Я попытался добавить новую страницу и использовать правило перезаписи, чтобы указать, что она является страницей отеля locations.

Я попытался добавить пули в конце URL-адреса /Locations/{location-slug} и прочитать это в шаблоне страницы и загрузка сообщения об отеле вместо списка, похоже, не работает, но в любом случае кажется ужасным взломом

У меня возникла идея добавить перезапись на страницу hotels/{slug} и использовать код для определения используемого URL-адреса и динамического переключения шаблонов, но я не уверен, что это лучший подход

Author: Community, 2015-04-04

1 answers

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

Я опубликую ниже код, который я использовал, но, хотя это работает и, кажется, работает очень хорошо, мне кажется, что это не лучший способ сделать это. Если кто-то знает лучший способ сделать это, пожалуйста, опубликуйте ответ.

Я использовал этот онлайн-пост для справки.

Примечание: Страница со списком показывает список отелей в таксономии в боковой колонке сбоку и показывает выбранный в данный момент или случайный в основной области содержимого. Это объяснит, как я использую цикл ниже.

function prefix_locations_rewrite_rule() {
    add_rewrite_rule( 'Locations/([^/]+)/([^/]+)', 'index.php?locations=$matches[1]&hotel=$matches[2]', 'top' );
}

function prefix_register_query_var( $vars ) {
    $vars[] = 'hotel';

    return $vars;
}

function prefix_url_rewrite_templates() {

    if ( get_query_var( 'hotel' ) && is_singular( 'hotel' ) ) {
        add_filter( 'template_include', function() {
            return get_template_directory() . '/taxonomy-locations.php';
        });
    }
}

add_action( 'template_redirect', 'prefix_url_rewrite_templates' );
add_filter( 'query_vars', 'prefix_register_query_var' );
add_action( 'init', 'prefix_locations_rewrite_rule' );

В моем файле шаблона для целевой страницы отелей:

$hotelSlug = get_query_var( 'hotel', false);

if ( have_posts() ) {
    while (have_posts()) : the_post();

        if ($post->post_name == $hotelSlug) {
            break;
        }

    endwhile;
}

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

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

Мне еще предстоит добавить дополнительную логику и обработку ошибок в этот код, надеюсь, это поможет кому-то с подобной проблемой

 0
Author: Scriptable, 2015-04-04 11:12:05