Вопрос или проблема
То, что я настраиваю, я думал будет довольно простым. На самом деле, я немного удивлён, что ответ не появился сразу после получасового поиска здесь.
Вот код для создания моего пользовательского типа записи (CPT):
register_post_type('headline', array(
'labels' => array(
'name' => 'Заголовки',
'singular_name' => 'Заголовок',
'add_new' => 'Добавить заголовок',
'add_new_item' => 'Добавить заголовок',
'edit_item' => 'Редактировать заголовок',
'new_item' => 'Новый заголовок',
'all_items' => 'Все заголовки',
'view_item' => 'Посмотреть заголовок',
'search_items' => 'Поиск заголовков',
'not_found' => 'Подходящие заголовки не найдены',
'not_found_in_trash' => 'Подходящие заголовки не найдены в корзине',
'parent_item_colon' => '',
'menu_name' => 'Заголовки'
),
'description' => 'Заголовки со всего мира.',
'public' => true,
'supports' => array('title', 'editor', 'author', 'excerpt', 'thumbnail', 'trackbacks', 'comments', 'revisions'),
'taxonomies' => array('category', 'post_tag'),
'register_meta_box_cb' => 'DfePostTypesHeadline::add_meta_boxes',
'has_archive' => true,
'rewrite' => array(
'with_front' => false
),
'can_export' => true
));
Проблема заключается в вызове “with_front”. Или точнее, в самих правилах перезаписи. У меня вызов flush_rewrite_rules()
происходит при активации/деактивации плагина. И я вижу, что файл .htaccess перезаписывается, так что это работает. Но WordPress по-прежнему не может распознать мою новую структуру постоянных ссылок.
Не уверен, имеет ли это значение или нет, но мой вызов register_post_type происходит на хуке “init”. Интересно, нужен ли другой хук?
/* Giddyup */
public function DFEPostTypes() {
add_action( 'init', 'DFEPostTypes::register_content_types' );
add_action( 'admin_menu', 'DFEPostTypes::admin_pages' );
add_action( 'admin_enqueue_scripts', 'DFEPostTypes::admin_scripts' );
add_filter( 'template_include', 'DFEPostTypes::template' );
// Сбросить правила перезаписи:
register_activation_hook( __FILE__, 'DFEPostTypes::flush_rewrite' );
register_deactivation_hook( __FILE__, 'DFEPostTypes::flush_rewrite' );
}
register_content_types()
— это функция, которая динамически обрабатывает вызов и регистрацию типов содержимого, с которыми я работаю.
Вы должны зарегистрировать свой тип записи перед сбросом правил. Ваше действие init
не выполняется при активации плагина, поэтому ваш метод flush_rewrite
должен сначала вызвать register_content_types
, прежде чем сбрасывать правила.
Ответ или решение
Настройка пользовательского типа записи с использованием параметра with_front
Создание пользовательского типа записи (CPT) в WordPress может показаться простой задачей, однако в некоторых случаях возникает необходимость глубже разобраться в нюансах, особенно когда дело касается правил переопределения. В вашем конкретном случае вы столкнулись с проблемой нераспознавания структуры постоянных ссылок, несмотря на использование параметра with_front
.
Как работает параметр with_front
Параметр with_front
в настройках переопределения CPT управляет тем, будет ли основной префикс постоянных ссылок (группа URL, определенная в ваших настройках) добавляться в permalink вашего пользовательского типа записи. Если with_front
установлен в true
, то ваш пост будет использовать структуру постоянных ссылок, указанную в настройках, при добавлении в URL вашего CPT. Пример:
example.com/headlines/your-post
еслиwith_front
истинно и основной префиксexample.com/blog
не является частью вашего URL.
Установка with_front
в false
означает, что префикс не будет использоваться, и ваши ссылки будут выглядеть так:
example.com/your-post
Это может быть полезно, если вы хотите, чтобы ваши пользовательские записи были более очевидными или независимыми от основного префикса.
Проблемы с обнаружением структуры постоянных ссылок
Вы упомянули, что используете flush_rewrite_rules()
в хуках активации и деактивации вашего плагина. Однако существует определенная последовательность, которая должна соблюдаться:
-
Регистрация пользовательского типа записи. Убедитесь, что ваш вызов функции
register_post_type
происходит до вызоваflush_rewrite_rules
. Это необходимо, потому что правила переопределения зависят от уже зарегистрированных типов записи. -
Использование
init
. Хукinit
обычно используется для регистрации CPT. Тем не менее, во время активации вашего плагинаinit
еще не был вызван, поэтому необходимо вызывать регистрацию типов записи вручную перед выполнениемflush_rewrite_rules
.
Возможное решение вашего кода
Чтобы решить вашу проблему, вам нужно изменить порядок вызовов. Вот обновленный фрагмент кода:
// Функция для регистрации контент-типов
public static function register_content_types() {
register_post_type('headline', array(
'labels' => array(
'name' => 'Headlines',
'singular_name' => 'Headline',
// Другие метки...
),
'description' => 'Headlines from around the world.',
'public' => true,
'supports' => array('title', 'editor', 'author', 'excerpt', 'thumbnail', 'trackbacks', 'comments', 'revisions'),
'taxonomies' => array('category', 'post_tag'),
'has_archive' => true,
'rewrite' => array('with_front' => false),
'can_export' => true,
));
}
// Хук активации
public static function flush_rewrite() {
// Сначала регистрируем контент-типы
self::register_content_types();
// Затем очищаем правила переопределения
flush_rewrite_rules();
}
// Подключение хуков
public function DFEPostTypes() {
add_action('init', 'DFEPostTypes::register_content_types');
register_activation_hook(__FILE__, 'DFEPostTypes::flush_rewrite');
register_deactivation_hook(__FILE__, 'DFEPostTypes::flush_rewrite');
}
Заключение
Подводя итог, настройка постоянных ссылок для пользовательского типа записей в WordPress требует точности и правильного порядка вызовов функций. Убедитесь, что ваш CPT зарегистрирован перед вызовом flush_rewrite_rules
, чтобы гарантировать правильное функционирование структуры URL. С помощью указанных выше рекомендаций вы сможете настроить ваш пользовательский тип записи с учетом параметра with_front
, что обеспечит оптимальную работу вашего сайта и повышенную удобство использования для посетителей.