У вас есть страница 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, и это будет динамически отображать эту страницу для вас.

См. эту страницу для иерархии шаблонов