Маршрутизация 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-адреса и динамического переключения шаблонов, но я не уверен, что это лучший подход
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 запроса, она будет прервана, так что текущая запись будет той, которую мы хотели.
Мы могли бы просто использовать запрос здесь, но, как я уже у меня есть список сообщений в рамках таксономии, я подумал, что просто повторю его. Ниже я проверяю, был ли выбран конкретный отель, в противном случае я показываю случайный отель из списка.
Мне еще предстоит добавить дополнительную логику и обработку ошибок в этот код, надеюсь, это поможет кому-то с подобной проблемой