如何从类别超过1的帖子中删除“未分类”?


9

所以最近我将一个客户从Blogger移到了Wordpress。

从博主导入帖子时,它将博主的“标签”另存为Wordpress中的“标签”。由于我想将这些作为类别,因此我使用了一个插件将所有标签转换为类别。

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

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

有谁知道我可以用批量方法做到这一点?


显示类别的代码看起来如何?
SarahCoding '16

没有代码,这是在管理员中。
科里

我认为您只需要删除Uncategorized类别。
SarahCoding '16

1
@ Dan9,我们不能只删除Uncategorized类别,这是在未分配帖子时分配给帖子的默认帖子类别,但我们可以通过以下方式来Settings-->Writing
更改

默认情况下,您在WordPress中需要一个类别。“未分类”是WordPress的默认类别。我的建议是,您可以将默认类别从“未分类”更改为您自己的类别,也可以更改默认类别的名称。
bagpipper

Answers:


8

随着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


wp cli是一个好方法。
JMau '16

这是否需要对站点托管服务器的SSH访问?据我对WP Engine的了解,我只有SFTP访问权限。我知道他们过去曾经对WP CLI进行Beta测试,但不确定状态。
科里

但基本上我可以将这种方法转换为PHP脚本。
科里

您可能将数据库下载到本地计算机,然后在该计算机上运行脚本。
西蒙·科萨

4

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

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

2

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

现在,您要做的就是编辑wp_term_taxonomy表中“未分类的”(term_taxonomy_id = 1)的计数字段。计数数是此类别中列出的文章数量,但特定字段不会自动更新。

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

编辑:实际上,计数确实会最终更新,只是不是立即更新,因此您可能要跳过手动计数更新。


0

基于@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;

0

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

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


0

在弄乱并尝试了以上所有方法之后,我发现此sql查询是从Uncategorized中删除具有多个猫的帖子的最快方法。

如果不慢的话,使用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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.