- Вопрос или проблема
- Ответ или решение
- Вопрос: Как связать пользовательский тип записи и категории в WordPress?
- Введение
- Шаг 1: Регистрация пользовательского типа записи
- Шаг 2: Регистрация таксономии
- Шаг 3: Обновление структурирования постоянных ссылок
- Шаг 4: Формирование URL-адресов с использованием категорий
- Заключение
Вопрос или проблема
У меня проблема с созданием новой страницы для этого:
Ссылка категории:
/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 );
Постоянные ссылки
Это вообще возможно?
Надеюсь, это то, о чем вы спрашивали?
Убедитесь, что вы обновили свои постоянные ссылки (просто нажмите обновить) после этого.
Это сделает ваш сайт таким: 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 и структуру сайта. Помните, что после внесения изменений в код вам всегда следует обновлять постоянные ссылки, чтобы изменения вступили в силу.