¿Cómo elimino "Sin categoría" de las publicaciones con más de 1 categoría?

9

Recientemente, trasladé un cliente de Blogger a Wordpress.

Cuando las publicaciones se importaron de blogger, guardó las "etiquetas" de blogger como "etiquetas" en Wordpress. Como me gustaría tenerlos como categorías, utilicé un complemento para convertir todas las etiquetas en categorías.

Esto funcionó bien y elegante, pero dejó Sin categoría en todas mis publicaciones. Así que ahora tengo alrededor de 900 publicaciones que tienen sus categorías correctas adjuntas, así como "Sin categoría".

Así que mi objetivo es eliminar "Uncategorized" de las 900 publicaciones, pero estoy luchando por encontrar un método rápido para hacerlo.

¿Alguien sabe cómo podría lograr esto en un método masivo?

Corey
fuente
¿Cómo se ve el código que muestra las categorías?
SarahCoding
No hay código, esto está en el administrador.
Corey
Creo que solo necesitas eliminar la Uncategorizedcategoría.
SarahCoding
1
@ Dan9, no podemos simplemente eliminar la Uncategorizedcategoría, es la categoría de publicación predeterminada asignada a las publicaciones cuando no hay ninguna asignada, pero podemos hacerlo de manera predeterminada yendo aSettings-->Writing
bravokeyl
Necesita una categoría por defecto en WordPress. "Sin categoría" es la categoría predeterminada de WordPress. Lo que sugeriría es que puede cambiar la categoría predeterminada de "Sin categoría" a una propia, o puede cambiar el nombre de la categoría predeterminada.
bagpipper

Respuestas:

8

Con wp-cli instalado, puede ejecutar un script bash como este para eliminar la categoría 'no categorizada' de todas las publicaciones con más de una categoría

#!/bin/bash

for post in $(wp post list --field=ID)
do
  count=$(wp post term list $post 'category' --fields='name' --format="count")
  if [ "$count" -gt "1" ]
  then
    wp post term remove $post category 'uncategorized'
  fi
done

Guarde esto como algo así delete_uncategorized.bashy luego ejecute bash delete_uncategorized.bashdesde la línea de comando.

Simon Cossar
fuente
wp cli es un buen enfoque.
JMau
¿Requiere esto acceso SSH al servidor en el que está alojado el sitio? Solo tengo acceso SFTP hasta donde sé en WP Engine. Sé que estaban probando beta WP CLI en el pasado pero no estoy seguro del estado.
Corey
Pero, básicamente, probablemente podría convertir este método a un script PHP.
Corey
Probablemente podría descargar la base de datos a su computadora local y ejecutar el script allí.
Simon Cossar
4

Aquí hay un complemento que, tras la activación, recorre todas las publicaciones que están en la categoría no categorizada. Si está en otra categoría, elimina sin categorizar. Además, cuando se guarda una publicación, realiza la misma verificación.

