Различные шаблоны для одного и того же контента, целевая страница с разных URL-адресов (общий, простой)

Мне было интересно, есть ли у кого-нибудь хорошая идея, как решить эту проблему.

Предположим, что есть два URL:

  • example.com/portfolio-xyz
  • example.com/portfolios/someidentification

example.com/portfolios/someidentification должен отображать содержимое: example.com/portfolio-xyz но с использованием другого шаблона.

Есть ли способ архивировать это с минимальными усилиями?

РЕДАКТИРОВАТЬ

«Целевая страница» (см. Выше URls) в обоих случаях представляет собой страницу пользовательского типа публикации WordPress. Так сказать: нет page и нет типа сообщения.

Дополнительная информация

Это не только работает для одной конкретной записи. Он будет общим для набора портфолио.

Таким образом, у вас есть много портфолио на веб-сайте, и они смогут получить к ним доступ через различный url / url-шаблон (к URL-адресу по умолчанию), а затем отобразить другой шаблон.

Я не знаю, что такое определение «простой», поэтому не уверен, что это соответствует. Это не простая задача сделать это динамически.

Во-первых, мы регистрируем новый запрос var для передачи альтернативного идентификатора:

 function wpd_portfolios_query_var($query_vars){ $query_vars[] = 'portfolio_key'; return $query_vars; } add_filter('query_vars', 'wpd_portfolios_query_var'); 

Затем добавим правило перезаписи для обработки входящих запросов и соответственно установите запрос var:

 function wpd_portfolios_rewrite(){ add_rewrite_rule( 'portfolios/([^/]+)/?$', 'index.php?post_type=portfolio&portfolio_key=$matches[1]', 'top' ); } add_action( 'init', 'wpd_portfolios_rewrite' ); 

Затем мы parse_query , проверяем, установлен ли наш запрос var, и конвертируем эти запросы в сингулярные почтовые запросы. В противном случае WordPress по умолчанию установит эти запросы в is_home .

 function wpd_portfolios_parse( $query ){ if( isset( $query->query_vars['portfolio_key'] ) ){ $query->is_home = 0; $query->is_single = 1; $query->is_singular = 1; } } add_action( 'parse_query', 'wpd_portfolios_parse' ); 

Затем мы подключаем pre_get_posts чтобы установить мета-запрос для сообщения в портфолио с требуемым значением мета.

 function wpd_portfolios_query( $query ){ if( isset( $query->query_vars['portfolio_key'] ) ){ $query->set( 'posts_per_page', 1 ); $meta_query = array( array( 'key' => 'portfolio_key', 'value' => $query->query_vars['portfolio_key'] ) ); $query->set( 'meta_query', $meta_query ); } } add_action( 'pre_get_posts', 'wpd_portfolios_query' ); 

И, наконец, мы фильтруем single_template для загрузки специального шаблона для этих запросов:

 function wpd_portfolios_template( $template = '' ){ global $wp_query; if( isset( $wp_query->query_vars['portfolio_key'] ) ){ $template = locate_template( 'portfolio-special.php', false ); } return $template; } add_filter( 'single_template', 'wpd_portfolios_template' ); 

«Самый дешевый» способ добиться этого, вероятно, состоял бы в том, чтобы просто добавить две страницы:

 // Standard template http(s)://example.com/portfolio-xyz 

Затем добавьте еще одну страницу со своим вторым URl и используйте шаблон пользовательской страницы, где вы запрашиваете свой единственный пост с помощью get_post() и покажите его, но вам это нравится:

 <?php /* Template Name: Alternate Portfolio PT template */ get_header(); // Fetch post via ID $post = get_post( 123 ); // Set everything up so the API is ready to use $is_set_up = setup_postdata( $post ); if ( $is_set_up ) { the_title(); the_content(); } // or use a custom query $post = new WP_Query( array( /* your arguments here */ ) ); if ( have_posts() ) { while ( have_posts ) { the_post(); the_title(); the_content(); // etc. } } get_sidebar(); get_footer();