如何从包含1个以上类别的帖子中删除“未分类”?

时间:2016-07-17 作者:Corey

所以最近我把一个客户从Blogger搬到Wordpress。

当从blogger导入帖子时,它将blogger的“标签”保存为Wordpress中的“标签”。因为我想将这些作为类别,所以我使用了一个插件将所有标记转换为类别。

这很有效,但我所有的帖子都没有分类。所以现在我有大约900篇帖子,都附有正确的类别,以及“未分类”。

因此,我的目标是从所有900篇帖子中删除“未分类”,但我正在努力找到一种快速的方法来做到这一点。

有人知道我如何用批量方法来实现这一点吗?

6 个回复
SO网友:Simon Cossar

具有wp-cli 安装后,您可以运行这样的bash脚本,从所有包含多个类别的帖子中删除“未分类”类别

#!/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
将此另存为以下内容delete_uncategorized.bash 然后运行bash delete_uncategorized.bash 从命令行。

SO网友:Nathan Johnson

这里有一个插件,激活后,它可以循环浏览所有未分类类别的帖子。如果它在另一个类别中,则会删除未分类的。此外,在保存帖子时,它会执行相同的检查。

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

SO网友:TechSmurfy

派对上的人来晚了一点,但我只需要自己来做。解决方法是通过phpmyadmin中的SQL查询,类似于:

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 )
(将wp\\uprefix替换为前缀)通常“未分类”具有term\\u taxonomy\\u id=1。上面的查询将对有多个类别的所有帖子ID进行分组,因此自然会在分组中首先显示“uncategorized”。因此,选择所有具有term\\u taxonomy\\u id的行,并将其删除。就这样!

现在,您所要做的就是编辑wp\\u term\\u taxonomy表中“uncategorized”(term\\u taxonomy\\u id=1)的count字段。Count number是此类别中列出的文章数,但特定字段不会自动更新。

如果您转到wp管理面板的“类别”部分,仍然会显示旧的(错误的)计数编号,但如果您按该编号并转到“未分类”的帖子列表,wordpress通常会重新统计与该类别相关的帖子。正确的计数将显示在您的右上角,因此请进入您的数据库,并相应地编辑计数字段:)

编辑:实际上,计数最终会得到更新,只是不是马上更新,所以您可能希望跳过手动计数更新。

SO网友:Jamie Chong

根据@TechSmurfy的回答,我得出了以下结论:

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;

SO网友:Rick Hellewell

嗯,不干扰数据库的最简单方法是创建一个新类别,将其设为默认类别,然后进入帖子列表并按“未分类”类别排序。编辑这些帖子并删除“未分类”类别标签。

完成后,您可以删除该类别。如果任何帖子使用某个类别,则无法删除该类别。

SO网友:dulesaga

在尝试了上面的所有方法之后,我发现这个sql查询是从包含多个cat的未分类帖子中删除帖子的最快方法。

如果速度不是那么慢的话,使用WP-CLI将是最好的选择。

在我的情况下,我不得不删除了5万多条长期关系,所以失败了。

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