Добавляем кастомный тип записи, таксономию и убираем их слаги

<?php

/*****************************custom settinds***********************/
/**
 * Add Post Types.
 */
function cptui_register_my_cpts() {

    /**
     * Post Type: Авто.
     */

    $labels = array(
        "name" => __( "Авто", "wp_bootstrap_4" ),
        "singular_name" => __( "Авто", "wp_bootstrap_4" ),
        "menu_name" => __( "Авто", "wp_bootstrap_4" ),
        "all_items" => __( "Все авто", "wp_bootstrap_4" ),
        "add_new" => __( "Добавить новое", "wp_bootstrap_4" ),
        "add_new_item" => __( "Добавить новое авто", "wp_bootstrap_4" ),
        "edit_item" => __( "Редактировать авто", "wp_bootstrap_4" ),
        "new_item" => __( "Новое авто", "wp_bootstrap_4" ),
        "view_item" => __( "Смотреть авто", "wp_bootstrap_4" ),
        "view_items" => __( "Смотреть авто", "wp_bootstrap_4" ),
        "search_items" => __( "Найти авто", "wp_bootstrap_4" ),
        "not_found" => __( "Авто не найдены", "wp_bootstrap_4" ),
        "not_found_in_trash" => __( "Авто не найдены в корзине", "wp_bootstrap_4" ),
        "parent_item_colon" => __( "Родительское авто", "wp_bootstrap_4" ),
    );

    $args = array(
        "label" => __( "Авто", "wp_bootstrap_4" ),
        "labels" => $labels,
        "description" => "",
        "public" => true,
        "publicly_queryable" => true,
        "show_ui" => true,
        "delete_with_user" => false,
        "show_in_rest" => true,
        "rest_base" => "",
        "rest_controller_class" => "WP_REST_Posts_Controller",
        "has_archive" => false,
        "show_in_menu" => true,
        "show_in_nav_menus" => true,
        "exclude_from_search" => false,
        "capability_type" => "post",
        "map_meta_cap" => true,
        "hierarchical" => false,
        "rewrite" => array( "slug" => "auto", "with_front" => true ),
        "query_var" => true,
        "menu_icon" => "/wp-content/themes/kometatek/assets/images/icons/bus.png",
        "supports" => array( "title", "editor" ),
        "taxonomies" => array( "cars" ),
    );

    register_post_type( "auto", $args );
}
add_action( 'init', 'cptui_register_my_cpts' );



/**
 * Add Taxonomies.
 */
add_action( 'init', 'create_taxonomy' );
function create_taxonomy(){

    register_taxonomy( 'cars', [ 'auto' ], [ 
        'label'                 => '', // определяется параметром $labels->name
        'labels'                => [
            'name'              => 'Категории',
            'singular_name'     => 'Категория',
            'search_items'      => 'Найти категории',
            'all_items'         => 'Все категории',
            'view_item '        => 'Смотреть категории',
            'parent_item'       => 'Родительская категория',
            'parent_item_colon' => 'Родительская категория:',
            'edit_item'         => 'Редактировать категорию',
            'update_item'       => 'Обновить категорию',
            'add_new_item'      => 'Добавить категорию',
            'new_item_name'     => 'Название новой категории',
            'menu_name'         => 'Категории авто',
        ],
        'description'           => '', // описание таксономии
        'public'                => true,
        // 'publicly_queryable'    => null, // равен аргументу public
        // 'show_in_nav_menus'     => true, // равен аргументу public
        // 'show_ui'               => true, // равен аргументу public
        // 'show_in_menu'          => true, // равен аргументу show_ui
        // 'show_tagcloud'         => true, // равен аргументу show_ui
        // 'show_in_quick_edit'    => null, // равен аргументу show_ui
        'hierarchical'          => true,

        'rewrite'               => true,
        //'query_var'             => $taxonomy, // название параметра запроса
        'capabilities'          => array(),
        'meta_box_cb'           => null, // html метабокса. callback: `post_categories_meta_box` или `post_tags_meta_box`. false — метабокс отключен.
        'show_admin_column'     => false, // авто-создание колонки таксы в таблице ассоциированного типа записи. (с версии 3.5)
        'show_in_rest'          => null, // добавить в REST API
        'rest_base'             => null, // $taxonomy
        // '_builtin'              => false,
        //'update_count_callback' => '_update_post_term_count',
    ] );
}

 /**
 * Remove the slug from childtax permalinks.
 */
