Пользовательский тип записи перезапись with_front

Вопрос или проблема

То, что я настраиваю, я думал будет довольно простым. На самом деле, я немного удивлён, что ответ не появился сразу после получасового поиска здесь.

Вот код для создания моего пользовательского типа записи (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() в хуках активации и деактивации вашего плагина. Однако существует определенная последовательность, которая должна соблюдаться:

  1. Регистрация пользовательского типа записи. Убедитесь, что ваш вызов функции register_post_type происходит до вызова flush_rewrite_rules. Это необходимо, потому что правила переопределения зависят от уже зарегистрированных типов записи.

  2. Использование 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, что обеспечит оптимальную работу вашего сайта и повышенную удобство использования для посетителей.

Оцените материал
Добавить комментарий

Капча загружается...