Comment supprimer «Non classé» des messages avec plus d'une catégorie?

9

J'ai récemment déplacé un client de Blogger vers Wordpress.

Lorsque les articles importés de blogger, il a enregistré les "étiquettes" du blogueur en tant que "tags" dans Wordpress. Étant donné que j'aimerais les avoir en tant que catégories, j'ai utilisé un plugin pour convertir toutes les balises en catégories.

Cela a bien fonctionné et dandy, mais il a laissé Non classé sur tous mes messages. Alors maintenant, j'ai environ 900 messages qui ont tous leurs bonnes catégories attachées, ainsi que "Non classé".

Mon objectif est donc de supprimer "Uncategorized" de tous les 900 messages, mais j'ai du mal à trouver une méthode rapide pour le faire.

Est-ce que quelqu'un sait comment je pourrais accomplir cela dans une méthode en masse?

Corey
la source
À quoi ressemble le code qui affiche les catégories?
SarahCoding
Il n'y a pas de code, c'est dans l'admin.
Corey
Je pense que vous avez juste besoin de supprimer la Uncategorizedcatégorie.
SarahCoding
1
@ Dan9, nous ne pouvons pas simplement supprimer la Uncategorizedcatégorie, c'est la catégorie de message par défaut affectée aux messages quand il n'y en a pas, mais nous pouvons le faire par défaut en allant àSettings-->Writing
bravokeyl
Vous avez besoin d'une catégorie par défaut dans WordPress. "Non classé" est la catégorie par défaut de WordPress. Ce que je suggérerais, vous pouvez soit changer la catégorie par défaut de "Non classé" en une des vôtres, soit changer le nom de la catégorie par défaut.
bagpipper

Réponses:

8

Avec wp-cli installé, vous pouvez exécuter un script bash comme celui-ci pour supprimer la catégorie «non catégorisée» de tous les messages avec plus d'une catégorie

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

Enregistrez-le comme quelque chose comme delete_uncategorized.bash, puis exécutez-le à bash delete_uncategorized.bashpartir de la ligne de commande.

Simon Cossar
la source
wp cli est une bonne approche.
JMau
Cela nécessite-t-il un accès SSH au serveur sur lequel le site est hébergé? Je n'ai accès à SFTP que pour autant que je sache sur WP Engine. Je sais qu'ils testaient la CLI CLI en version bêta dans le passé, mais je ne suis pas sûr de l'état.
Corey
Mais en gros, je pourrais probablement convertir cette méthode en script PHP.
Corey
Vous pouvez probablement télécharger la base de données sur votre ordinateur local et y exécuter le script.
Simon Cossar
4

Voici un plugin qui lors de l'activation, parcourt tous les messages qui sont dans la catégorie non classée. Si c'est dans une autre catégorie, il supprime non classé. De plus, lorsqu'un message est enregistré, il effectue la même vérification.

<?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
la source
2

Un peu tard pour les gars de la fête, mais j'avais juste besoin de le faire moi-même. Une solution de contournement serait via les requêtes SQL dans phpmyadmin, quelque chose comme:

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 )

(remplacez le préfixe wp_ par votre préfixe) Habituellement, "non catégorisé" a un term_taxonomy_id = 1. La requête ci-dessus regrouperait tous les identifiants de publication où il y a plus d'une catégorie, donc naturellement "non catégorisé" est affiché en premier dans le regroupement. Sélectionnez donc toutes ces lignes qui ont un term_taxonomy_id = 1 et supprimez-les. Et c'est tout!

Il ne vous reste plus qu'à modifier le champ de comptage "non catégorisé" ( term_taxonomy_id = 1) dans la table wp_term_taxonomy . Le nombre est le nombre d'articles répertoriés dans cette catégorie, mais le champ spécifique n'est pas mis à jour automatiquement.

Si vous allez dans votre panneau d'administration wp, section des catégories, l'ancien (mauvais) numéro de compte est toujours affiché, mais si vous appuyez sur ce numéro et accédez à la liste des publications de `` non catégorisé '', wordpress raconte généralement les publications qui lui sont associées. Catégorie. Un décompte correct sera affiché en haut à droite, alors allez dans votre base de données et modifiez le champ de décompte en conséquence :)

Edit: En fait, le décompte est finalement mis à jour, mais pas tout de suite, vous pouvez donc ignorer la mise à jour manuelle du décompte.

TechSmurfy
la source
0

Sur la base de la réponse de @ TechSmurfy, j'ai trouvé ceci:

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
la source
0

Eh bien, le moyen le plus simple sans jouer avec la base de données est de créer une nouvelle catégorie, d'en faire la valeur par défaut, puis d'aller dans la liste des messages et de trier par la catégorie `` non catégorisée ''. Modifiez ces messages et supprimez la balise de catégorie «non classé».

Une fois cette opération terminée, vous pouvez supprimer la catégorie. Une catégorie ne peut pas être supprimée si un article utilise cette catégorie.

Rick Hellewell
la source
0

Après avoir gâché et essayé toutes les approches ci-dessus, j'ai trouvé que cette requête SQL est le moyen le plus rapide de supprimer les publications de Uncategorized qui ont plus d'un chat.

L'utilisation de WP-CLI serait la meilleure option, si elle n'était pas si lente.

Dans mon cas, j'ai dû supprimer plus de 50 000 relations de durée, donc c'est simplement ÉCHEC.

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
la source