Update:
All above displayed only 'bread' instead of actual category ('bread', 'cake', or 'brownie') where each item belonged. So I assumed this should be something internal of wordpress about shortcode displaying in query loop.
Anyway, I tried another way not using shortcode and this time it works:
function filter_archive_categories( $terms, $post_id, $taxonomy ) {
if ( $taxonomy !== 'category' || ( ! is_archive() && ! is_home() && ! is_front_page() && ! is_search() ) ) {
return $terms;
}
$allowed_category_slugs = array( 'bread', 'cake', 'brownie' );
$filtered_terms = array();
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
foreach ( $terms as $term ) {
if ( in_array( $term->slug, $allowed_category_slugs, true ) ) {
$filtered_terms[] = $term;
}
}
}
return $filtered_terms;
}
add_filter( 'get_the_terms', 'filter_archive_categories', 10, 3 );
This time the result displays correctly. Thanks everyone so far. Hope this helps for those who may have the same problem.