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