Пользовательский тип записи и ссылка на категорию связаны вместе

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

У меня проблема с созданием новой страницы для этого:

Ссылка категории:

/category/category_name

Но я хочу, чтобы это было:

/custom_post_type/category_name

Код пользовательского типа записи

$labels     =   array(
        'name'                  => 'Овощи',
        'singular_name'         => 'Овощ',
        'add_new'               => 'Добавить элемент',
        'all_items'             => 'Все элементы',
        'add_new_item'          => 'Добавить элемент',
        'edit_item'             => 'Редактировать элемент',
        'new_item'              => 'Новый элемент',
        'view_item'             => 'Просмотреть элемент',
        'search_item'           => 'Поиск рецептов',
        'not_found'             => 'Элементы не найдены',
        'not_found_in_trash'    => 'Элементы не найдены в корзине',
        'parent_item_colon'     => 'Родительский элемент'
    );

    $args       =   array(
        'labels'                => $labels,
        'public'                => true,
        'has_archive'           => true,
        'publicly_queryable'    => true,
        'query_var'             => true,
        'rewrite'               => true,
        'capability_type'       => 'post',
        'hierarchical'          => false,
        'supports'              => array(
            'title',
            'editor',
            'excerpt',
            'thumbnail',
            'revisions'
        ),
        'taxonomies'            => array(
            'category',
            'post_tag'
        ),
        'menu_position'         => 100,
        'menu_icon'             => 'dashicons-wordpress',
        'exclude_from_search'   => false
    );
    register_post_type( 'vege', $args );

Постоянные ссылки

http://prntscr.com/ayfqaf

http://prntscr.com/ayfq03

Это вообще возможно?

Надеюсь, это то, о чем вы спрашивали?

Убедитесь, что вы обновили свои постоянные ссылки (просто нажмите обновить) после этого.

Это сделает ваш сайт таким: yourwebsite.com/vege/%vege-category%/%post%

В вашем примере вы не зарегистрировали тип таксономии, и дополнительно вам нужно добавить функцию, чтобы вставить slug категории в постоянную ссылку.

function my_custom_post_vege() {
    $labelsvege = array(
         'name'                 => 'Овощи',
        'singular_name'         => 'Овощ',
        'add_new'               => 'Добавить элемент',
        'all_items'             => 'Все элементы',
        'add_new_item'          => 'Добавить элемент',
        'edit_item'             => 'Редактировать элемент',
        'new_item'              => 'Новый элемент',
        'view_item'             => 'Просмотреть элемент',
        'search_item'           => 'Поиск рецептов',
        'not_found'             => 'Элементы не найдены',
        'not_found_in_trash'    => 'Элементы не найдены в корзине',
        'parent_item_colon'     => 'Родительский элемент'
    );
    $argsvege = array(
        'labels'        => $labelsvege,
        'description'   => 'Какой тип овоща это',
        'public'        => true,
        'menu_position' => 100,
        'menu_icon'     => 'dashicons-wordpress',
        'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ),
        'has_archive'   => true,
        'hierarchical'  => true,
        'rewrite'       => array('slug' => 'vege/%vege-category%','with_front' => false),
        'query_var'     => true,
        'show_in_nav_menus'  => TRUE,
        'show_in_menu'  => TRUE,
        'label'         => 'Овощи',
        'publicly_queryable'  => TRUE
    );
    register_post_type( 'vege', $argsvege );
}

add_action( 'init', 'my_custom_post_vege' );

function my_taxonomies_vegetype() {
    $labelsTaxvegetype = array(
        'name'              => _x( 'Категория овощей', 'таксономия общее имя' ),
        'singular_name'     => _x( 'Категория овощей', 'таксономия единственное имя' ),
        'search_items'      => __( 'Поиск категории овощей' ),
        'all_items'         => __( 'Все категории овощей' ),
        'parent_item'       => __( 'Родительский элемент' ),
        'parent_item_colon' => __( 'Тип овоща:' ),
        'edit_item'         => __( 'Редактировать тип овоща' ),
        'update_item'       => __( 'Обновить тип овоща' ),
        'add_new_item'      => __( 'Добавить новый тип овоща' ),
        'new_item_name'     => __( 'Новое имя типа овоща' ),
        'menu_name'         => __( 'Тип овоща' ),
    );
    $argsTaxvegetype = array(
        'labels' => $labelsTaxvegetype,
        'hierarchical'  => true,
        'public'        => true,
        'query_var'     => 'category',
        'rewrite'       =>  array('slug' => 'vege' ),
        '_builtin'      => false,
    );
    register_taxonomy( 'vege-category', 'vege', $argsTaxvegetype );
}

