Como faço para remover “Uncategorized” de postagens com mais de uma categoria?

8

Recentemente, mudei um cliente do Blogger para o Wordpress.

Quando as postagens são importadas do blogger, ele salva o blogger "labels" como "tags" no Wordpress. Como eu gostaria de ter essas categorias como categorias, usei um plug-in para converter todas as tags em categorias.

Isso funcionou bem e dandy, mas deixou Uncategorized em todos os meus posts. Então, agora eu tenho cerca de 900 posts que todos têm suas categorias corretas anexadas, bem como "Uncategorized".

Então, meu objetivo é remover "Uncategorized" de todas as 900 postagens, mas estou com dificuldades para encontrar um método rápido para fazer isso.

Alguém sabe como eu poderia realizar isso em um método em massa?

    
por Corey 17.07.2016 / 06:42

6 respostas

9

Com o wp-cli instalado, você pode executar um script bash como este para remover a categoria 'não categorizado' de todas as postagens com mais de uma categoria

#!/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

Salve isso como algo parecido com delete_uncategorized.bash e, em seguida, execute bash delete_uncategorized.bash na linha de comando.

    
por Simon Cossar 17.07.2016 / 09:06
3

Um pouco atrasado para a festa, mas eu só precisava fazer isso sozinho. Uma solução seria através de consultas SQL no phpmyadmin, algo 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 )

(substitua o prefixo wp_ pelo seu prefixo) Geralmente "não categorizado" tem um term_taxonomy_id = 1. A consulta acima agruparia todos os IDs de postagem onde há mais de uma categoria, então naturalmente "não categorizado" é exibido primeiro no agrupamento. Portanto, selecione todas as linhas que tiverem um term_taxonomy_id = 1 e exclua-as. E é sobre isso!

Agora tudo que você precisa fazer é editar o campo contagem de "não categorizado" ( term_taxonomy_id = 1) na tabela wp_term_taxonomy . Número de contagem é quantos artigos estão listados nesta categoria, mas o campo específico não é atualizado automaticamente.

Se você for ao painel de administração do wp, seção de categorias, o número de contagem (errado) antigo ainda será exibido, mas se você pressionar esse número e ir para a lista de posts de 'não categorizado', o wordpress geralmente reconta as postagens afiliado a essa categoria. Uma contagem correta será exibida no canto superior direito, então vá para o seu banco de dados e edite o campo contagem de acordo:)

Editar: na verdade, a contagem acaba sendo atualizada, mas não imediatamente, então você pode pular a atualização da contagem manual.

    
por TechSmurfy 20.01.2017 / 06:23
3

Aqui está um plug-in que, após a ativação, percorre todas as postagens que estão na categoria não categorizada. Se estiver em outra categoria, ele remove não categorizado. Além disso, quando uma postagem é salva, ela faz a mesma verificação.

<?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' );
  }
}
    
por Nathan Johnson 17.02.2017 / 19:28
0

Com base na resposta do @ TechSmurfy, descobri o seguinte:

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;
    
por Jamie Chong 11.07.2017 / 02:02
0

Bem, a maneira mais fácil sem mexer no banco de dados é criar uma nova categoria, torná-la padrão, depois entrar na lista de posts e classificar pela categoria 'não categorizada'. Edite essas postagens e remova a tag de categoria "não categorizada".

Quando isso estiver concluído, você poderá excluir a categoria. Uma categoria não pode ser excluída se qualquer postagem usar essa categoria.

    
por Rick Hellewell 11.07.2017 / 05:00
0

Depois de mexer e tentar todas as abordagens acima, descobri que essa consulta SQL é a maneira mais rápida de remover postagens do Uncategorized que têm mais de um gato.

Usar o WP-CLI seria a melhor opção, se não fosse lento como o inferno.

No meu caso, tive que excluir mais de 50 000 relacionamentos de termo, por isso, apenas FAILED.

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);
    
por dulesaga 06.01.2018 / 21:20

Tags