Wie entferne ich "Nicht kategorisiert" aus Posts mit mehr als einer Kategorie?

9

Vor kurzem habe ich einen Client von Blogger zu Wordpress verschoben.

Beim Importieren der Beiträge aus dem Blogger wurden die "Labels" des Bloggers als "Tags" in Wordpress gespeichert. Da ich diese stattdessen als Kategorien haben möchte, habe ich ein Plugin verwendet, um alle Tags in Kategorien zu konvertieren.

Dies funktionierte gut und gut, aber es wurde in allen meinen Posts nicht kategorisiert. Jetzt habe ich ungefähr 900 Beiträge, an die alle die richtigen Kategorien angehängt sind, sowie "Nicht kategorisiert".

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

Weiß jemand, wie ich dies in einer Massenmethode erreichen kann?

Corey
quelle
Wie sieht der Code aus, der die Kategorien anzeigt?
SarahCoding
Es gibt keinen Code, dieser befindet sich im Administrator.
Corey
Ich denke, Sie müssen nur die UncategorizedKategorie löschen .
SarahCoding
1
@ Dan9, wir können nicht einfach UncategorizedKategorie löschen, es ist die Standard-Post-Kategorie, die Posts zugewiesen wird, wenn keine zugewiesen ist, aber wir können diese Standard-Kategorie, indem wir zuSettings-->Writing
bravokeyl
In WordPress benötigen Sie standardmäßig eine Kategorie. "Nicht kategorisiert" ist die Standardkategorie von WordPress. Was ich vorschlagen würde, können Sie entweder die Standardkategorie von "Nicht kategorisiert" in eine eigene Kategorie ändern oder den Namen der Standardkategorie ändern.
Dudelsackspieler

Antworten:

8

Mit wp-cli installiert Sie können wie folgt ein Bash - Skript ausführen , um die Kategorie ‚Allgemein‘ aus allen Beiträgen mit mehr als einer Kategorie 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.bashund führen Sie es dann bash delete_uncategorized.bashüber die Befehlszeile aus.

Simon Cossar
quelle
wp cli ist ein guter Ansatz.
JMau
Benötigt dies SSH-Zugriff auf den Server, auf dem die Site gehostet wird? Soweit ich weiß, habe ich nur SFTP-Zugriff auf WP Engine. Ich weiß, dass sie WP CLI in der Vergangenheit Beta-getestet haben, aber nicht sicher sind, welchen Status sie haben.
Corey
Aber im Grunde könnte ich diese Methode wahrscheinlich einfach in ein PHP-Skript konvertieren.
Corey
Sie könnten die Datenbank wahrscheinlich auf Ihren lokalen Computer herunterladen und dort das Skript ausführen.
Simon Cossar
4

Hier ist ein Plugin, das bei Aktivierung alle Beiträge in der nicht kategorisierten Kategorie durchläuft. Wenn es sich in einer anderen Kategorie befindet, wird es nicht kategorisiert entfernt. Wenn ein Beitrag gespeichert wird, wird die gleiche Prüfung durchgeführt.

<?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
quelle
2

Ein bisschen spät zu den Party-Jungs, aber ich musste das einfach selbst machen. Eine Problemumgehung wäre über SQL-Abfragen in phpmyadmin, etwa:

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 das Präfix wp_ durch Ihr Präfix.) Normalerweise hat "nicht kategorisiert" eine term_taxonomy_id = 1. Die obige Abfrage gruppiert alle Beitrags-IDs, bei denen mehr als eine Kategorie vorhanden ist. Daher wird "nicht kategorisiert" natürlich zuerst in der Gruppierung angezeigt. Wählen Sie also alle Zeilen mit einer term_taxonomy_id = 1 aus und löschen Sie sie. Und das war's auch schon!

Alles was Sie jetzt tun müssen, ist , bearbeiten die Zählung Bereich „nicht zugeordnet“ ( term_taxonomy_id = 1) in der wp_term_taxonomy Tabelle. Die Anzahl der Artikel gibt an, wie viele Artikel in dieser Kategorie aufgeführt sind, das jeweilige Feld wird jedoch nicht automatisch aktualisiert.

Wenn Sie zu Ihrem wp-Admin-Bereich im Abschnitt "Kategorien" gehen, wird die alte (falsche) Zählnummer weiterhin angezeigt. Wenn Sie jedoch diese Nummer drücken und zur Liste der nicht kategorisierten Beiträge gehen, zählt WordPress normalerweise die damit verbundenen Beiträge auf Kategorie. Oben rechts wird eine korrekte Zählung angezeigt. Gehen Sie also in Ihre Datenbank und bearbeiten Sie das Zählfeld entsprechend :)

Bearbeiten: Tatsächlich wird die Zählung schließlich aktualisiert, nur nicht sofort. Daher können Sie die manuelle Zählaktualisierung überspringen.

TechSmurfy
quelle
0

Basierend auf der Antwort von @ TechSmurfy habe ich Folgendes gefunden:

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

Der einfachste Weg, ohne mit der Datenbank herumzuspielen, besteht darin, eine neue Kategorie zu erstellen, diese als Standard festzulegen, dann in die Liste der Beiträge zu wechseln 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.

Rick Hellewell
quelle
0

Nachdem ich herumgespielt und alle Ansätze von oben ausprobiert hatte, stellte ich fest, dass diese SQL-Abfrage der schnellste Weg ist, um Beiträge aus Uncategorized zu entfernen, die mehr als eine Katze haben.

Die Verwendung von WP-CLI wäre die beste Option, wenn es nicht so langsam wie die Hölle wäre.

In meinem Fall musste ich mehr als 50 000 Laufzeitbeziehungen löschen, daher ist es einfach gescheitert.

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
quelle