Вопрос или проблема
Я создал собственный тип записи (‘careers’) в плагине. Я могу создавать и просматривать отдельные записи карьеры без проблем, но не могу просмотреть архивную страницу. Она просто перенаправляет на главную страницу.
Следующий код создаёт тип записи
function create_career_posttype() {
$args = array(
'labels' => array(
'name' => __('Careers'),
'singular_name' => __('Careers'),
'all_items' => __('All Job Postings'),
'add_new_item' => __('Add New Job Posting'),
'edit_item' => __('Edit Job Posting'),
'view_item' => __('View Job Posting')
),
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'careers'),
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'capability_type' => 'post',
'supports' => array('title', 'editor', 'thumbnail'),
'exclude_from_search' => true,
'menu_position' => 6,
'has_archive' => true,
'menu_icon' => 'dashicons-universal-access'
);
register_post_type('careers', $args);
}
Я добавил пункт меню для всех объявлений о вакансиях, добавив “все объявления о вакансиях”, но это по какой-то причине перенаправляет на главную страницу. У меня также определён archive-careers.php. По моему (слабому) пониманию, у него должна быть постоянная ссылка myurl/careers, не так ли?
Я сказал, что испортил это в теме, потому что это работало раньше. За это время я перенес весь код из functions.php в плагин, что было очень болезненно (working Custom Post Type and Widget code no longer works when moved from functions.php to plugin), и в какой-то момент у меня был код в functions, чтобы скрыть все страницы категорий и архивов, который я с тех пор удалил и несколько раз перезапускал веб-сервер. Этот код выглядел так:
/* Register template redirect action callback */
add_action('template_redirect', 'meks_remove_wp_archives');
/* Remove archives */
function meks_remove_wp_archives(){
//Если мы находимся на категории или тег или дата или архив автора
if( is_category() || is_tag() || is_date() || is_author() ) {
global $wp_query;
$wp_query->set_404(); //установить страницу 404 не найдено
}
}
Обычно это связано с тем, что правила переписывания не обновляются. Вам нужно выполнить flush_rewrite_rules()
или посетить страницу Постоянные ссылки в WP-Admin и сохранить её, чтобы очистить правила переписывания. Если вы используете вызов функции в вашем плагине, убедитесь, что она не выполняется каждый раз, это не очень удобно.
.
Ответ или решение
Проблема, с которой вы столкнулись, связана с перенаправлением архива пользовательского типа записей на главную страницу вашего сайта WordPress. Давайте разберёмся, что могло вызвать это поведение и как его исправить.
Теория
Когда мы создаём пользовательский тип записей в WordPress с ключевым параметром 'has_archive' => true
, WordPress должен уметь генерировать страницу архива для этого типа записей. Это означает, что по URL /careers
вы должны видеть список всех записей этого типа. Однако, когда вместо этого происходит перенаправление на главную страницу, это обычно связано с неправильно установленными правилами перезаписи URL (rewrite rules).
Настройка правил перезаписи критически важна для корректной работы пользовательских типов записей. Когда вы изменяете настройки, которые могут повлиять на URL вашего сайта (например, перемещаете код из functions.php
в плагин), необходимо обновлять правила перезаписи. Это можно сделать автоматически с помощью функции flush_rewrite_rules()
или вручную, посетив страницу настроек постоянных ссылок (Permalinks) в административной панели WordPress и сохранив изменения, даже если вы их не вносили.
Пример
Вы настроили пользовательский тип записей careers
с параметрами has_archive
и rewrite
. Это правильно указывает WordPress на возможность создания архивов и определяет, как будет выглядеть URL для данного типа. Тем не менее, код, который вы ранее использовали для удаления архивных страниц (функция meks_remove_wp_archives
), мог вмешаться в работу и вызвать проблемы даже после его удаления.
Давайте рассмотрим несколько шагов для устранения проблемы:
-
Проверка кода создания типа записей: Убедитесь, что функция
register_post_type
вызывается корректно, и все параметры установлены правильно. В вашем случае это выглядит правильно, но стоит убедиться, что код выполняется и что параметры не переопределяются другими частью кода или плагинами. -
Обновление правил перезаписи:
- Добавьте вызов
flush_rewrite_rules(true);
в конец вашей функцииcreate_career_posttype
после регистрации типа, чтобы обновить правила перезаписи (но обязательно удалите его после первой загрузки, чтобы он не вызывался каждый раз). - Или, что более предпочтительно: Перейдите в
Настройки -> Постоянные ссылки
в административной панели WordPress и просто нажмите «Сохранить изменения».
- Добавьте вызов
-
Шаблон архива: Убедитесь, что файл
archive-careers.php
существует в вашей теме и правильно настроен для отображения архива. Этот шаблон должен содержать WP-запрос для извлечения и отображения записей. -
Проверка на сторонние вмешательства: Исследуйте возможные конфликты с другими темами или плагинами, которые могут управлять перенаправлением или правилами перезаписи. Временами, другие плагины могут переопределять параметры вашей регистрации.
Применение
Для того чтобы гарантировать, что ваше решение работает корректно и не вызывает проблем в будущем, следуйте этим практикам:
-
Регулярно тестируйте сайт: После значительных изменений всегда проверяйте ключевые функции вашего сайта, особенно когда это касается основного функционала, такого как пользовательские типы записей и их страницы архива.
-
Создайте резервные копии: Перед тем как делать изменения в структуре URL или перемещать код, создайте резервные копии вашего сайта. Это поможет избежать потери данных или функционала в случае ошибки.
-
Документируйте код: Если вы работаете в команде или даже самостоятельно, оставляйте комментарии в коде, объясняющие ключевые действия и намерения. Это поможет в будущих изменениях или при возникновении проблем.
-
Настраивайте среду разработки: Разработчикам рекомендуется создать тестовую среду, где они могут вносить изменения и разбираться с проблемами без риска для рабочего сайта.
Следуя этим рекомендациям, вы минимизируете возможность возникновения дополнительных проблем и обеспечите стабильную работу вашего сайта.