Вопрос или проблема
Я пытаюсь достичь структуры портфолио с двумя уровнями, и это работает нормально в хлебных крошках, но не в URL. Идея состоит в том, чтобы показать слаг портфолио (направления), за которым следует категория портфолио (если она существует), и затем имя портфолио. Это файл (portfolio-post.php), который необходимо изменить, но у меня нет представления, как это сделать, любая помощь будет признательна:
<?php
/*******************************************************************************************************************
* Создание и регистрация типа записи Портфолио
*/
if ( !function_exists('ishyoboy_portfolio_post_type') ){
function ishyoboy_portfolio_post_type()
{
$labels = array(
'name' => __( 'Портфолио', 'ishyoboy_assets' ),
'singular_name' => __( 'Элемент портфолио', 'ishyoboy_assets' ),
'add_new' => _x( 'Добавить новый элемент', 'portfolio-post', 'ishyoboy_assets' ),
'add_new_item' => __( 'Добавить новый элемент', 'ishyoboy_assets' ),
'edit_item' => __( 'Редактировать элемент портфолио', 'ishyoboy_assets' ),
'new_item' => __( 'Новый элемент портфолио', 'ishyoboy_assets' ),
'view_item' => __( 'Просмотреть элемент портфолио', 'ishyoboy_assets' ),
'search_items' => __( 'Поиск элементов портфолио', 'ishyoboy_assets' ),
'not_found' => __( 'Элементы портфолио не найдены', 'ishyoboy_assets' ),
'not_found_in_trash'=> __( 'Элементы портфолио не найдены в корзине', 'ishyoboy_assets' ),
'parent_item_colon' => __( 'Родительский элемент портфолио', 'ishyoboy_assets' ),
'menu_name' => __( 'Портфолио', 'ishyoboy_assets' ),
'all_items' => __( 'Все элементы портфолио', 'ishyoboy_assets' ),
);
$taxonomies = array();
$supports = apply_filters( 'ish_cpt_plugin_portfolio_post_type_supports', array('title', 'editor', 'thumbnail', 'comments' ) );
global $ish_options;
if ( isset( $ish_options['slug_portfolio'] ) && '' != $ish_options['slug_portfolio'] ){
$slug = trim( $ish_options['slug_portfolio'] );
} else {
$slug = _x('portfolio', 'URL slug', 'ishyoboy_assets'); // "URL slug" необходим для WPML для перевода слага
}
$post_type_args = array(
'labels' => $labels,
'singular_label' => __( 'Портфолио' , 'ishyoboy_assets' ),
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'rewrite' => array(
'slug' => $slug,
'with_front' => true,
'feed' => true,
'pages' => false
),
'supports' => $supports,
'menu_position' => null,
'menu_icon' => null, //get_template_directory_uri() . '/inc/slider/images/icon.png',
'taxonomies' => $taxonomies
);
register_post_type( 'portfolio-post', $post_type_args );
}
}
/*******************************************************************************************************************
* Установка сообщений для типа записи Портфолио
*/
if ( !function_exists('ishyoboy_portfolio_messages') ){
function ishyoboy_portfolio_messages($messages)
{
global $post, $post_ID;
$messages['portfolio-post'] =
array(
0 => '',
1 => sprintf(('Портфолио обновлено. <a href="https://wordpress.stackexchange.com/questions/189346/%s">Просмотреть портфолио</a>'), esc_url(get_permalink($post_ID))),
2 => __('Пользовательское поле обновлено.', 'ishyoboy_assets'),
3 => __('Пользовательское поле удалено.', 'ishyoboy_assets'),
4 => __('Портфолио обновлено.', 'ishyoboy_assets'),
5 => isset($_GET['revision']) ? sprintf( __('Портфолио восстановлено до ревизии от %s', 'ishyoboy_assets'), wp_post_revision_title((int)$_GET['revision'], false)) : false,
6 => sprintf(__('Портфолио опубликовано. <a href="https://wordpress.stackexchange.com/questions/189346/%s">Просмотреть портфолио</a>', 'ishyoboy_assets'), esc_url(get_permalink($post_ID))),
7 => __('Портфолио сохранено.', 'ishyoboy_assets'),
8 => sprintf(__('Портфолио отправлено. <a target="_blank" href="https://wordpress.stackexchange.com/questions/189346/%s">Предпросмотр портфолио</a>', 'ishyoboy_assets'), esc_url( add_query_arg('preview', 'true', get_permalink($post_ID)))),
9 => sprintf(__('Портфолио запланировано на: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Предпросмотр портфолио</a>', 'ishyoboy_assets'), date_i18n( __( 'M j, Y @ G:i', 'ishyoboy_assets' ), strtotime($post->post_date)), esc_url(get_permalink($post_ID))),
10 => sprintf(__('Черновик портфолио обновлен. <a target="_blank" href="https://wordpress.stackexchange.com/questions/189346/%s">Предпросмотр портфолио</a>', 'ishyoboy_assets'), esc_url( add_query_arg('preview', 'true', get_permalink($post_ID)))),
);
return $messages;
}
}
add_filter( 'post_updated_messages', 'ishyoboy_portfolio_messages' );
/*******************************************************************************************************************
* Создание категории для типа записи Портфолио
*/
if ( !function_exists('ishyoboy_portfolio_category') ){
function ishyoboy_portfolio_category()
{
$labels = array(
'name' => __( 'Категории портфолио', 'ishyoboy_assets' ),
'singular_name' => __( 'Категория портфолио', 'ishyoboy_assets' ),
'search_items' => __( 'Поиск категорий портфолио', 'ishyoboy_assets' ),
'popular_items' => __( 'Популярные категории портфолио', 'ishyoboy_assets' ),
'all_items' => __( 'Все категории портфолио', 'ishyoboy_assets' ),
'parent_item' => __( 'Родительская категория портфолио', 'ishyoboy_assets' ),
'edit_item' => __( 'Редактировать категорию портфолио', 'ishyoboy_assets' ),
'update_item' => __( 'Обновить категорию портфолио', 'ishyoboy_assets' ),
'add_new_item' => __( 'Добавить новую категорию портфолио', 'ishyoboy_assets' ),
'new_item_name' => __( 'Новое имя категории портфолио', 'ishyoboy_assets' ),
'separate_items_with_commas' => __( 'Разделяйте категории портфолио запятыми', 'ishyoboy_assets' ),
'add_or_remove_items' => __( 'Добавить или удалить категорию портфолио', 'ishyoboy_assets' ),
'choose_from_most_used' => __( 'Выберите из самых популярных категорий портфолио', 'ishyoboy_assets' )
);
global $ish_options;
if ( isset( $ish_options['slug_portfolio'] ) && '' != $ish_options['slug_portfolio'] ){
$slug = trim( $ish_options['slug_portfolio'] ) . '-category';
} else {
$slug = _x('portfolio-category', 'URL slug', 'ishyoboy_assets'); // "URL slug" необходим для WPML для перевода слага
}
$args = array(
'labels' => $labels,
'public' => true,
'hierarchical' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'query_var' => true,
"rewrite" => array(
'slug' => $slug,
'hierarchical' => true
)
);
register_taxonomy( 'portfolio-category', 'portfolio-post', $args );
}
}
if ( is_admin() ){
/*******************************************************************************************************************
* Колонки на стороне администратора
*/
if ( !function_exists('ishyoboy_portfolio_edit_columns') ){
function ishyoboy_portfolio_edit_columns( $columns ){
$columns = array(
"cb" => "<input type=\"checkbox\" />",
"title" => __( 'Заголовок', 'ishyoboy_assets' ),
"author" => __( 'Автор', 'ishyoboy_assets' ),
"category" => __( 'Категории', 'ishyoboy_assets' ),
"thumbnail" => __( 'Изображение', 'ishyoboy_assets' ),
"date" => __( 'Дата', 'ishyoboy_assets' )
);
return $columns;
}
}
add_filter("manage_edit-portfolio-post_columns", "ishyoboy_portfolio_edit_columns");
if ( !function_exists('ishyoboy_portfolio_custom_columns') ){
function ishyoboy_portfolio_custom_columns($column){
global $post;
switch ($column)
{
case "thumbnail":
the_post_thumbnail('thumbnail');
break;
case "category":
echo get_the_term_list($post->ID, 'portfolio-category', '', ', ','');
break;
}
}
}
add_action( 'manage_portfolio-post_posts_custom_column' , 'ishyoboy_portfolio_custom_columns', 10, 2 );
/**
* Добавление выпадающего фильтра для слайдов
*/
if ( !function_exists('ishyoboy_restrict_portfolio_by_category') ){
function ishyoboy_restrict_portfolio_by_category() {
global $typenow, $wp_query;
if ( isset($typenow) && 'portfolio-post' == $typenow ) {
$taxonomy = 'portfolio-category';
$term = isset( $wp_query->query[$taxonomy]) ? $wp_query->query[$taxonomy] : '';
$portfolio_taxonomy = get_taxonomy($taxonomy);
wp_dropdown_categories(array(
'show_option_all' => __("Показать все", 'ishyoboy_assets') . ' ' . $portfolio_taxonomy->label,
'taxonomy' => $taxonomy,
'name' => $taxonomy,
'orderby' => 'name',
'selected' => $term,
'hierarchical' => true,
'depth' => 0,
'show_count' => true, // Показать количество записей в скобках
'hide_empty' => true, // Не показывать бизнес без записей
));
}
}
}
add_action('restrict_manage_posts','ishyoboy_restrict_portfolio_by_category');
if ( !function_exists('taxonomy_filter_ishyoboy_portfolio_request') ){
function taxonomy_filter_ishyoboy_portfolio_request( $query ) {
global $pagenow, $typenow;
if ( isset($pagenow) && 'edit.php' == $pagenow ) {
$filters = get_object_taxonomies( $typenow );
if ( isset($filters) && '' != $filters){
foreach ( $filters as $tax_slug ) {
$var = &$query->query_vars[$tax_slug];
if ( isset($var) && '' != $var ) {
$term = get_term_by( 'id', $var, $tax_slug );
if ( isset($term) && '' != $term ) {
$var = $term->slug;
}
}
}
}
}
}
}
add_filter( 'parse_query', 'taxonomy_filter_ishyoboy_portfolio_request' );
if ( !function_exists('ishyoboy_portfolio_post_thumbnails') ){
function ishyoboy_portfolio_post_thumbnails() {
$supported_types = get_theme_support( 'post-thumbnails' );
if ( $supported_types === false ) {
add_theme_support( 'post-thumbnails', array( 'portfolio-post' ) );
}
elseif( true === $supported_types){
}
elseif( is_array( $supported_types[0] ) ){
$supported_types[0][] = 'portfolio-post';
add_theme_support( 'post-thumbnails', $supported_types[0] );
}
}
}
/**
* Изменить настройки по умолчанию для комментариев на записях портфолио. Закрыть их по умолчанию.
*/
if ( ! function_exists( 'ishyoboy_default_content_portfolio' ) ) {
function ishyoboy_default_content_portfolio( $post_content, $post ) {
if( $post->post_type )
switch( $post->post_type ) {
case 'portfolio-post':
$post->comment_status="closed";
break;
}
return $post_content;
}
}
add_filter( 'default_content', 'ishyoboy_default_content_portfolio', 10, 2 );
}
/*******************************************************************************************************************
* Инициализация типа записи Портфолио
*/
add_action( 'init', 'ishyoboy_portfolio_post_type' );
add_action( 'init', 'ishyoboy_portfolio_category', 0 );
//add_action( 'after_theme_setup','ishyoboy_portfolio_post_thumbnails' );
Чтобы получить категорию портфолио в URL, вы можете перейти в Настройки > Постоянные ссылки и добавить пользовательскую структуру, например %category%/%postname%, что добавит категорию перед именем записи.
Ответ или решение
Чтобы добиться отображения категории портфолио в URL (если она существует) для вашей двухуровневой структуры портфолио, необходимо внести изменения в вашу текущую настройку типа записи и привязки категорий. Ниже приведены шаги, которые вы можете выполнить для достижения этого:
Шаг 1: Изменение параметров перезаписи для портфолио
Вам нужно изменить аргументы перезаписи для вашего пользовательского типа записи portfolio-post
, чтобы URL-структура включала категорию. Для этого обновите вашу функцию ishyoboy_portfolio_post_type
. Добавьте параметр with_front
равный false
, чтобы избежать конфликтов с основными настройками WordPress:
'post_type_args' => array(
// ...
'rewrite' => array(
'slug' => $slug,
'with_front' => false, // убрать базовый префикс
'hierarchical' => true, // позволит использовать иерархическую структуру
),
// ...
);
Шаг 2: Убедитесь, что категории правильно зарегистрированы
Проверьте, что вы правильно зарегистрировали таксономию для ваших категорий портфолио. Убедитесь, что в функции ishyoboy_portfolio_category
параметр rewrite
настроен для иерархии:
'rewrite' => array(
'slug' => $slug,
'hierarchical' => true, // иерархическая структура
),
Шаг 3: Обновление структуры постоянных ссылок
После внесения этих изменений вам нужно обновить структуру постоянных ссылок в админке WordPress. Для этого:
- Перейдите в админку WordPress.
- Выберите "Настройки" -> "Постоянные ссылки".
- Нажмите "Сохранить изменения", не внося никаких изменений. Это заставит WordPress пересоздать правила перезаписи.
Шаг 4: Получение категории в URL
Теперь вам нужно создать URL, который будет включать категорию и название поста. Для этого в вашем шаблоне (например, в файле portfolio-post.php
) вы можете использовать следующую логику:
$terms = get_the_terms($post->ID, 'portfolio-category');
if ($terms && !is_wp_error($terms)) {
$first_term = reset($terms);
$category_slug = $first_term->slug;
$post_slug = $post->post_name;
// Создайте URL с категорией и названием поста
$portfolio_url = home_url('/' . $slug . '/' . $category_slug . '/' . $post_slug);
echo '<a href="' . esc_url($portfolio_url) . '">' . get_the_title($post->ID) . '</a>';
}
Заключение
Таким образом, в результате выполнения этих шагов, ваши URL-адреса для постов в портфолио будут иметь структуру вида /portfolio_slug/portfolio_category/portfolio_name
, если категория существует. Не забудьте протестировать, чтобы убедиться, что все работает корректно. Если у вас будут возникать ошибки, попробуйте очистить кэш или выполнить сброс правил перезаписи, выполнив вышеуказанные действия с постоянными ссылками еще раз.