When a website grows over years, taxonomy starts to become a problem. A silent one, because it can go unnoticed for quite a long time.
At first, nothing happens. You create a new category, add a tag, try another one, change the editorial focus… and keep publishing.
But as the website grows, one day the article ends up in uncategorized. Another day you forget a tag that would have fit it perfectly. And then you forget whether you had already created a certain tag, and why you did — or did not.
If you want to do it properly, there comes a point when classifying an article starts taking longer than it should. Because there are too many possibilities and you are not always clear on, or do not always remember, when to use each one.
That was what was happening to me, and that is why I recently explained how I recategorized and retagged my entire WordPress site.
I am not going to repeat here how I have organized my website, except for what is essential so you can understand this system better: three big pillars: Business, Technology and Entertainment and multiple second-level subcategories within each of them, as well as tags.
By the way, if you get a bit lost with all this, here is an article where I explain the difference between tags and categories, and when to use one or the other.
Índice de Contenidos del Artículo
- The goal: decide faster how to classify each article and not mess it up
- The solution: a custom screen in the WordPress admin
- What it is really useful for
- Conclusion
- Frequently asked questions
- What is taxonomy in WordPress?
- What is a WordPress taxonomy editorial map for?
- What is the difference between categories and tags in WordPress?
- What are structural tags?
- What are nested tags?
- Does this editorial map change WordPress taxonomy?
- Is it worth creating an editorial map for a small website?
- Does better organization of categories and tags help SEO?
The goal: decide faster how to classify each article and not mess it up
The idea was to build a system that made my life easier when tagging an article. Something immediate, with a low chance of error or omission.
Also, as a secondary goal, I wanted some control over how many pieces of content I had created under each category or tag.
One important thing here is that before getting down to work on the solution, I defined two types of tags:
- Structural: These are the ones that do not belong to a specific category, but describe the format or intention of the article. For example: Tutorial, Review, Recommended, Saving or Privacy.
- Nested: These do have a natural category. For example, Google Analytics fits under the Analytics subcategory, Email inside Marketing, Chromebook inside Hardware, Consoles under Video Games or European Comics under Comics.
This made visualization much easier, as you will see now.
The solution: a custom screen in the WordPress admin
I could have built it as a mind map, which was my first idea because of how visual it is.
Or in Excel, because of the numbers.
But in both cases management and maintenance would have been manual, which I wanted to avoid at all costs.
So the solution was to build something inside WordPress.
How did I do it?
By creating a custom page inside the WordPress administrator using code in functions.php.

That screen works as a small editorial map divided into two halves:
On the left main categories and their subcategories appear. Under each one, the recommended tags for classifying articles in that block are shown.
On the right the tags appear, divided into the two blocks mentioned above: structural and nested.
I also added:
- A search box.
- Archive and edit links
- Post counters by taxonomy.
You access it from the Posts section:

