@AFI19

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

Мне нужно создать страницу на которой будут отображаться кастомные типы записей по группам(категориям.). url данных таксономий и записей должен быть отключены.
Прим.
Страница "Услуги",
Группа "Фасадные работы",
Запись "Утепление"
5f3e9e7562f4b789397422.png
Что бы отключить 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();
    ?>
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы