问题描述

所以最近我把客户从 Blogger 转移到 Wordpress 。

从博客导入帖子时,它将博客”labels” 保存为 WordPress 中的”tags” 。由于我想要将这些作为类别,我使用一个插件将所有标签转换为类别。

这个工作很好,很花园,但是在我的所有帖子中都没有分类。所以现在我有大约 900 个帖子,都附有正确的分类,以及”Uncategorized” 。

所以我的目标是从所有 900 个帖子中删除”Uncategorized”,但是我很难找到一个快速的方法来做到这一点。

有没有人知道如何以批量方式实现这一点?

最佳解决思路

安装了 wp-cli,您可以运行这样一个 bash 脚本,以从具有多个类别的所有帖子中删除’uncategorized’ 类别

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

次佳解决思路

有点迟到党派,但我只需要自己做这个。解决方法是通过 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_前缀) 通常”uncategorized” 有一个 term_taxonomy_id = 1 。上述查询将对所有有多个类别的所有帖子 ID 进行分组,因此自然会在分组中显示”uncategorized” 。所以选择所有那些具有 term_taxonomy_id = 1 的行并删除它们。这就是它!

现在您只需编辑 wp_term_taxonomy 表中”uncategorized”(term_taxonomy_id = 1) 的计数字段即可。计数是在此类别中列出的文章数量,但特定字段不会自动更新。

如果你去你的 wp 管理面板,类别部分,旧的 (错误的) 计数仍然显示,但是如果你按这个号码,并且去’uncategorized’ 的帖子列表,wordpress 通常会重新记录与该类别相关联的帖子。正确的计数将显示在右上方,因此请转到数据库中,并相应地编辑计数字段:)

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

第三种解决思路

这是一个插件,激活后,循环遍历未分类类别的所有帖子。如果它在另一个类别,它会删除未分类。此外,当保存帖子时,它执行相同的检查。

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

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。