Optimización de URLs en WordPress: Eliminar "/category/" y Gestionar Enlaces de Autor

La optimización de la estructura de las URL es un factor crucial para el SEO de cualquier sitio web en WordPress. URL limpias y descriptivas facilitan la indexación por parte de los motores de búsqueda y mejoran la experiencia del usuario. A continuación, se detallan métodos para eliminar la base /category/ de las URL de categorías y cómo manejar eficazmente los enlaces de autor.

Eliminar "/category/" de las URLs de Categorías de WordPress

Por defecto, WordPress incluye /category/ en las URL de las páginas de archivo de categorías (ej. midominio.com/category/noticias/). Para una estructura más concisa y amigable para el SEO (ej. midominio.com/noticias/), se pueden aplicar las siguienets soluciones:

1. Configuración de Enlaces Permanentes

La manera más sencilla de abordar este cambio es a través de los ajustes de WordPress:

  1. Acceda al panel de administración de WordPress.
  2. Vaya a Ajustes > Enlaces Permanentes.
  3. Desplácese hasta la sección Base de Categoría.
  4. En el campo de texto, introduzca un único punto (.).
  5. Guarde los cambios.

Advertencia: Este método es ideal para sitios web nuevos sin contenido publicado. Si su sitio ya tiene categorías y publicaciones, cambiar esta configuración directamente puede romper los enlaces existentes y generar errores 404. Deberá implementar redirecciones 301 para todas las URL antiguas de categorías.

2. Utilizar un Plugin

Existen plugins diseñados específicamente para eliminar la base de categoría, como "WP No Category Base". Estos plugins suelen manejar automáticamente las reglas de reescritura y las redirecciones necesarias, simplificando el proceso para usuarios con menos experiencia técnica.

3. Implementar Código Personalizado en functions.php

Para un control más granular o si prefiere no añadir plugins adicionales, puede insertar el siguiente código en el archivo functions.php de su tema hijo. Este código establece la estructura de permalinks sin la base /category/ y maneja las redirecciones 301 para las URL antiguas.

<?php
/**
 * Personalización de URLs de categorías en WordPress: eliminar "/category/"
 * Requiere que se aplique antes de tener contenido para evitar errores en URLs existentes
 * si no se implementa una redirección adecuada.
 */

// 1. Forzar la actualización de reglas de reescritura al modificar categorías o temas
add_action('load-themes.php', 'wp_url_opt_flush_category_rules');
add_action('created_category', 'wp_url_opt_flush_category_rules');
add_action('edited_category', 'wp_url_opt_flush_category_rules');
add_action('delete_category', 'wp_url_opt_flush_category_rules');

function wp_url_opt_flush_category_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// 2. Establecer la estructura de permalinks para categorías sin la base "category"
add_action('init', 'wp_url_opt_define_category_structure');

function wp_url_opt_define_category_structure() {
    global $wp_rewrite, $wp_version;
    // La versión de WordPress 3.4 y superior usa 'struct', versiones anteriores usaban un array indexado.
    if (version_compare($wp_version, '3.4', '<')) {
        $wp_rewrite->extra_permastructs['category'][0] = '%category%';
    } else {
        $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
    }
}

// 3. Generar reglas de reescritura personalizadas para categorías
add_filter('category_rewrite_rules', 'wp_url_opt_create_custom_category_rules');

