• Resuelto darkpollo

    (@darkpollo)


    Hola,

    Tengo una web que tiene varios años y miles de artículos.
    Esa web cometió el error durante años de poner etiquetas a los artículos como si fueras meta tags de google.
    La conclusión es que hay miles de etiquetas que solamente tienen un post asociado a las mismas, lo cual las hace completamente inútiles.
    Los plugins de limpieza como wp-sweep limpian etiquetas y taxonomías sin post asociados pero no he encontrado ningún plugin que haga la limpieza de etiquetas con uno o ningun post asociados.
    Si que hay para ninguno pero no para 1.
    Si alguien sabe alguna forma de limpiar esas etiquetas y la tabla de wp_term_relationships mediante MYSQL sería fantástico.
    Enlaces relacionados que he ido investigando:
    http://scottnelle.com/648/clean-bloated-wp_term_relationships-table/

    Gracias!

Viendo 14 respuestas - de la 1 a la 14 (de un total de 14)
  • Moderador almendron

    (@almendron)

    Puedes usar https://es.wordpress.org/plugins/simple-tags/

    Después de activarlo, te vas a Herramientas > Manage Terms > Delete Terms (Enter the name of terms to delete. Terms will be removed from all posts.You can specify multiple terms to delete by separating them with commas).

    Eso sí, haz primero una copia de seguridad de la base de datos.

    Iniciador del debate darkpollo

    (@darkpollo)

    Gracias
    Usar un plugin es complicado, hablamos de cientos de miles de post/etiquetas. La web se cuelga cuando los intenta listar de una vez o hacer algo en Bulk.
    Por eso la necesidad de usar un comando MYSQL para la limpieza.

    Ángel

    Iniciador del debate darkpollo

    (@darkpollo)

    He encontrado este código pero siendo de 2011 no estoy seguro de si es la mejor forma de hacerlo:
    http://sumtips.com/2011/11/search-delete-unused-tags-wordpress.html

    Sobre todo después de leer esto (sobre las revisiones)
    https://wordpress.org/support/topic/deleting-post-revisions-do-not-use-the-abc-join-code-you-see-everywhere/?replies=3

    ¿Alguien puede confirmar si ese código cambiando el 0 por un 1 es lo que necesito?

    Gracias!

    Yo creo que la mejor forma siempre es con el API de WordPress, pues está lleno de hooks que otros plugins pueden estar utilizando y así nos aseguramos de que todo queda en su sitio al final del proceso.

    Yo haría algo así:

    $tags = get_terms( array(
        'taxonomy' => 'post_tag'
    ) );
    if ( !empty( $tags ) && !is_wp_error( $tags ) ){
        foreach ( $tags as $tag ) {
            // $tag->count contiene el número de posts asociados al tag.
            // Pon la condición que necesites.
            if( $tag->count < 2 ) {
                wp_delete_term( $tag->term_id, 'post_tag' );
            }
        }
    }

    get_terms() admite más argumentos, entre ellos number para limitar el número de términos a devolver, así puede ir haciendo pasos hasta que completes la tarea. O imcrementa muuuuuuho los límites de PHP y hazlo del tirón. Pero yo iría por este camino en lugar de MySQL a pelo, que nunca se sabe que código de terceros puede estar utilizando hooks de WordPress y podrías dejar cosas desincronizadas.

    • Esta respuesta fue modificada hace 7 años, 3 meses por cybmeta.
    Moderador almendron

    (@almendron)

    Una duda @cybmeta sobre el código que has puesto: eso afectaría solo a la tabla wp_terms ¿O no?

    Lo pregunto porque se supone que hay implicadas varias tablas y no solo esa.
    https://codex.wordpress.org/Database_Description

    Iniciador del debate darkpollo

    (@darkpollo)

    Precisamente lo que propone @cybmeta es usar el código de WP para tener en cuenta todas las relaciones posibles.

    Después de probar y romper la base de datos (de desarrollo) varias veces llego a la conclusión:
    – El código de @cybmeta es la mejor opción. Quizas se pueda hacer un mini plugin para ello.
    – El plugin WP-SWEEP te puede crear un cristo sin despeinarte. Resutla que cuando limpia, limpia todo, no solo los post_tag y me había borrado taxonomías que se usaban para coordinar partes de la página que por definición si que están vacias…

    Voy a probar con el código de mil en mil a ver si peta o no el servidor.

    Iniciador del debate darkpollo

    (@darkpollo)

    Pregunta relacionada:
    ¿Como hago para meter el código sin un plugin?
    No quiero que se ejecute con cada página, sino de forma controlada…

    Moderador almendron

    (@almendron)

    Yo tengo un código que me permite ver errores en determinados parámetros. Lo ejecuto teniendo en cuenta unas fechas concretas.
    Pues bien, lo que hice fue crear una plantilla de página donde va el código y después cree una página a la que asocié dicha plantilla. Modifico las fechas y luego entro a la página.
    Ponla privada para que nadie más que tú pueda entrar y listo (o que solo puedan entrar los administradores).
    No se si me he explicado.

    • Esta respuesta fue modificada hace 7 años, 3 meses por almendron.

    También lo puedes hacer desde un script PHP separado en el que cargues WordPress a mano, así no interfiere con los usuarios «normales» de WordPress.

    require( '/path/to/wordpress/wp-load.php' );
    
    $tags = get_terms( array(
        'taxonomy' => 'post_tag'
    ) );
    if ( !empty( $tags ) && !is_wp_error( $tags ) ){
        foreach ( $tags as $tag ) {
            // $tag->count contiene el número de posts asociados al tag.
            // Pon la condición que necesites.
            if( $tag->count < 2 ) {
                wp_delete_term( $tag->term_id, 'post_tag' );
            }
        }
    }
    Iniciador del debate darkpollo

    (@darkpollo)

    Y como lo cargo a mano. ¿Lo subo al root por ejemplo?
    Voy a probar. 🙂

    Gracias!

    Prueba con cuidado que yo no he probado nada, solo he escrito aquí, a ver si te va a petar la web. Jeje.

    Iniciador del debate darkpollo

    (@darkpollo)

    Funciona! Gracias. Estoy usando este código para testear antes de borrar nada:

    <?php
    // Custom Taxonomy Code
    require( 'wp-load.php' );
    $tags = get_terms( array(
        'taxonomy' => 'post_tag',
     'orderby'           => 'count', 
     'hide_empty'        => false, 
     'number'            => '50' 
    ) );
    if ( !empty( $tags ) && !is_wp_error( $tags ) ){
        foreach ( $tags as $tag ) {
            // $tag->count contiene el número de posts asociados al tag.
            // Pon la condición que necesites.
            if( $tag->count < 10 ) {
    echo "-".$tag->term_id."-".$tag->slug."-".$tag->count;
          //      wp_delete_term( $tag->term_id, 'post_tag' );
            }
        }
    }

    Luego hay que quitar los echo y modificar los números 50 y 10 para ajustarlos a lo que uno quiere borrar.
    La query para comprobar en base de datos es:

    SELECT *
    FROM wp_terms wterms INNER JOIN wp_term_taxonomy wttax ON wterms.term_id = wttax.term_id
    WHERE wttax.taxonomy =  'post_tag' AND wttax.count =0;

    pero es mejor usar el archivo para borrar.
    Además he aprendido a lanzar un php, algo bastante práctico.
    Gracias!

    • Esta respuesta fue modificada hace 7 años, 3 meses por darkpollo.
    Moderador almendron

    (@almendron)

    A mi también me ha venido bien aprender como lanzar un script. Gracias.

    Y por cierto, bienvenido de nuevo @cybmeta . Siempre es un placer contar con tu ayuda y sapiencia.

    Iniciador del debate darkpollo

    (@darkpollo)

    @cybmeta
    Siempre pruebo en versiones de desarrollo, me he cargado la web como 10 veces esta tarde. 😀
    Gracias de nuevo!

Viendo 14 respuestas - de la 1 a la 14 (de un total de 14)
  • El debate ‘Como limpiar etiquetas usando MYSQL?’ está cerrado a nuevas respuestas.