add_action( 'init', 'my_taxonomies_vegetype', 0 );

add_filter('post_link', 'category_permalink', 1, 3);
add_filter('post_type_link', 'category_permalink', 1, 3);

function category_permalink($permalink, $post_id, $leavename) {
        if (strpos($permalink, '%vege-category%') === FALSE) return $permalink;
        $post = get_post($post_id);
        if (!$post) return $permalink;
        $terms = wp_get_object_terms($post->ID, 'vege-category');
        if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
            $taxonomy_slug = $terms[0]->slug;
        else $taxonomy_slug = 'no-category';

    return str_replace('%vege-category%', $taxonomy_slug, $permalink);
}

Ответ или решение

Вопрос: Как связать пользовательский тип записи и категории в WordPress?

Введение

Использование пользовательских типов записей является мощным инструментом в WordPress, который позволяет создавать и управлять контентом более гибко и эффективно. В этом ответе рассмотрим, как связать пользовательский тип записи с категориями, чтобы формировать URL-адреса в формате /custom_post_type/category_name.

Шаг 1: Регистрация пользовательского типа записи

Для начала необходимо зарегистрировать пользовательский тип записи. В приведённом вами коде вы создаете пользовательский тип записи "vege". Важно добавить правильные параметры для регистрации этого типа записи.

function my_custom_post_vege() {
    $labels = array(
        'name' => 'Vege',
        'singular_name' => 'Vege',
        // другие метки ...
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'publicly_queryable' => true,
        'rewrite' => array('slug' => 'vege/%vege-category%'), // изменяем тут
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
        'taxonomies' => array('vege-category', 'post_tag'), // указываем новую таксономию
    );

    register_post_type('vege', $args);
}

add_action('init', 'my_custom_post_vege');

Шаг 2: Регистрация таксономии

Следующий шаг – регистрация таксономии для пользовательского типа записи. Вы намерены создать категорию, специально для "vege". Вот код для её регистрации:

function my_taxonomies_vegetype() {
    $labelsTaxvegetype = array(
        'name' => 'Vege Category',
        'singular_name' => 'Vege Category',
        // другие метки ...
    );

    $argsTaxvegetype = array(
        'labels' => $labelsTaxvegetype,
        'hierarchical' => true,
        'public' => true,
        'rewrite' => array('slug' => 'vege'), // измените это на свое усмотрение
    );

    register_taxonomy('vege-category', 'vege', $argsTaxvegetype);
}

add_action('init', 'my_taxonomies_vegetype', 0);

Шаг 3: Обновление структурирования постоянных ссылок

Как только вы зарегистрируете пользовательский тип записи и его таксономию, вам необходимо обновить структуру постоянных ссылок. Перейдите в НастройкиПостоянные ссылки и просто нажмите кнопку "Сохранить изменения". Это необходимо для того, чтобы WordPress обновил свои правила перезаписи.

Шаг 4: Формирование URL-адресов с использованием категорий

Мы можем кастомизировать URL-адреса для пользовательского типа записей таким образом, чтобы они включали категории. Для этого добавим функцию, которая будет заменять метку %vege-category% на актуальную категорию.

add_filter('post_type_link', 'category_permalink', 1, 3);

function category_permalink($permalink, $post_id, $leavename) {
    if (strpos($permalink, '%vege-category%') === FALSE) return $permalink;

    $post = get_post($post_id);
    if (!$post) return $permalink;

    $terms = wp_get_object_terms($post->ID, 'vege-category');

    if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
        $taxonomy_slug = $terms[0]->slug;
    } else {
        $taxonomy_slug = 'no-category';
    }

    return str_replace('%vege-category%', $taxonomy_slug, $permalink);
}

Заключение

С вышеописанными шагами вы сможете успешно интегрировать пользовательский тип записи с категориями. Теперь ваши URL-адреса будут выглядеть так: /vege/category_name, что существенно улучшает SEO и структуру сайта. Помните, что после внесения изменений в код вам всегда следует обновлять постоянные ссылки, чтобы изменения вступили в силу.

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

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