Hoy te traigo un plugin que he tenido desarrollar ya que el problema que el slug ya lo esta utilizando otro termino, no se podía solucionar de otra manera y tampoco he encotrado recursos que den con mi caso.
En wordpress al cambiar las urls o slugs de una categoría o post de se te guarda la antigua URL para crear una redireccion 301 automatica para tu sitio. Hasta ahi todo bien, pero el caso llega cuando quieres mejorar el rendimiento de los buscadores y mejorar tu SEO dejando la web sin esas redirecciones.
A veces si utilizas un sistema de multilenguaje como por ejemplo el WPML se pueden generar conflictos con los slugs de categorías. Uno de los más comunes es el siguiente donde dice que Error El slug «mi-slug-categoria» ya lo está utilizando otro término.
En el ejemplo de la imagen de abajo intentaba poner «queixo-barra» en el slug y cambar el que tenia pero no me dejaba:
He desarrollado un pequeño plugin para WordPress que soluciona el error El slug «categoria-main» ya lo está utilizando otro término.
Solo indica el slug que quieres eliminar en la casilla y clica al respectivo boton de borrado.
Principalmente he partido de la función que me ha permitido solucionar el el caso de que el slug ya lo está utilizando otro término.
//borrado de slug categoria manual
function delete_category_with_slug( $slug ) {
$term = get_term_by( 'slug', $slug, 'category' );
if ( $term ) {
wp_delete_term( $term->term_id, 'category' );
}
}
delete_category_with_slug( 'tu-slug-name-on-bug' );
Con esta funcion eliminas al instante el slug de categoria que se indica al llamar la función delete_category_with_slug.
Dentro del modulo Slug Master Eraser tienes opciones adicionales además de que puedes gestionarlo desde el backoffice de WordPress.
function delete_category_with_slug( $slug ) {
global $wpdb;
// Comprobar si el slug existe como meta_value de _wp_old_slug
$term = $wpdb->get_row(
$wpdb->prepare( "SELECT * FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug' AND meta_value = %s", $slug )
);
if ( $term ) {
$post_id = $term->post_id;
$post_type = get_post_type( $post_id );
if ( $post_type == 'post' ) {
wp_set_object_terms( $post_id, '', 'category', false );
wp_delete_object_term_relationships( $post_id, 'category' );
} elseif ( $post_type == 'page' ) {
wp_set_object_terms( $post_id, '', 'page-category', false );
wp_delete_object_term_relationships( $post_id, 'page-category' );
} else {
return false; // Si el tipo de post no es ni "post" ni "page", retornar falso
}
// Eliminar la entrada de la tabla postmeta
$wpdb->delete( "{$wpdb->prefix}postmeta", array( 'post_id' => $post_id, 'meta_key' => '_wp_old_slug', 'meta_value' => $slug ) );
return true;
}
// Si no se encuentra en la tabla postmeta, comprobar si existe en categorías
$term = get_term_by( 'slug', $slug, 'category' );
if ( $term ) {
wp_delete_term( $term->term_id, 'category' );
return true;
}
// Si no se encuentra en categorías, comprobar si existe en etiquetas
$term = get_term_by( 'slug', $slug, 'post_tag' );
if ( $term ) {
wp_delete_term( $term->term_id, 'post_tag' );
return true;
}
return false; // Si no se encuentra en ninguna taxonomía ni en la tabla postmeta, retornar falso
}
function delete_old_slugs() {
global $wpdb;
$old_slugs = $wpdb->get_results( "SELECT DISTINCT meta_value FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug'" );
foreach ($old_slugs as $old_slug) {
delete_category_with_slug( $old_slug->meta_value );
}
}
function deletter_old_slug_options() {
add_options_page( 'Delete Category Options', 'Taxonomy Slug Repair', 'manage_options', 'delete-category-options', 'deletter_old_slug_options_page' );
}
add_action( 'admin_menu', 'deletter_old_slug_options' );
function display_categories_list() {
// Obtener todas las categorías y etiquetas
$categories = get_terms( array(
'taxonomy' => 'category',
'hide_empty' => false,
) );
$tags = get_terms( array(
'taxonomy' => 'post_tag',
'hide_empty' => false,
) );
// Mostrar los términos en columnas separadas
if ( count($categories) > 0 || count($tags) > 0 ) {
echo '<h2>Lista de categorías y etiquetas</h2>';
echo '';
if (count($categories) > 0) {
echo '<h3>Categorías:</h3><ul>';
foreach ($categories as $category) {
echo '<li><strong>' . $category->name . '</strong>: ' . $category->slug . '</li>';
}
echo '</ul>';
} else {
echo '<p>No se encontraron categorías.</p>';
}
echo '';
echo '';
if (count($tags) > 0) {
echo '<h3>Etiquetas:</h3><ul>';
foreach ($tags as $tag) {
echo '<li><strong>' . $tag->name . '</strong>: ' . $tag->slug . '</li>';
}
echo '</ul>';
} else {
echo '<p>No se encontraron etiquetas.</p>';
}
echo '';
} else {
echo '<p>No se encontraron categorías o etiquetas.</p>';
}
}
function display_old_slugs_list() {
global $wpdb; // Necesitamos acceder a la base de datos
// Obtener todos los datos de postmeta donde la meta_key es igual a _wp_old_slug
$old_slugs = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}postmeta WHERE meta_key = '_wp_old_slug'" );
// Mostrar los antiguos slugs en una lista
if ( count($old_slugs) > 0 ) {
echo '';
echo '<h3>Antiguos Slugs posts:</h3><ul>';
foreach ($old_slugs as $old_slug) {
echo '<li>' . $old_slug->meta_value . '</li>';
}
echo '</ul>';
}
}
function deletter_old_slug_options_page() {
if ( isset( $_POST['delete-category'] ) ) {
$slug = sanitize_text_field( $_POST['category-slug'] );
delete_category_with_slug( $slug );
echo '<p>Elemento eliminado con exito</p>';
}
?>
<h1>Encuentra y elimina viejos slugs de Categoria, Tags y Posts</h1>
<p>Este pequeño plugin se encarga de mostrarte TODOS las categorías y tags juntos a sus slugs. El error tipico al que da solución es <strong>El slug «mi-slug-antiguo» ya lo está utilizando otro</strong>.</p>
<p>Muestra listado de categorías que no aparecen en la lista de Posts -> Categorías</p>
<p>Elimina las redirecciones 301 del slug antiguo al nuevo.</p>
<p>Encuetra y elimina slugs de categoria/tags bugeados incluso los que no estan en <strong>meta_key = _wp_old_slug</strong></p>
<p>Tambien puedes ver los antiguos Slugs de tus entradas y post y eliminarlo</p>
<form method="post" action="">
<label for="category-slug">Slug para eliminar:</label>
<input type="text" name="category-slug" id="category-slug">
<button type="submit" name="delete-category">Eliminar</button>
</form>
<?php display_categories_list(); ?>
<?php display_old_slugs_list(); ?>
<?php
}
El error puede ser por varios casos y sin que te lo esperas aparecer de la nada. Siempre es importante tener limpios tus enlaces y evitar los enlaces 301 ya que al señor Google no les gustan demasiado.
Espero que les haya servido para arreglar algun que otro problema con los slugs de categoría o en general. Como siempre puedes dejarme ideas mejores o errores detectados del el plugin en la caja de comentarios.
Un saludo.