Wanneer een website jarenlang groeit, begint de taxonomie een probleem te worden. Een stil probleem, want het blijft lange tijd behoorlijk onopgemerkt.
In het begin gebeurt er niets. Je maakt een nieuwe categorie, voegt een tag toe, probeert een andere, wijzigt de redactionele aanpak… en je blijft publiceren.
Maar naarmate de website groeit, belandt een artikel op een dag in geen categorie. Een andere keer vergeet je een tag die er perfect bij paste. En de derde keer vergeet je of je een bepaalde tag wel of niet had aangemaakt, en waarom je dat (wel/niet) deed.
Als je het goed wilt doen, komt er een moment waarop het classificeren van een artikel langzamer wordt dan het zou moeten zijn. Omdat er te veel mogelijkheden zijn en je niet altijd duidelijk weet of onthoudt wanneer je welke moet gebruiken.
Dat was precies wat mij overkwam en daarom legde ik onlangs uit hoe ik mijn hele WordPress opnieuw heb gecategoriseerd en opnieuw heb getagd.
Ik ga hier niet opnieuw uitleggen hoe mijn website is georganiseerd, behalve het noodzakelijke om dit systeem beter te begrijpen: drie grote pijlers: Business, Technologie en Entertainment en meerdere subcategorieën van het tweede niveau binnen elk daarvan, naast tags.
Trouwens, als je hierin een beetje verdwaalt, hier is een artikel waarin ik uitleg het verschil tussen tags en categorieën, en wanneer je de ene of de andere gebruikt.
Índice de Contenidos del Artículo
- Het doel: sneller beslissen hoe je elk artikel classificeert en geen rommel maken
- De oplossing: een eigen scherm in de WordPress-admin
- Waarvoor het echt dient
- Conclusie
- Veelgestelde vragen
- Wat is een taxonomie in WordPress?
- Waarvoor dient een redactioneel overzicht van WordPress-taxonomie?
- Wat is het verschil tussen categorieën en tags in WordPress?
- Wat zijn structurele tags?
- Wat zijn geneste tags?
- Verandert deze redactionele kaart de taxonomie van WordPress?
- Is het de moeite waard om een redactionele kaart te maken voor een kleine website?
- Helpt een betere organisatie van categorieën en tags bij SEO?
Het doel: sneller beslissen hoe je elk artikel classificeert en geen rommel maken
Het idee was een systeem te bouwen dat mijn leven makkelijker maakte bij het taggen van een artikel. Iets dat direct was en met weinig kans op fouten of vergeten stappen.
Daarnaast wilde ik als secundair doel enige controle hebben over hoeveel content ik onder elke categorie of tag had aangemaakt.
Een belangrijk punt hier is dat ik, voordat ik met de oplossing aan de slag ging, twee soorten tags definieerde:
- Structureel: Dit zijn tags die niet bij een concrete categorie horen, maar het formaat of de bedoeling van het artikel beschrijven. Bijvoorbeeld: Tutorial, Recensie, Aanbevolen, Besparen of Privacy.
- Genest: Deze hebben wel een natuurlijke categorie. Bijvoorbeeld, Google Analytics past binnen de subcategorie Analytics, Email binnen Marketing, Chromebook binnen Hardware, Consoles binnen Videogames of Europese strip binnen Strips.
Dit maakte de visualisatie veel gemakkelijker, zoals je zo zult zien.
De oplossing: een eigen scherm in de WordPress-admin
Ik had het in een mindmap kunnen opzetten, wat mijn eerste idee was vanwege hoe visueel dat is.
Of in Excel, vanwege de cijfers.
Maar in beide gevallen zouden beheer en onderhoud handmatig zijn geweest, iets wat ik koste wat kost wilde vermijden.
Dus de oplossing was iets bouwen binnen WordPress.
Hoe heb ik dat gedaan?
Door een aangepaste pagina te maken binnen het WordPress-beheer met code in functions.php.

Dat scherm werkt als een kleine redactioneel overzicht verdeeld in twee helften:
Aan de linkerkant verschijnen de hoofdcategorieën en hun subcategorieën. Onder elke categorie worden de aanbevolen tags getoond om artikelen uit dat blok te classificeren.
Aan de rechterkant verschijnen de tags, verdeeld in de twee eerder genoemde blokken: structureel en genest.
Daarnaast voegde ik toe:
- Een zoekfunctie.
- Links naar archief en bewerking
- Artikelentellers per taxonomie.
Je opent het vanuit de sectie Berichten:

