web-dev-qa-db-fra.com

Comment supprimer "Non classé" des publications de plus d'une catégorie?

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

Lorsque les articles importés de blogger, il enregistrait les "étiquettes" de ce dernier en tant que "balises" dans Wordpress. Puisque j'aimerais plutôt avoir ces catégories comme catégories, j'ai utilisé un plugin pour convertir toutes les balises en catégories.

Cela a bien fonctionné, mais cela a laissé Uncategorized sur tous mes messages. Alors maintenant, j'ai environ 900 articles qui ont tous leurs catégories correctes attachées, ainsi que "Uncategorized".

Donc, mon objectif est de supprimer "Non classé" de tous les 900 articles, mais je peine à trouver une méthode rapide pour le faire.

Est-ce que quelqu'un sait comment je pourrais accomplir cela en gros?

8
Corey

Avec wp-cli installed, vous pouvez exécuter un script bash comme celui-ci pour supprimer la catégorie "non catégorisé" de toutes les publications comportant plusieurs catégories.

#!/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 sous la forme delete_uncategorized.bash, puis exécutez bash delete_uncategorized.bash à partir de la ligne de commande.

8
Simon Cossar

Voici un plugin qui, lors de l'activation, parcourt tous les messages qui sont dans la catégorie sans catégorie. Si c'est dans une autre catégorie, cela supprime les non catégorisés. En outre, 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' );
  }
}
3
Nathan Johnson

Un peu tard pour les gars de la fête, mais je devais le faire moi-même. Une solution de contournement serait via des 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) Généralement, "non catégorisé" a un term_taxonomy_id = 1. La requête ci-dessus regroupe tous les identifiants de publication où il existe plus d'une catégorie. le groupement. Sélectionnez donc toutes les lignes qui ont term_taxonomy_id = 1 et supprimez-les. Et c'est à peu près tout!

Il ne vous reste plus qu'à modifier le champ count de "uncategorized" ( term_taxonomy_id = 1) dans la table wp_term_taxonomy . 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 accédez à la section des catégories de votre panneau d'administration wp, l'ancien numéro de compte (erroné) 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 nombre correct sera affiché en haut à droite, alors allez dans votre base de données et modifiez le champ count en conséquence :)

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

2
TechSmurfy

Après avoir déconné et essayé toutes les approches d’en haut, j’ai trouvé que cette requête SQL était le moyen le plus rapide de supprimer les publications de Uncategorized ayant plusieurs chats.

Utiliser WP-CLI serait la meilleure option, si ce n’était pas si lent.

Dans mon cas, j'ai dû supprimer plus de 50 000 relations de terme, donc cela a simplement échoué.

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

Basé sur la réponse de @ TechSmurfy, j'ai proposé 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;
0
Jamie Chong

Eh bien, le moyen le plus simple de ne pas toucher à la base de données est de créer une nouvelle catégorie, d’en faire la valeur par défaut, puis d’entrer dans la liste des publications et de trier par catégorie. Éditez ces publications et supprimez la balise de catégorie "non catégorisé".

Une fois que cela est terminé, vous pouvez supprimer la catégorie. Une catégorie ne peut pas être supprimée si une publication utilise cette catégorie.

0
Rick Hellewell