есть произвольный тип записи с добавленной к ней таксономией:
add_action( 'init', 'register_newcat_newpost' );
function register_newcat_newpost() {
register_taxonomy('newcat', array('newpost'), array(
'label' => 'NewCat',
'description' => 'Рубрики', // описание таксономии
'public' => true,
'show_in_nav_menus' => false, // равен аргументу public
'show_ui' => true, // равен аргументу public
'show_tagcloud' => false, // равен аргументу show_ui
'hierarchical' => true,
'rewrite' => array('slug'=>'newpost', 'hierarchical'=>false, 'with_front'=>false ),
'show_admin_column' => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)
) );
// тип записи
register_post_type('newpost', array(
'label' => 'NewPost',
'description' => '',
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_rest' => false,
'rest_base' => '',
'show_in_menu' => true,
'exclude_from_search' => false,
'capability_type' => 'post',
'map_meta_cap' => true,
'hierarchical' => false,
'rewrite' => array( 'slug'=>'newpost/%newcat%', 'with_front'=>true, 'pages'=>true, 'feeds'=>false ),
'has_archive' => 'newpost',
'query_var' => true,
'supports' => array( 'title','editor','thumbnail','custom-fields','comments','revisions','page-attributes' ),
'taxonomies' => array( 'newcat','post_tag' ),
) );
}
// Отфильтруем ЧПУ произвольного типа
add_filter('post_type_link', 'newpost_permalink', 1, 2);
function newpost_permalink( $permalink, $post ){
// выходим если это не наш тип записи: без холдера %newcat%
if( strpos($permalink, '%newcat%') === false )
return $permalink;
// Получаем элементы таксы
$terms = get_the_terms($post, 'newcat');
// если есть элемент заменим холдер
if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) )
$term_slug = array_pop($terms)->slug;
// элемента нет, а должен быть...
else
$term_slug = 'no-newcat';
return str_replace('%newcat%', $term_slug, $permalink );
}
add_filter('pre_get_posts', 'tag_newpost');
function tag_newpost($query) {
if( is_tag() ) {
$post_type = get_query_var('post_type');
if($post_type)
$post_type = $post_type;
else
$post_type = array('nav_menu_item', 'post', 'newpost');
$query->set('post_type',$post_type);
return $query;
}
}
всё работает замечательно, вид url устраивает (/newpost/newcat/post), понадобилось получить архив для этого типа записи, нашла плагин
Custom Post Type Date Archives, получается конфуз, чтобы он заработал нужно
'slug'=>'newpost/%newcat%' убрать, иначе нет архива дат и страница дочерних категорий отображает контент главной страницы произвольного типа, если его убрать url становятся, мягко говоря, некрасивые :(
Может кто сталкивался с данной проблемой, как можно решить данную ситуацию?