Вопрос или проблема
Я создал пользовательский тип записи (‘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 в плагин с огромным количеством боли (рабочий код пользовательского типа записи и виджета больше не работает при перемещении из functions.php в плагин), и в какой-то момент я имел в functions код для скрытия всех категорий и страниц архивов, который я удалил и перезапустил веб-сервер несколько раз. Этот код выглядел так:
/* Регистрация обратного вызова действия перенаправления шаблона */
add_action('template_redirect', 'meks_remove_wp_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 и сохранить ее, чтобы сбросить правила перезаписи. Если вы используете вызов функции в своем плагине, не оставляйте его так, чтобы он выполнялся каждый раз, это не очень дружелюбно.
Ответ или решение
Создание пользовательских типов записей (Custom Post Types) в WordPress позволяет формировать уникальные разделы контента, специфичные для нужд вашего проекта, например, для вакансий в разделе "careers". Возникаемая у вас проблема, связанная с тем, что архивный раздел вашего кастомного типа записей перенаправляется на главную страницу сайта, вероятнее всего, связана с правилами перезаписи (rewrite rules) URL-адресов, которые нужно обновить.
Теория
В WordPress, при добавлении нового пользовательского типа записи, таких как ваш ‘careers’, необходимо, чтобы система правильно интерпретировала соответствующие URL. За это отвечает набор правил перезаписи (rewrite rules), которые управляют перенаправлением запросов на правильные страницы. Когда вы создаете или изменяете пользовательские типы записей, WordPress требуется обновление этих правил — именно здесь может скрываться ваша проблема.
Если ваш архивный шаблон (например, archive-careers.php
) не подхватывается, возможно, что системы перезаписи по-прежнему направляют запросы на несуществующие страницы. Это может особенно проявляться, если у вас были какие-то изменения в прошлом, такие как перемещение кода из файла functions.php
в плагин, а также предыдущие манипуляции с функцией meks_remove_wp_archives
, которые "загрязнили" правила перезаписи.
Пример
Вот некоторые шаги и концепции, которые следует учитывать для решения проблемы:
-
Проверка кода функции регистрации:
Ваш код функцииcreate_career_posttype()
в целом выглядит корректно. Он задает важные параметры, такие как'rewrite' => array('slug' => 'careers')
, которые диктуют основе ваш архивный URL –myurl/careers
. Однако стоит дважды проверить параметры, такие как'has_archive' => true
, который у вас повторяется — это не критично, но вы можете структурировать более читабельно. -
Обновление правил перезаписи:
Основной шаг здесь — обновить правила перезаписи, что можно сделать двумя способами:- Откройте и сохраните страницу "Постоянные ссылки" (Permalinks) в админ-панели WordPress. Это автоматически обновит правила и может решить проблему.
- Используйте вызов
flush_rewrite_rules()
в вашем коде, но только временно, для отладки. Пример:function my_custom_plugin_activation() { create_career_posttype(); // Регистрируем CPT flush_rewrite_rules(); } register_activation_hook(__FILE__, 'my_custom_plugin_activation');
-
Проверка возможности наличия конфликта плагинов:
Убедитесь, что отсутствуют другие плагины, которые могут переопределять или блокировать ваши URL архивов. Это можно сделать путем временного отключения всех плагинов, кроме вашего, и проверки, сохраняется ли проблема. -
Анализ пользовательских фильтров и действий:
Проверьте наличие пользовательских хуков, которые могли бы вмешиваться в стандартное поведение WordPress в отношении архивов. У вашей функцииmeks_remove_wp_archives
могло оставаться воздействие, равно как и переписываться настройки, допущенные другими утилитами или кодом.
Применение на практике
Теперь, когда вы понимаете проблему и ее возможные причины, примените эти шаги на практике. Проверьте, что ваш шаблон archive-careers.php
находится в правильном месте (вашей активной теме). Убедитесь, что правила перезаписи сброшены, и система распознает все URL вашего сайта корректно.
Этот системный подход при решении проблемы с перенаправлением URL архивов позволит с легкостью вернуть работоспособность вашему разделу карьеры, а также повысит вашу уверенность в интеграции пользовательских типов записей в дальнейшем.