Wie entferne ich “Uncategorized” von Beiträgen mit mehr als einer Kategorie?

Kürzlich habe ich einen Client von Blogger nach WordPress verlegt.

Wenn die Posts von Blogger importiert wurden, speicherte es die Blogger “Etiketten” als “Tags” in WordPress. Da ich diese als Kategorien haben möchte, habe ich ein Plugin benutzt, um alle Tags in Kategorien umzuwandeln.

Das hat gut funktioniert, aber es hat Uncategorized auf allen meinen Posts hinterlassen. So habe ich jetzt rund 900 Beiträge, die alle ihre richtigen Kategorien haben, sowie “Uncategorized”.

Mein Ziel ist also, “Uncategorized” aus allen 900 Posts zu entfernen, aber ich habe Mühe, eine schnelle Methode dafür zu finden.

Weiß jemand, wie ich das in einer Massenmethode erreichen könnte?

Solutions Collecting From Web of "Wie entferne ich “Uncategorized” von Beiträgen mit mehr als einer Kategorie?"

Wenn wp-cli installiert ist, können Sie ein Bash-Skript wie dieses ausführen, um die Kategorie “Nicht kategorisiert” aus allen Posts mit mehr als einer Kategorie zu entfernen

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

Speichern Sie dies als etwas wie delete_uncategorized.bash und führen Sie anschließend bash delete_uncategorized.bash über die Befehlszeile aus.

Ein bisschen spät zu den Party Jungs, aber ich musste das nur selbst machen. Ein Workaround wäre über SQL-Abfragen in phpmyadmin, etwas wie:

 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 ) 

(Ersetzen Sie wp_ prefix durch Ihr Präfix) Normalerweise hat “uncategorized” eine term_taxonomy_id = 1. Die obige Abfrage würde alle Post-IDs gruppieren, bei denen es mehr als eine Kategorie gibt, also wird natürlich “unkategorisiert” zuerst in der Gruppierung angezeigt. Wählen Sie also alle Zeilen aus, die ein term_taxonomy_id = 1 haben, und löschen Sie sie. Und das ist es auch!

Jetzt müssen Sie nur noch das Zählerfeld “uncategorized” ( term_taxonomy_id = 1) in der Tabelle wp_term_taxonomy bearbeiten . Zählnummer gibt an, wie viele Artikel in dieser Kategorie aufgeführt sind, aber das spezifische Feld wird nicht automatisch aktualisiert.

Wenn du zu deinem wp admin panel, Kategorien, gehst, wird die alte (falsche) Zählnummer immer noch angezeigt, aber wenn du diese Nummer drückst und zur Posts Liste ‘uncategorized’ gehst, dann zählt WordPress normalerweise die Posts, die damit verbunden sind Kategorie. Eine korrekte Anzahl wird oben rechts angezeigt, also geh dann in deine db und bearbeite das Zählfeld entsprechend 🙂

Bearbeiten: Tatsächlich wird die Zählung schließlich aktualisiert, nur nicht sofort, so dass Sie die manuelle Aktualisierung der Zählung überspringen möchten.

Hier ist ein Plugin, das bei der Aktivierung alle Posts in der nicht kategorisierten Kategorie durchläuft. Wenn es in einer anderen Kategorie ist, wird es nicht kategorisiert entfernt. Wenn ein Beitrag gespeichert wird, führt er die gleiche Prüfung durch.

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

Basierend auf der Antwort von @ TechSmurfy habe ich folgendes herausgefunden:

 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; 

Nun, der einfachste Weg, ohne die database durcheinander zu bringen, besteht darin, eine neue Kategorie zu erstellen, diese als Standard festzulegen, dann in die Liste der Einträge zu gehen und nach der Kategorie “nicht kategorisiert” zu sortieren. Bearbeiten Sie diese Beiträge und entfernen Sie das Kategorie-Tag “nicht kategorisiert”.

Sobald dies abgeschlossen ist, können Sie die Kategorie löschen. Eine Kategorie kann nicht gelöscht werden, wenn ein Beitrag diese Kategorie verwendet.

Nachdem ich all die Ansätze von oben her durcheinandergebracht habe, habe ich festgestellt, dass diese SQL-Abfrage der schnellste Weg ist, um Posts aus Uncategorized zu entfernen, die mehr als eine Katze haben.

Die Verwendung von WP-CLI wäre die beste Option, wenn es nicht langsam wäre.

In meinem Fall musste ich mehr als 50 000 Begriff Beziehungen löschen, so dass es einfach gescheitert ist.

 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);