Как формируются постоянные ссылки в wordpress?

Ссылка скопирована
1 ответ

Суть вопроса следующая:

По умолчанию ссылка выглядит так:

domain.local/?post_type=project&p=195

Если включаю произвольную структуру /%category%/%postname%/ то ссылка становится такой

domain.local/project/test

И все бы хорошо, но почему то domain.local/project выдает пустую страницу, а domain.local/?post_type=project работает как положено... .htaccess работает перезаписан самим wp:

# BEGIN WordPress
# Директивы (строки) между `BEGIN WordPress` и `END WordPress`
# созданы автоматически и подлежат изменению только через фильтры WordPress.
# Сделанные вручную изменения между этими маркерами будут перезаписаны.

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

Дополнительно

выдает пустую страницу

https://codex.wordpress.org/%D0%A7%D0%90%D0%92%D0%... ?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

В вашем примере одиночная запись кастомного типа уже открывается как /project/test, значит базовые rewrite-правила и .htaccess, скорее всего, работают. Проблема с /project обычно связана не с .htaccess, а с настройками самого custom post type. URL /project/test - это single-страница записи типа project, а URL /project - это архив типа записи. Архив появится только если при регистрации post type включен has_archive.

Проверьте код регистрации project. Для архива по адресу /project/ он должен быть примерно таким:

add_action('init', 'wturm_register_project_post_type');
 
function wturm_register_project_post_type() {
    register_post_type('project', [
        'label' => 'Projects',
        'public' => true,
        'has_archive' => true,
        'rewrite' => [
            'slug' => 'project',
            'with_front' => false,
        ],
        'supports' => ['title', 'editor', 'thumbnail'],
    ]);
}

add_action('init', 'wturm_register_project_post_type'); function wturm_register_project_post_type() { register_post_type('project', [ 'label' => 'Projects', 'public' => true, 'has_archive' => true, 'rewrite' => [ 'slug' => 'project', 'with_front' => false, ], 'supports' => ['title', 'editor', 'thumbnail'], ]); }

После изменения регистрации нужно пересобрать rewrite rules: зайдите в админке в Настройки - Постоянные ссылки и просто нажмите сохранение. Делать flush_rewrite_rules на каждом хите сайта нельзя: это тяжелая операция. Ее выполняют один раз после изменения структуры ссылок, обычно при активации плагина или вручную через сохранение настроек постоянных ссылок.

  • Если /project/test открывается, а /project дает 404, чаще всего не включен has_archive или правила ссылок не пересохранены.
  • Если /project дает пустую страницу с HTTP 200, проблема может быть в шаблоне archive-project.php, archive.php или index.php: запрос найден, но тема ничего не выводит.
  • Если существует обычная страница со slug project, она может конфликтовать с архивом CPT. В таком случае лучше сменить slug архива, например на projects, или убрать конфликтующую страницу.
  • Структура /%category%/%postname%/ относится к обычным записям post. Для custom post type адреса формируются через rewrite в register_post_type и не обязаны использовать category.

Запрос domain.local/?post_type=project может работать даже тогда, когда красивый архив /project/ не настроен. Query string напрямую передает WordPress параметр post_type, а красивый URL должен сначала совпасть с rewrite-правилом. Поэтому эти два адреса не являются одинаковой проверкой.

Если после включения has_archive и сохранения постоянных ссылок архив все равно пустой, проверьте наличие опубликованных записей project и шаблон архива. Для вывода списка в archive-project.php должен быть обычный цикл have_posts. Если записей нет или тема в этом шаблоне не запускает цикл, вы получите пустую страницу даже при правильно работающих ссылках.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно