Como faço para remover "Sem categoria" de postagens com mais de uma categoria?

9

Recentemente, mudei um cliente do Blogger para o Wordpress.

Quando as postagens foram importadas do blogger, ele salvou o "marcador" de blogueiro como "tag" no Wordpress. Como eu gostaria de tê-las como categorias, usei um plug-in para converter todas as tags em categorias.

Isso funcionou bem e com qualidade, mas deixou Sem categoria em todas as minhas postagens. Então, agora eu tenho cerca de 900 postagens, todas com as categorias corretas anexadas, além de "Sem categoria".

Portanto, meu objetivo é remover "Sem categoria" de todas as 900 postagens, mas estou lutando para encontrar um método rápido para fazer isso.

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

Corey
fonte
Como é o código que exibe as categorias?
21316 SarahCoding
Não há código, isso está no administrador.
Corey
Eu acho que você só precisa excluir a Uncategorizedcategoria.
21316 SarahCoding
1
@ Dan9, não podemos simplesmente apagar Uncategorizedcategoria é a categoria pós padrão atribuído a mensagens quando não é nenhum atribuído, mas o que pudermos esse padrão, indo paraSettings-->Writing
bravokeyl
Você precisa de uma categoria por padrão no WordPress. "Sem categoria" é a categoria padrão do WordPress. O que eu sugeriria, você pode alterar a categoria padrão de "Sem categoria" para uma de sua preferência ou alterar o nome da categoria padrão.
30816 bagpipper #

Respostas:

8

Com o wp-cli instalado, você pode executar um script bash como este para remover a categoria 'não categorizada' 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 delete_uncategorized.bashe execute a bash delete_uncategorized.bashpartir da linha de comando.

Simon Cossar
fonte
O wp cli é uma boa abordagem.
JMau
Isso requer acesso SSH ao servidor em que o site está hospedado? Eu só tenho acesso SFTP até onde sei no WP Engine. Eu sei que eles estavam testando a WP CLI beta no passado, mas não tinham certeza do status.
Corey
Mas basicamente eu provavelmente poderia converter esse método em um script PHP.
Corey
Você provavelmente pode baixar o banco de dados no computador local e executar o script nele.
Simon Cossar
4

Aqui está um plugin que, após a ativação, percorre todas as postagens que estão na categoria não categorizada. Se estiver em outra categoria, remove sem categoria. Além disso, quando uma postagem é salva, ele 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' );
  }
}
Nathan Johnson
fonte
2

Um pouco atrasado para os caras da festa, mas eu só precisava fazer isso sozinho. Uma solução alternativa 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) Normalmente "uncategorized" possui um term_taxonomy_id = 1. A consulta acima agruparia todos os IDs de postagem em que há mais de uma categoria, portanto, naturalmente "uncategorized" é exibido primeiro no agrupamento. Portanto, selecione todas as linhas com term_taxonomy_id = 1 e exclua-as. E é isso!

Agora tudo o que você precisa fazer é editar o campo de 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 antigo (errado) da contagem ainda será exibido, mas se você pressionar esse número e for para a lista de postagens de 'não categorizados', o wordpress geralmente recontará as postagens que estão afiliadas a ele categoria. Uma contagem correta será exibida no canto superior direito, então vá para o seu banco de dados e edite o campo de contagem adequadamente :)

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

TechSmurfy
fonte
0

Com base na resposta do @ TechSmurfy, vim com isso:

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
fonte
0

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

Depois de concluído, você pode excluir a categoria. Uma categoria não pode ser excluída se alguma postagem usar essa categoria.

Rick Hellewell
fonte
0

Depois de brincar e tentar todas as abordagens acima, descobri que essa consulta sql é a maneira mais rápida de remover postagens de Uncategorized que possuem 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 termos, por isso apenas falhou.

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
fonte