Come rimuovo "Senza categoria" dai post con più di 1 categoria?


9

Di recente ho spostato un client da Blogger a Wordpress.

Quando i post importati da blogger, salvano le "etichette" di blogger come "tag" in Wordpress. Dato che mi piacerebbe avere questi come categorie, ho usato un plugin per convertire tutti i tag in categorie.

Questo ha funzionato bene e dandy, ma ha lasciato Uncategorized su tutti i miei post. Quindi ora ho circa 900 post a cui sono associate tutte le categorie corrette, oltre a "Non categorizzato".

Quindi il mio obiettivo è quello di rimuovere "Uncategorized" da tutti i 900 post, ma faccio fatica a trovare un metodo rapido per farlo.

Qualcuno sa come potrei farlo in un metodo globale?


Come appare il codice che mostra le categorie?
SarahCoding del

Non c'è codice, questo è nell'amministratore.
Corey,

Penso che devi solo eliminare la Uncategorizedcategoria.
SarahCoding del

1
@ Dan9, non possiamo semplicemente eliminare la Uncategorizedcategoria è la categoria di post predefinita assegnata ai post quando non ne è stata assegnata nessuna, ma possiamo farlo di default andando aSettings-->Writing
bravokeyl

È necessaria una categoria per impostazione predefinita in WordPress. "Senza categoria" è la categoria predefinita di WordPress. Quello che suggerirei, puoi cambiare la categoria predefinita da "Non categorizzato" a una tua, oppure puoi cambiare il nome della categoria predefinita.
Bagpipper,

Risposte:


8

Con wp-cli installato puoi eseguire uno script bash come questo per rimuovere la categoria 'non categorizzata' da tutti i post con più di una 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

Salvalo come qualcosa di simile delete_uncategorized.bashe poi eseguilo bash delete_uncategorized.bashdalla riga di comando.


wp cli è un buon approccio.
JMau,

Ciò richiede l'accesso SSH al server su cui è ospitato il sito? Ho accesso SFTP solo per quanto ne so su WP Engine. So che erano beta test WI CLI in passato, ma non sono sicuro dello stato.
Corey,

Ma sostanzialmente potrei probabilmente convertire questo metodo in uno script PHP.
Corey,

Probabilmente potresti scaricare il database sul tuo computer locale ed eseguire lo script lì.
Simon Cossar,

4

Ecco un plug-in che all'attivazione fa scorrere tutti i post nella categoria non categorizzata. Se è in un'altra categoria, rimuove non categorizzato. Inoltre, quando un post viene salvato, esegue lo stesso controllo.

<?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' );
  }
}

2

Un po 'tardi alla festa ragazzi, ma dovevo solo farlo da solo. Una soluzione alternativa sarebbe tramite query SQL in phpmyadmin, qualcosa del tipo:

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 )

(sostituisci il prefisso wp_ con il tuo prefisso) Normalmente "non classificato" ha un term_taxonomy_id = 1. La query sopra raggrupperebbe tutti gli ID post in cui è presente più di una categoria, quindi naturalmente "non classificato" viene visualizzato per primo nel raggruppamento. Quindi seleziona tutte quelle righe che hanno un term_taxonomy_id = 1 ed eliminale. E questo è tutto!

Ora non ti resta che modificare il campo di conteggio di "non classificato" ( term_taxonomy_id = 1) nella tabella wp_term_taxonomy . Il numero di conteggio è il numero di articoli elencati in questa categoria, ma il campo specifico non viene aggiornato automaticamente.

Se vai al tuo pannello di amministrazione di wp, sezione categorie, il vecchio numero di conteggi (errato) viene ancora visualizzato, ma se premi quel numero e vai all'elenco dei post di "non categorizzato", wordpress di solito racconta i post che sono affiliati a quello categoria. Verrà visualizzato un conteggio corretto in alto a destra, quindi vai nel tuo db e modifica il campo di conteggio :)

Modifica: in realtà, il conteggio alla fine viene aggiornato, ma non subito, quindi potresti voler saltare l'aggiornamento del conteggio manuale.


0

Sulla base della risposta di @ TechSmurfy, ho pensato a questo:

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;

0

Bene, il modo più semplice senza fare confusione con il database è creare una nuova categoria, impostarla come predefinita, quindi andare nell'elenco dei messaggi e ordinare in base alla categoria "non categorizzata". Modifica i post e rimuovi il tag di categoria "non classificato".

Una volta completato, puoi eliminare la categoria. Una categoria non può essere eliminata se un post utilizza quella categoria.


0

Dopo aver pasticciato e provato tutti gli approcci dall'alto, ho scoperto che questa query sql è il modo più veloce per rimuovere post da Uncategorized che hanno più di un gatto.

L'uso di WP-CLI sarebbe l'opzione migliore, se non fosse lento come l'inferno.

Nel mio caso ho dovuto cancellare più di 50.000 relazioni a termine, quindi è STATO MANCATO.

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.