The code
Here is the code I added to functions.php, but be careful: you have to edit it so it fits your categories and tags. You can do it yourself, or explain it to ChatGPT and have it modify it for you:
/* =========================================================
* MAPA EDITORIAL DE TAXONOMÍAS
* Página interna para visualizar categorías y etiquetas
* ========================================================= */
add_action('admin_menu', 'yg_mapa_editorial_menu');
function yg_mapa_editorial_menu() {
add_submenu_page(
'edit.php',
'Mapa editorial',
'Mapa editorial',
'manage_categories',
'yg-mapa-editorial',
'yg_render_mapa_editorial'
);
}
/**
* Configuración editorial del mapa.
*/
function yg_mapa_editorial_config() {
return array(
'categorias_principales' => array(
'Negocio',
'Tecnología',
'Ocio',
),
// Categorías obsoletas o que no queremos mostrar en el mapa editorial.
'categorias_excluidas' => array(
'Diseño',
'Diseño gráfico',
'Diseño web',
'Ilustración',
'Usabilidad',
'Sin categoría',
),
// Etiquetas transversales: formato, enfoque o intención del contenido.
'etiquetas_estructurales' => array(
'Tutorial',
'Reseña',
'Recomendado',
'Ahorrar',
'Privacidad',
),
// Etiquetas temáticas/anidadas por pilar.
// Productividad queda como anidada de Negocio.
'etiquetas_anidadas' => array(
'Negocio' => array(
'Productividad',
'Google Analytics',
'CRO',
'SEO',
'Email',
'Acumbamail',
),
'Tecnología' => array(
'WordPress',
'Chromebook',
'Gmail',
'Trello',
'Video',
),
'Ocio' => array(
'Consolas',
'Retro',
'Cómic Americano',
'Cómic Europeo',
'Manga',
'Pérez-Reverte',
),
),
// Etiquetas recomendadas bajo cada categoría.
// La clave debe coincidir con el slug habitual de la categoría.
'etiquetas_por_categoria' => array(
// Negocio
'negocio' => array('Productividad', 'SEO', 'CRO', 'Email', 'Acumbamail', 'Google Analytics'),
'analitica' => array('Google Analytics', 'CRO', 'Tutorial'),
'casos-de-exito' => array('Productividad'),
'ecommerce' => array('CRO', 'Email', 'Acumbamail', 'Google Analytics', 'Tutorial'),
'inversion' => array('Ahorrar'),
'marketing' => array('Email', 'Acumbamail', 'SEO', 'CRO', 'Productividad'),
'negocios-online' => array('Productividad', 'SEO', 'CRO'),
// Tecnología
'tecnologia' => array('WordPress', 'Privacidad', 'Tutorial'),
'hardware' => array('Chromebook', 'Tutorial'),
'herramientas' => array('Trello', 'Gmail', 'WordPress', 'Tutorial'),
'inteligencia-artificial' => array('Video', 'Tutorial'),
'software' => array('WordPress', 'Gmail', 'Trello', 'Privacidad', 'Tutorial'),
// Ocio
'ocio' => array('Reseña', 'Recomendado'),
'comics' => array('Cómic Americano', 'Cómic Europeo', 'Manga', 'Reseña'),
'libros' => array('Pérez-Reverte', 'Reseña', 'Recomendado'),
'musica' => array('Video', 'Reseña'),
'peliculas' => array('Reseña', 'Recomendado'),
'series' => array('Reseña', 'Recomendado'),
'videojuegos' => array('Consolas', 'Retro', 'Reseña', 'Recomendado'),
),
);
}
/**
* Recupera término por nombre o slug.
*/
function yg_mapa_get_term_by_name_or_slug($name, $taxonomy) {
$term = get_term_by('name', $name, $taxonomy);
if (!$term) {
$term = get_term_by('slug', sanitize_title($name), $taxonomy);
}
if (!$term || is_wp_error($term)) {
return null;
}
return $term;
}
/**
* Comprueba si una categoría debe ocultarse.
*/
function yg_mapa_categoria_excluida($term, $config) {
if (!$term || is_wp_error($term)) {
return true;
}
return in_array($term->name, $config['categorias_excluidas'], true);
}
/**
* Render de una etiqueta como píldora compacta dentro de tarjetas de categoría.
*/
function yg_mapa_tag_pill($tag_name) {
$term = yg_mapa_get_term_by_name_or_slug($tag_name, 'post_tag');
if (!$term) {
return '<span class="yg-map-pill yg-map-pill--missing">' . esc_html($tag_name) . ' <small>no existe</small></span>';
}
$edit_link = get_edit_term_link($term->term_id, 'post_tag');
$archive_link = get_term_link($term);
$html = '<span class="yg-map-pill">';
$html .= '<strong>' . esc_html($term->name) . '</strong>';
$html .= '<em>' . intval($term->count) . '</em>';
if (!is_wp_error($archive_link)) {
$html .= '<a href="' . esc_url($archive_link) . '" target="_blank">ver</a>';
}
if ($edit_link) {
$html .= '<a href="' . esc_url($edit_link) . '">editar</a>';
}
$html .= '</span>';
return $html;
}
/**
* Render de tarjeta compacta de categoría.
*/
function yg_mapa_category_card($term, $config) {
if (!$term || is_wp_error($term)) {
return;
}
if (yg_mapa_categoria_excluida($term, $config)) {
return;
}
$archive_link = get_term_link($term);
$edit_link = get_edit_term_link($term->term_id, 'category');
$recommended_tags = array();
if (!empty($config['etiquetas_por_categoria'][$term->slug])) {
$recommended_tags = $config['etiquetas_por_categoria'][$term->slug];
}
echo '<article class="yg-map-card yg-map-card--category" data-map-search="' . esc_attr(strtolower($term->name)) . '">';
echo '<div class="yg-map-card__top">';
echo '<h3>' . esc_html($term->name) . '</h3>';
echo '<span class="yg-map-count">' . intval($term->count) . ' artículos</span>';
echo '</div>';
if (!empty($recommended_tags)) {
echo '<div class="yg-map-card__tags">';
echo '<span class="yg-map-label">Etiquetas recomendadas</span>';
echo '<div class="yg-map-pills">';
foreach ($recommended_tags as $tag_name) {
echo yg_mapa_tag_pill($tag_name);
}
echo '</div>';
echo '</div>';
}
echo '<div class="yg-map-card__actions">';
if (!is_wp_error($archive_link)) {
echo '<a href="' . esc_url($archive_link) . '" target="_blank">Ver archivo</a>';
}
if ($edit_link) {
echo '<a href="' . esc_url($edit_link) . '">Editar</a>';
}
echo '</div>';
echo '</article>';
}
/**
* Render de tarjeta compacta de etiqueta.
* No muestra ya las píldoras "Estructural" / "Anidada".
*/
function yg_mapa_tag_card($tag_name) {
$term = yg_mapa_get_term_by_name_or_slug($tag_name, 'post_tag');
if (!$term) {
echo '<article class="yg-map-card yg-map-card--tag yg-map-card--missing">';
echo '<div class="yg-map-card__top">';
echo '<h3>' . esc_html($tag_name) . '</h3>';
echo '<span class="yg-map-count">no existe</span>';
echo '</div>';
echo '</article>';
return;
}
$archive_link = get_term_link($term);
$edit_link = get_edit_term_link($term->term_id, 'post_tag');
echo '<article class="yg-map-card yg-map-card--tag" data-map-search="' . esc_attr(strtolower($term->name)) . '">';
echo '<div class="yg-map-card__top">';
echo '<h3>' . esc_html($term->name) . '</h3>';
echo '<span class="yg-map-count">' . intval($term->count) . ' artículos</span>';
echo '</div>';
echo '<div class="yg-map-card__actions">';
if (!is_wp_error($archive_link)) {
echo '<a href="' . esc_url($archive_link) . '" target="_blank">Ver archivo</a>';
}
if ($edit_link) {
echo '<a href="' . esc_url($edit_link) . '">Editar</a>';
}
echo '</div>';
echo '</article>';
}
/**
* Render principal.
*/
function yg_render_mapa_editorial() {
if (!current_user_can('manage_categories')) {
wp_die('No tienes permisos para ver esta página.');
}
$config = yg_mapa_editorial_config();
echo '<div class="wrap yg-map-wrap">';
echo '<h1>Mapa editorial</h1>';
echo '<p class="yg-map-intro">Consulta de forma rápida las categorías y etiquetas recomendadas para decidir cómo clasificar cada artículo.</p>';
echo '<input type="search" id="yg-map-search" class="yg-map-search" placeholder="Buscar categoría o etiqueta..." />';
echo '<div class="yg-map-layout">';
/* ======================
* CATEGORÍAS
* ====================== */
echo '<section class="yg-map-panel">';
echo '<div class="yg-map-panel__head">';
echo '<h2>Categorías</h2>';
echo '<p>Estructura principal de la web. Debajo de cada categoría se muestran sus etiquetas anidadas recomendadas.</p>';
echo '</div>';
foreach ($config['categorias_principales'] as $parent_name) {
$parent = yg_mapa_get_term_by_name_or_slug($parent_name, 'category');
if (!$parent || yg_mapa_categoria_excluida($parent, $config)) {
continue;
}
echo '<div class="yg-map-category-group">';
echo '<h2 class="yg-map-group-title">' . esc_html($parent->name) . '</h2>';
yg_mapa_category_card($parent, $config);
$children = get_categories(array(
'taxonomy' => 'category',
'hide_empty' => false,
'parent' => $parent->term_id,
'orderby' => 'name',
'order' => 'ASC',
));
if (!empty($children)) {
echo '<div class="yg-map-child-grid">';
foreach ($children as $child) {
yg_mapa_category_card($child, $config);
}
echo '</div>';
}
echo '</div>';
}
echo '</section>';
/* ======================
* ETIQUETAS
* ====================== */
echo '<section class="yg-map-panel">';
echo '<div class="yg-map-panel__head">';
echo '<h2>Etiquetas</h2>';
echo '<p>Separación editorial entre etiquetas estructurales y etiquetas anidadas por pilar.</p>';
echo '</div>';
// Estructurales
echo '<div class="yg-map-tag-block">';
echo '<h2 class="yg-map-group-title">Estructurales</h2>';
echo '<p class="yg-map-help">Transversales: formato, intención o enfoque. Se pueden usar en artículos de distintas categorías.</p>';
echo '<div class="yg-map-tag-grid">';
foreach ($config['etiquetas_estructurales'] as $tag_name) {
yg_mapa_tag_card($tag_name);
}
echo '</div>';
echo '</div>';
// Anidadas
echo '<div class="yg-map-tag-block">';
echo '<h2 class="yg-map-group-title">Anidadas</h2>';
echo '<p class="yg-map-help">Temáticas: deben usarse principalmente dentro de su pilar o categoría natural.</p>';
foreach ($config['etiquetas_anidadas'] as $group_name => $tags) {
echo '<div class="yg-map-nested-group">';
echo '<h3>' . esc_html($group_name) . '</h3>';
echo '<div class="yg-map-tag-grid">';
foreach ($tags as $tag_name) {
yg_mapa_tag_card($tag_name);
}
echo '</div>';
echo '</div>';
}
echo '</div>';
echo '</section>';
echo '</div>'; // layout
echo '</div>'; // wrap
yg_mapa_editorial_styles();
yg_mapa_editorial_scripts();
}
/**
* CSS interno para la pantalla.
*/
function yg_mapa_editorial_styles() {
?>
<style>
.yg-map-wrap {
max-width: 1320px;
}
.yg-map-intro {
margin: 4px 0 18px;
color: #555;
font-size: 14px;
}
.yg-map-search {
width: 100%;
max-width: 520px;
margin: 0 0 22px;
padding: 10px 12px;
border: 1px solid #ccd0d4;
border-radius: 6px;
background: #fff;
}
.yg-map-layout {
display: grid;
grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
gap: 22px;
align-items: start;
}
.yg-map-panel {
background: #fff;
border: 1px solid #dcdcde;
border-radius: 8px;
padding: 18px;
}
.yg-map-panel__head {
margin-bottom: 16px;
}
.yg-map-panel__head h2 {
margin: 0 0 4px;
font-size: 18px;
}
.yg-map-panel__head p,
.yg-map-help {
margin: 0;
color: #666;
font-size: 12px;
line-height: 1.45;
}
.yg-map-category-group,
.yg-map-tag-block {
margin-bottom: 22px;
}
.yg-map-category-group:last-child,
.yg-map-tag-block:last-child {
margin-bottom: 0;
}
.yg-map-group-title {
margin: 0 0 10px;
padding: 0 0 7px;
border-bottom: 1px solid #ececec;
font-size: 15px;
font-weight: 700;
color: #1d2327;
}
.yg-map-child-grid,
.yg-map-tag-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
gap: 10px;
}
.yg-map-nested-group {
margin-top: 16px;
}
.yg-map-nested-group h3 {
margin: 0 0 8px;
font-size: 14px;
color: #1d2327;
}
.yg-map-card {
background: #fdfdfd;
border: 1px solid #dcdcde;
border-radius: 8px;
padding: 10px;
min-height: auto;
}
.yg-map-card--missing {
opacity: .65;
border-style: dashed;
}
.yg-map-card__top {
display: flex;
gap: 8px;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 7px;
}
.yg-map-card h3 {
margin: 0;
font-size: 13px;
line-height: 1.25;
font-weight: 700;
color: #1d2327;
}
.yg-map-count {
flex: 0 0 auto;
display: inline-flex;
align-items: center;
white-space: nowrap;
padding: 3px 7px;
border-radius: 999px;
background: #fff4ce;
color: #5f4500;
font-size: 11px;
font-weight: 600;
}
.yg-map-card__tags {
margin-top: 8px;
}
.yg-map-label {
display: block;
margin-bottom: 5px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .02em;
color: #646970;
}
.yg-map-pills {
display: flex;
flex-wrap: wrap;
gap: 5px;
}
.yg-map-pill {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 4px 7px;
border-radius: 999px;
background: #f0f6fc;
border: 1px solid #c5d9ed;
font-size: 11px;
color: #1d2327;
}
.yg-map-pill em {
font-style: normal;
color: #646970;
}
.yg-map-pill a {
text-decoration: none;
}
.yg-map-pill--missing {
background: #fff7f7;
border-color: #f0b8b8;
color: #8a2424;
}
.yg-map-card__actions {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-top: 7px;
font-size: 11px;
}
.yg-map-card__actions a {
text-decoration: none;
}
@media (max-width: 1100px) {
.yg-map-layout {
grid-template-columns: 1fr;
}
}
</style>
<?php
}
/**
* JS interno para buscador rápido.
*/
function yg_mapa_editorial_scripts() {
?>
<script>
document.addEventListener('DOMContentLoaded', function () {
const input = document.getElementById('yg-map-search');
if (!input) return;
input.addEventListener('input', function () {
const query = this.value.toLowerCase().trim();
const cards = document.querySelectorAll('.yg-map-card');
cards.forEach(function (card) {
const text = card.textContent.toLowerCase();
card.style.display = text.includes(query) ? '' : 'none';
});
});
});
</script>
<?php
}
Also, if you want, you can separate the CSS into style.css, but I preferred to keep all the code together.
What it is really useful for
This editorial map does not change WordPress taxonomy; it makes it easier to use.
Before, I had a list of categories and tags based on a criterion I had chosen at the time. Now I have that criterion visible and at hand, which lets me:
- Classify posts faster while maintaining editorial consistency.
- Avoid creating duplicate or unnecessary tags.
- Spot taxonomies with few articles.
- Scale the website properly if I publish more content, which is the idea.
Conclusion
Organizing WordPress taxonomy is not just about creating categories and tags, but about having a system to use them well.
In my case, at this point, I needed an editorial layer on top: a simple system that suggested the tags that make sense for each type of content.
If you have a small website, you may not need it, but if you have been publishing for years and are already hesitating between categories, tags, topics, formats and tools, creating an editorial map or editorial system can save you a lot of chaos, now and in the future.
It is not a major technical revolution, but it is an improvement that saves time and lets you publish with the same criterion every time.
Frequently asked questions
What is taxonomy in WordPress?
A taxonomy in WordPress is a way of organizing content. The most common ones are categories and tags, although WordPress also lets you create custom taxonomies. In practice, they are used to classify posts and help make a website easier to navigate and maintain.
What is a WordPress taxonomy editorial map for?
It helps you know exactly which categories and tags to use for each post. Instead of deciding from memory every time you publish, you have an internal screen where you can see the categories, recommended tags and editorial role of each term.
Categories usually represent the major sections of a website. Tags are used to connect content by topic, format, tool, author, intention or angle. For example, a category could be “Technology” and a tag could be “WordPress”, “Tutorial” or “Privacy”.
They are cross-cutting tags that can apply to posts from different categories. For example, “Tutorial”, “Review”, “Recommended”, “Saving” or “Privacy”. They do not belong to one single section, but describe the type of content or its intention.
They are tags that have a natural reference category. For example, “Google Analytics” fits under Analytics, “Email” under Marketing, “Consoles” under Video Games or “European Comics” under Comics. They help keep classification more coherent.
Does this editorial map change WordPress taxonomy?
Not necessarily. The editorial map does not have to modify categories or tags by itself. Its main function is to serve as a visual guide inside the administrator so you can better decide how to classify each post.
Is it worth creating an editorial map for a small website?
If you have only a few articles, it probably is not necessary. It starts making sense when the website grows, there are many categories or tags, you publish about several topics, or you need to maintain a clearer editorial criterion.
It can help indirectly. A clearer taxonomy improves internal structure, prevents duplicates, makes linking easier and allows you to create more useful category or tag archives. The important thing is not to create meaningless terms or empty or very thin archive pages.

Leave a Reply