function wp_url_opt_create_custom_category_rules($category_rules) {
    $custom_rules = array();
    $all_categories = get_categories(array('hide_empty' => false));

    foreach ($all_categories as $cat_item) {
        $category_slug = $cat_item->slug;
        if ($cat_item->parent != 0 && $cat_item->parent != $cat_item->cat_ID) { // Manejar categorías jerárquicas
            $category_slug = get_category_parents($cat_item->parent, false, '/', true) . $category_slug;
        }

        // Reglas para feeds, paginación y el enlace directo de la categoría
        $custom_rules['(' . $category_slug . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $custom_rules['(' . $category_slug . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $custom_rules['(' . $category_slug . ')/?$'] = 'index.php?category_name=$matches[1]';
    }

    // Añadir una regla de redirección para las URLs existentes con la antigua base 'category'
    global $wp_rewrite;
    $old_base_string = get_option('category_base') ? get_option('category_base') : 'category';
    $old_base_string = trim($old_base_string, '/');
    if ($old_base_string && $old_base_string != '.') { // Asegurarse de no redirigir desde '.'
        $custom_rules[$old_base_string . '/(.*)$'] = 'index.php?category_redirect_legacy=$matches[1]';
    }

    return $custom_rules;
}

// 4. Añadir una variable de consulta pública para el manejo de redirecciones de categorías antiguas
add_filter('query_vars', 'wp_url_opt_add_redirect_query_var');

function wp_url_opt_add_redirect_query_var($public_vars) {
    $public_vars[] = 'category_redirect_legacy';
    return $public_vars;
}

// 5. Manejar la redirección 301 para las URLs de categorías antiguas
add_filter('request', 'wp_url_opt_process_category_redirect');

function wp_url_opt_process_category_redirect($query_variables) {
    if (isset($query_variables['category_redirect_legacy'])) {
        $new_category_path = trailingslashit(home_url()) . user_trailingslashit($query_variables['category_redirect_legacy'], 'category');
        status_header(301);
        header("Location: $new_category_path");
        exit();
    }
    return $query_variables;
}

Gestión de Enlaces de Autor en WordPress

WordPress genera automáticamente páginas de archivo para cada autor, lo que puede ser útil para sitios multi-autor pero a veces genera contenido duplicado o "thin content" en sitios de un solo autor. Gestionar estos enlaces es importante para el SEO.

1. Usar el Apodo del Autor en la URL en lugar del Nombre de Usuario

Por defecto, las URL de archivo de auter utilizan el 'nombre de usuario' (nicename). Cambiar esto para usar el 'apodo' (nickname) del autor puede ser una opción más estética y, en algunos casos, más privada si el nombre de usuario revela información sensible. Esto requiere modificar cómo WordPress consulta y genera esos enlaces.

<?php
/**
 * Gestionar enlaces de autor: Usar el apodo en la URL del autor
 * Reemplaza el slug de usuario por el apodo para URLs de archivo de autor.
 */
// 1. Modificar la consulta para buscar autores por apodo en lugar de nombre de usuario
add_filter('request', 'wp_author_opt_nickname_in_query');

function wp_author_opt_nickname_in_query($current_vars) {
    if (array_key_exists('author_name', $current_vars)) {
        global $wpdb;
        // Buscar el ID de usuario usando el apodo proporcionado en la URL
        $found_author_id = $wpdb->get_var(
            $wpdb->prepare(
                "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'nickname' AND meta_value = %s",
                $current_vars['author_name']
            )
        );
        if ($found_author_id) {
            $current_vars['author'] = $found_author_id;
            unset($current_vars['author_name']); // Eliminar la variable original
        }
    }
    return $current_vars;
}

// 2. Reemplazar el nombre de usuario por el apodo en los enlaces de autor generados
add_filter('author_link', 'wp_author_opt_replace_slug_with_nickname', 10, 3);

function wp_author_opt_replace_slug_with_nickname($author_url, $id_author, $nicename_author) {
    $author_display_name = get_user_meta($id_author, 'nickname', true);
    if ($author_display_name) {
        // Asegurar que el slug de autor en la URL se reemplace correctamente
        // Se utiliza sanitize_title para convertir el apodo en un slug válido
        $author_url = str_replace('/' . $nicename_author . '/', '/' . sanitize_title($author_display_name) . '/', $author_url);
    }
    return $author_url;
}

2. Añadir el Atributo rel="nofollow" a los Enlaces de Autor

Si los enlaces a las páginas de archivo de autor no aportan valor SEO significativo a su sitio (ej. en blogs de un solo autor), o si desea evitar que los motores de búsqueda rastreen esas páginas, puede añadir el artibuto rel="nofollow" a dichos enlaces. Esto se hace fácilmente mediante un filtro en functions.php.

<?php
/**
 * Gestionar enlaces de autor: Añadir atributo rel="nofollow"
 * Esto ayuda a controlar el flujo de "link juice" y puede ser útil para SEO.
 */
add_filter('the_author_posts_link', 'wp_author_opt_add_nofollow_to_link');

function wp_author_opt_add_nofollow_to_link($author_post_link_html) {
    // Busca el primer '<a href=' y añade rel="nofollow" después de la etiqueta 'a'
    return str_replace('<a href=', '<a rel="nofollow" href=', $author_post_link_html);
}

Nota: Evite modificar directamente los archivos del núcleo de WordPress (como wp-includes/author-template.php), ya que estos cambios se perderán con las actualizaciones y pueden comprometer la seguridad o funcionalidad de su sitio.

3. Deshabilitar o Redirigir Archivos de Autor

En muchos casos, especialmente para sitios de un solo autor, las páginas de archivo de autor pueden considerarse contenido duplicado o de baja calidad. Para evitar esto, puede:

  • Deshabilitar los archivos de autor: Muchos plugins SEO (como Yoast SEO o Rank Math) ofrecen una opción para deshabilitar los archivos de autor, configurando automáticamente un noindex en estas páginas.
  • Redirigir los archivos de autor: Si los desactiva, es aconsejable redirigir las URL de archivo de autor existentes a la página de inicio o a una página de autor personalizada (si existe) utilizando redirecciones 301. Esto se puede hacer mediante un plugin de redirección o con reglas en el archivo .htaccess.

Etiquetas: wordpress SEO Permalinks PHP Rewrite Rules

Publicado el 6-18 04:08