<?php
/**
 * Plugin Name: Remove Uncategorized
 * Description: Removes the uncategorized category if there's another category.
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Don't access this file directly
defined( 'ABSPATH' ) or die();

register_activation_hook( __FILE__ , 'wpse_106269_activation' );

function wpse_106269_activation() {
  $args = array(
    'posts_per_page'   => -1,
    'offset'           =>  0,
    'category'         => get_option( 'default_category' ),
    'post_status'      => 'any',
    'suppress_filters' => true,
  );
  $posts = get_posts( $args );
  foreach( $posts as $post ) {
    wpse_106269_maybe_remove_uncategorized_category( $post->ID );
  }
}

add_action( 'save_post', 'wpse_106269_save_post', 10, 3 );

function wpse_106269_save_post( $id, $post, $update ) {
  remove_action( 'save_post', 'wpse_106269_save_post', 10, 3 );
  wpse_106269_maybe_remove_uncategorized_category( $id );
  add_action( 'save_post', 'wpse_106269_save_post', 10, 3 );
}

function wpse_106269_maybe_remove_uncategorized_category( $id ) {
  $categories = get_the_category( $id );
  $default = get_cat_name( get_option( 'default_category' ) );
  if( count( $categories ) >= 2 && in_category( $default, $id ) ) {
    wp_remove_object_terms( $id, $default, 'category' );
  }
}
Nathan Johnson
fuente
2

Un poco tarde para la fiesta, chicos, pero solo necesitaba hacer esto yo mismo. Una solución sería a través de consultas SQL en phpmyadmin, algo así como:

SELECT *
FROM `wp_term_relationships`
WHERE `term_taxonomy_id`
IN ( SELECT `term_taxonomy_id`
FROM `wp_term_taxonomy`
WHERE `taxonomy` = 'category' )
GROUP BY `object_id`
HAVING ( COUNT( `object_id` ) >1 )

(reemplace el prefijo wp_ con su prefijo) Por lo general, "sin clasificar" tiene un term_taxonomy_id = 1. La consulta anterior agruparía todos los identificadores de publicación donde hay más de una categoría, por lo que, naturalmente, "sin clasificar" se muestra primero en la agrupación. Por lo tanto, seleccione todas esas filas que tengan un term_taxonomía_id = 1 y elimínelas. ¡Y eso es todo!

Ahora todo lo que tiene que hacer es editar el campo de recuento de "sin clasificar" ( term_taxonomía_id = 1) en la tabla wp_term_taxonomía . El número de recuento es cuántos artículos se enumeran en esta categoría, pero el campo específico no se actualiza automáticamente.

Si va a su panel de administración de wp, sección de categorías, todavía se muestra el número de conteo anterior (incorrecto), pero si presiona ese número y va a la lista de publicaciones de 'no categorizado', WordPress generalmente relata las publicaciones que están afiliadas a ese categoría. Se mostrará un conteo correcto en la esquina superior derecha, así que vaya a su base de datos y edite el campo de conteo en consecuencia :)

Editar: en realidad, el recuento finalmente se actualiza, pero no de inmediato, por lo que es posible que desee omitir la actualización del recuento manual.

TechSmurfy
fuente
0

Basado en la respuesta de @ TechSmurfy se me ocurrió esto:

create temporary table tr_to_delete (object_id INT);
insert into tr_to_delete SELECT object_id FROM wp_term_relationships tr, wp_term_taxonomy tt WHERE tr.term_taxonomy_id=tt.term_taxonomy_id and tt.taxonomy='category' GROUP BY object_id HAVING COUNT(*) >1;
delete from wp_term_relationships where term_taxonomy_id=1 and object_id in (select object_id from tr_to_delete);
drop temporary table tr_to_delete;
Jamie Chong
fuente
0

Bueno, la forma más fácil sin meterse con la base de datos es crear una nueva categoría, hacer que sea la predeterminada, luego ir a la lista de publicaciones y ordenar por la categoría 'no categorizada'. Edite esas publicaciones y elimine la etiqueta de categoría 'sin categoría'.

Una vez que se haya completado, puede eliminar la categoría. No se puede eliminar una categoría si alguna publicación usa esa categoría.

Rick Hellewell
fuente
0

Después de perder el tiempo y probar todos los enfoques anteriores, descubrí que esta consulta SQL es la forma más rápida de eliminar publicaciones de Uncategorized que tienen más de un gato.

Usar WP-CLI sería la mejor opción, si no fuera tan lento como el infierno.

En mi caso tuve que eliminar más de 50 000 relaciones de término, por lo que simplemente FALLÓ.

DELETE FROM wp_term_relationships WHERE term_taxonomy_id=1 AND object_id IN ( SELECT object_id  FROM (
SELECT tr.object_id FROM wp_term_relationships tr, wp_term_taxonomy tt WHERE tr.term_taxonomy_id=tt.term_taxonomy_id and tt.taxonomy='category' GROUP BY tr.object_id HAVING COUNT(*) >1
) as temp_table);
dulesaga
fuente