Как правильно создать и вывести кастомные типы?

Мне нужно создать страницу на которой будут отображаться кастомные типы записей по группам(категориям.). url данных таксономий и записей должен быть отключены. Прим. Страница "Услуги", Группа "Фасадные работы", Запись "Утепление" введите сюда описание изображения

Что бы отключить url для записей и таксономии установил параметр publicly_queryable как false, url не работают, но, вместо 404 подгружают шаблон index. Из-за отключения publicly_queryable страница архива для данного типа записей так же перестает работать.

  1. Как отключить урл для записей и таксономий, но оставить страницу архива? Или нужно будет создать обычную страницу вместо страницы архива?
  2. Как получать 404 вместо index для отключенных урл?
  3. Как правильно вывести записи в виде как на картинке? В моем варианте получается слишком много запросов к базе.
function cptui_register_my_cpts_uslugi() {

/**
 * Post Type: Услуги.
 */

$labels = [
    "name" => __( "Услуги", "svarmettig" ),
    "singular_name" => __( "Услуга", "svarmettig" ),
];

$args = [
    "label" => __( "Услуги", "svarmettig" ),
    "labels" => $labels,
    "description" => "",
    "public" => true,
    "publicly_queryable" => false,
    "show_ui" => true,
    "show_in_rest" => true,
    "rest_base" => "",
    "rest_controller_class" => "WP_REST_Posts_Controller",
    "has_archive" => true,
    "show_in_menu" => true,
    "show_in_nav_menus" => true,
    "delete_with_user" => false,
    "exclude_from_search" => false,
    "capability_type" => "post",
    "map_meta_cap" => true,
    "hierarchical" => false,
    "rewrite" => [ "slug" => "uslugi", "with_front" => true ],
    "query_var" => true,
    "menu_position" => 5,
    "supports" => [ "title" ],
];

register_post_type( "uslugi", $args );
}

add_action( 'init', 'cptui_register_my_cpts_uslugi' );
function cptui_register_my_taxes_group_sv() {

/**
 * Taxonomy: Типы.
 */

$labels = [
    "name" => __( "Типы", "svarmettig" ),
    "singular_name" => __( "Тип", "svarmettig" ),
];

$args = [
    "label" => __( "Типы", "svarmettig" ),
    "labels" => $labels,
    "public" => true,
    "publicly_queryable" => false,
    "hierarchical" => false,
    "show_ui" => true,
    "show_in_menu" => true,
    "show_in_nav_menus" => true,
    "query_var" => true,
    "rewrite" => [ 'slug' => 'group_sv', 'with_front' => true, ],
    "show_admin_column" => false,
    "show_in_rest" => true,
    "rest_base" => "group_sv",
    "rest_controller_class" => "WP_REST_Terms_Controller",
    "show_in_quick_edit" => false,
        ];
register_taxonomy( "group_sv", [ "uslugi" ], $args );
}
add_action( 'init', 'cptui_register_my_taxes_group_sv' );

Код вывода записей

<?php
    $post_type = 'uslugi';

    $taxonomies = get_object_taxonomies(
            [
                'post_type' => $post_type
            ]
    );

    foreach( $taxonomies as $taxonomy ) :

    $terms = get_terms( $taxonomy );

        foreach( $terms as $term ) : ?>

            <?php
            $args = array(
                'post_type' => $post_type,
                'posts_per_page' => -1,  //show all posts
                'tax_query' => array(
                    array(
                        'taxonomy' => $taxonomy,
                        'field' => 'slug',
                        'terms' => $term->slug,
                    )
                )

            );
            $posts = new WP_Query($args);

            if( $posts->have_posts() ): ?>

                <?php echo '<p>' . $term->name . '<hr></p>'; ?>

                <?php while( $posts->have_posts() ) : $posts->the_post(); ?>

                    <?php  echo get_the_title() .'<br>'; ?>

                <?php endwhile;
                    echo '<hr>';
            endif; ?>

        <?php endforeach;

    endforeach;
    wp_reset_postdata();
?>

Ответы (0 шт):