Отобразить слаг категории портфолио в URL (если существует)

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

Я пытаюсь достичь структуры портфолио с двумя уровнями, и это работает нормально в хлебных крошках, но не в 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. Для этого:

  1. Перейдите в админку WordPress.
  2. Выберите "Настройки" -> "Постоянные ссылки".
  3. Нажмите "Сохранить изменения", не внося никаких изменений. Это заставит 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, если категория существует. Не забудьте протестировать, чтобы убедиться, что все работает корректно. Если у вас будут возникать ошибки, попробуйте очистить кэш или выполнить сброс правил перезаписи, выполнив вышеуказанные действия с постоянными ссылками еще раз.

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

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