WordPress has category list block for standard categories. But what about when you want to list custom categories apart from the core ones? In that case, you would create a shortcode. Put the following code inside you child theme’s functions.php file:
function custom_taxonomy_shortcode($atts) { $atts = shortcode_atts(array( 'taxonomy' => 'your_taxonomy', // Replace with the desired custom taxonomy slug ), $atts); // Retrieve the terms from the custom taxonomy $terms = get_terms(array( 'taxonomy' => $atts['taxonomy'], 'hide_empty' => false, )); if (!empty($terms)) { // Create a custom list of terms with links $term_list = '<ul>'; foreach ($terms as $term) { $term_link = get_term_link($term); $term_list .= '<li><a href="' . esc_url($term_link) . '">' . $term->name . '</a></li>'; } $term_list .= '</ul>'; return $term_list; } else { return 'No categories found.'; } } add_shortcode('custom_taxonomy', 'custom_taxonomy_shortcode');
Replace your_taxonomy
with your taxonomy name. Then, use:
[custom_taxonomy]
You can play around with the $term
variable to hide the empty categories, for example ('hide_empty' => true,)
.
Extra Tip
The above code will display all parent and children terms from a custom post type, all in one list. To display all parent terms with their children all grouped together, you can use the following code:
function custom_taxonomy_shortcode() { $taxonomy = 'dog-breed-group'; // Replace with the desired custom taxonomy slug // Retrieve the top-level terms from the custom taxonomy $parent_terms = get_terms(array( 'taxonomy' => $taxonomy, 'hide_empty' => false, 'parent' => 0 // Get only top-level terms )); if (!empty($parent_terms) && !is_wp_error($parent_terms)) { $term_list = '<ul>'; foreach ($parent_terms as $parent_term) { // Retrieve the child terms for the current top-level term $child_terms = get_terms(array( 'taxonomy' => $taxonomy, 'hide_empty' => false, 'parent' => $parent_term->term_id // Get child terms of the current parent term )); if (!empty($child_terms) && !is_wp_error($child_terms)) { $term_list .= '<li>' . $parent_term->name . '<ul>'; foreach ($child_terms as $child_term) { $term_link = get_term_link($child_term); $term_list .= '<li><a href="' . esc_url($term_link) . '">' . $child_term->name . '</a></li>'; } $term_list .= '</ul></li>'; } } $term_list .= '</ul>'; return $term_list; } else { return 'No categories found.'; } } add_shortcode('custom_taxonomy', 'custom_taxonomy_shortcode');
You would the use the following shortcode as before.
[custom_taxonomy]