De code
Hier laat ik je de code zien die ik aan functions.php heb toegevoegd, maar let op: je moet die aanpassen zodat hij past bij jouw categorieën en tags. Je kunt het zelf doen of het aan ChatGPT uitleggen en het laten aanpassen:
/* =========================================================
* 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
}
Bovendien kun je, als je wilt, de CSS scheiden in style.css, maar ik heb er de voorkeur aan gegeven alle code bij elkaar te houden.
Waarvoor het echt dient
Dit redactionele overzicht verandert de taxonomie van WordPress niet, maar maakt het makkelijker om die te gebruiken.
Voorheen had ik een lijst met categorieën en tags volgens een criterium dat ik destijds had gekozen. Nu heb ik dat criterium zichtbaar en bij de hand, waardoor ik:
- Berichten sneller kan classificeren met behoud van redactionele samenhang.
- Het aanmaken van dubbele of onnodige tags kan vermijden.
- Taxonomieën met weinig artikelen kan opsporen.
- De website correct kan laten meegroeien als ik meer content publiceer, wat de bedoeling is.
Conclusie
De taxonomie van WordPress organiseren gaat niet alleen over categorieën en tags aanmaken, maar over een systeem hebben om ze goed te gebruiken.
In mijn geval had ik op dit punt een redactionele laag erboven nodig: een eenvoudig systeem dat me de tags voorstelt die logisch zijn voor elk type content.
Als je een kleine website hebt, heb je dit misschien niet nodig, maar als je al jaren publiceert en begint te twijfelen tussen categorieën, tags, onderwerpen, formats en tools, kan een redactioneel overzicht of redactioneel systeem je heel wat chaos besparen, nu en later.
Het is geen grote technische revolutie, maar wel een verbetering om tijd te besparen en altijd met hetzelfde criterium te publiceren.
Veelgestelde vragen
Wat is een taxonomie in WordPress?
Een taxonomie in WordPress is een manier om content te organiseren. De meest gebruikelijke zijn categorieën en tags, al laat WordPress ook toe om aangepaste taxonomieën te maken. In de praktijk dienen ze om berichten te classificeren en een website makkelijker navigeerbaar en onderhoudbaar te maken.
Waarvoor dient een redactioneel overzicht van WordPress-taxonomie?
Die helpt je duidelijk te hebben welke categorieën en tags je voor elk artikel moet gebruiken. In plaats van het telkens uit je hoofd te beslissen wanneer je publiceert, heb je een intern scherm waarop je de categorieën, aanbevolen tags en de redactionele functie van elke term ziet.
Categorieën vertegenwoordigen meestal de grote secties van een website. Tags dienen om content te verbinden op basis van onderwerp, format, tool, auteur, intentie of invalshoek. Een categorie kan bijvoorbeeld “Technologie” zijn en een tag “WordPress”, “Tutorial” of “Privacy”.
Dit zijn overkoepelende tags die kunnen worden toegepast op artikelen uit verschillende categorieën. Bijvoorbeeld “Tutorial”, “Recensie”, “Aanbevolen”, “Besparen” of “Privacy”. Ze horen niet bij één enkele sectie, maar beschrijven het type content of de bedoeling ervan.
Dat zijn tags die een natuurlijke referentiecategorie hebben. Bijvoorbeeld: “Google Analytics” past binnen Analytics, “Email” binnen Marketing, “Consoles” binnen Videogames of “Europese strips” binnen Strips. Ze helpen om de classificatie consistenter te houden.
Verandert deze redactionele kaart de taxonomie van WordPress?
Niet noodzakelijk. De redactionele kaart hoeft categorieën of tags niet zelf te wijzigen. De belangrijkste functie is dienen als visuele gids binnen het beheer om beter te beslissen hoe je elk bericht classificeert.
Is het de moeite waard om een redactionele kaart te maken voor een kleine website?
Als je weinig artikelen hebt, is het waarschijnlijk niet nodig. Het begint zinvol te worden wanneer de website groeit, er veel categorieën of tags zijn, je over meerdere onderwerpen publiceert of je een duidelijker redactioneel criterium moet behouden.
Het kan indirect helpen. Een duidelijkere taxonomie verbetert de interne structuur, voorkomt doublures, maakt interne links makkelijker en maakt nuttigere categorie- of tagarchieven mogelijk. Het belangrijkste is geen zinloze termen of lege of te magere archiefpagina’s aan te maken.

Geef een reactie