function rudr_change_term_request($query){ 
    $tax_name = 'cars'; // specify you taxonomy name here, it can be also 'category' or 'post_tag'
 
    // Request for child terms differs, we should make an additional check
    if( isset($query['attachment']) ) :
        $include_children = true;
        $name = $query['attachment'];
    else:
        $include_children = false;        
        $name = isset($query['name']) ? $query['name'] : 'cars';
    endif;
    $term = get_term_by('slug', $name, $tax_name); // get the current term to make sure it exists
 
    if (isset($name) && $term && !is_wp_error($term)): // check it here
 
        if( $include_children ) {
            unset($query['attachment']);
            $parent = $term->parent;
            while( $parent ) {
                $parent_term = get_term( $parent, $tax_name);
                $name = $parent_term->slug . '/' . $name;
                $parent = $parent_term->parent;
            }
        } else {
            unset($query['name']);
        }
 
        switch( $tax_name ):
            case 'category':{
                $query['category_name'] = $name; // for categories
                break;
            }
            case 'post_tag':{
                $query['tag'] = $name; // for post tags
                break;
            }
            default:{
                $query[$tax_name] = $name; // for another taxonomies
                break;
            }
        endswitch;
 
    endif;
 
    return $query; 
} 
add_filter('request', 'rudr_change_term_request', 1, 1 ); 
 
function rudr_term_permalink( $url, $term, $taxonomy ){
 
    $taxonomy_name = 'cars'; // your taxonomy name here
    $taxonomy_slug = 'cars'; // the taxonomy slug can be different with the taxonomy name (like 'post_tag' and 'tag' )
 
    // exit the function if taxonomy slug is not in URL
    if ( strpos($url, $taxonomy_slug) === FALSE || $taxonomy != $taxonomy_name ) return $url;
 
    $url = str_replace('/' . $taxonomy_slug, '', $url);
 
    return $url;
}
add_filter( 'term_link', 'rudr_term_permalink', 10, 3 );

//if is old permalinks
function rudr_old_term_redirect() { 
    $taxonomy_name = 'cars';
    $taxonomy_slug = 'cars';
 
    // exit the redirect function if taxonomy slug is not in URL
    if( strpos( $_SERVER['REQUEST_URI'], $taxonomy_slug ) === FALSE)
        return;
 
    if( ( is_category() && $taxonomy_name=='category' ) || ( is_tag() && $taxonomy_name=='post_tag' ) || is_tax( $taxonomy_name ) ) {
        wp_redirect( site_url( str_replace($taxonomy_slug, '', $_SERVER['REQUEST_URI']) ), 301 );
        exit();
    } 
}
add_action('template_redirect', 'rudr_old_term_redirect');
/**
 * Remove the slug from published post permalinks. Only affect our CPT though.
 */
function sh_remove_cpt_slug( $post_link, $post, $leavename ) {

    if ( in_array( $post->post_type, array( 'auto' ) )
        || 'publish' == $post->post_status )
        $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
    return $post_link;
}
add_filter( 'post_type_link', 'sh_remove_cpt_slug', 10, 3 );

function sh_parse_request_tricksy( $query ) {

    // Only loop the main query
    if ( ! $query->is_main_query() ) {
        return;
    }

    // Only loop our very specific rewrite rule match
    if ( 2 != count( $query->query )|| ! isset( $query->query['page'] ) ){
        return;
    }

    // 'name' will be set if post permalinks are just post_name, otherwise the page rule will match
    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'auto', 'post' ) );
    }
}
add_action( 'pre_get_posts', 'sh_parse_request_tricksy' );

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *