У вас есть страница WordPress с тем же названием, что и пользовательский тип "front" slug
У меня есть пользовательский тип сообщения djs
и пользовательская таксономия city
с двумя терминами: boston
и nyc
. Таким образом, DJ может быть отмечен как Бостон или Нью-Йорк.
Профили DJ (один пост djs
) расположены, например, в /nyc-wedding-dj/joe-shmoe/
или для ди-джея Бостона /boston-wedding-dj/jane-doe/
. Другими словами, перезаписываемый пул для этого настраиваемого типа сообщений устанавливается как %city%-wedding-dj
.
У меня есть две регулярные страницы под названием /boston-wedding-djs/
и /nyc-wedding-djs/
(обратите внимание на множественные ди-джеи с s), где я использую шаблон настраиваемой страницы для прокрутки Ди-джеев из соответствующего города и отобразите список ссылок на DJ-профили из этой страницы города.
Что бы я хотел сделать, так это сделать, чтобы перезаписываемый slug был %city%-wedding-djs
, чтобы отдельные страницы типа персонализированного сообщения отображались (по крайней мере, для google) в качестве дочерних страниц упомянутых выше страниц.
Однако существует конфликт, что, когда я изменяю перезаписываемый пул для настраиваемого типа сообщения djs
до %city%-wedding-djs
, я получаю ошибку 404 Not Found для страниц /boston-wedding-djs/
и /nyc-wedding-djs/
.
Как я могу создать перезапись с тем же именем, что и страница?
Ответы
Ответ 1
Это напомнило мне отличный блог post Мэтью Бойнеса по несколько связанному с ним вопросу.
Рекомендуется использовать уникальный базовый пул, чтобы избежать столкновений, которые вы описываете.
Если вы должны это сделать и ищете обходное решение в WordPress, тогда можно настроить, как он анализирует входящий запрос, с помощью request
- или parse_request
.
Пример:
Это проверяет, существует ли страница %city%-wedding-djs
, поэтому вам не нужно обновлять фрагмент кода, если впоследствии вы добавите больше городов:
! is_admin() && add_filter( 'request', function( $query_vars )
{
if ( isset( $query_vars['city'] ) && ! isset( $query_vars['djs'] ) )
{
$slug = $query_vars['city'] . '-wedding-djs';
// Override if the %city%-wedding-djs page exists
if ( get_page_by_path( $slug ) )
$query_vars['pagename'] = $slug;
}
return $query_vars;
} );
или если вы получили только boston
и nyc
как города, и вам не нужно проверять, существуют ли соответствующие страницы:
! is_admin() && add_filter( 'request', function( $query_vars )
{
if ( isset( $query_vars['city'] ) && ! isset( $query_vars['djs'] ) )
{
$city = $query_vars['city'];
if ( in_array( $city, array( 'boston', 'nyc' ) ) )
$query_vars['pagename'] = $city . '-wedding-djs';
}
return $query_vars;
} );
Это означает, что запрос:
example.tld/nyc-wedding-djs/
теперь рассматривается как a page
, а
example.tld/nyc-wedding-djs/joe-smhoe/
в качестве сообщения djs
.
Здесь мы предполагаем, что правила перезаписи page
имеют более низкий приоритет, чем для типа post djs
.
Ответ 2
Если вы используете htaccess, вы можете вручную настроить перенаправления для этих страниц, и затем они должны правильно разрешить. Добавьте следующие строки:
RewriteCond %{REQUEST_URI} ^/boston-wedding-djs/$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/boston-wedding-djs$ [NC]
RewriteRule . index\.php?pagename=boston-wedding-djs [NC,L]
RewriteCond %{REQUEST_URI} ^/nyc-wedding-djs/$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/nyc-wedding-djs$ [NC]
RewriteRule . index\.php?pagename=nyc-wedding-djs [NC,L]
после RewriteRule ^index\.php$ - [L]
Вы также можете сделать это с помощью WordPress add_rewrite_rule, но похоже, что они запутались, так что кажется, что это менее вероятно работать.
Ответ 3
У вас не может быть сообщение и страница с тем же самым пули.
Вам нужно удалить страницу и создать страницу шаблона archive-djs.php
и, возможно, single-djs.php
, и это будет динамически отображать эту страницу для вас.
См. эту страницу для иерархии шаблонов