【发布时间】:2015-07-22 16:52:46
【问题描述】:
场景:
我有 1000 个帖子属于“未分类”类别,我想从所有这些帖子中删除“未分类”并为这些帖子设置不同的类别。
换句话说,一举将所有未分类的帖子移到另一个类别。
我可以批量执行此操作而不单独查看每个帖子吗?
【问题讨论】:
-
只需将“帖子->类别”下的类别重命名为您想要的名称。
标签: wordpress categories
场景:
我有 1000 个帖子属于“未分类”类别,我想从所有这些帖子中删除“未分类”并为这些帖子设置不同的类别。
换句话说,一举将所有未分类的帖子移到另一个类别。
我可以批量执行此操作而不单独查看每个帖子吗?
【问题讨论】:
标签: wordpress categories
您正在寻找的是 WordPress 批量编辑器。
转到帖子 > 类别 > 未分类
单击右上角的“屏幕选项”选项卡,然后将“每页的项目数:”更改为 1000。(如果您使用的是非常慢的服务器,您可能会考虑一次少做一些)
现在选择页面上的所有项目,然后单击全选上方的“批量操作”下拉菜单,然后选择“编辑”选项。
点击应用
在批量编辑器中,点击您想要将所有帖子更改为的“新类别”并点击更新。
将所有帖子添加到“新类别”后,您需要删除“未分类”类别。为此:
一旦您删除“未分类”类别,它将从您的所有帖子中删除。
如果您有一些帖子想要保留在“未分类”中,则创建一个名为“temp”的新类别,并将所有要保留的帖子分配给该类别。删除“未分类”后,再次创建它并将“临时”中的帖子分配回该类别。
【讨论】:
正如您所发现的,批量编辑器只允许向多个帖子添加类别 - 无法从多个帖子中删除类别。我发现最好的选择是临时安装这个插件https://wordpress.org/plugins/bulk-remove-posts-from-category/(在 WP 存储库中),它增加了使用相同的批量编辑方法从多个帖子中删除类别的能力。它只是在类别列表下添加了一个额外的“删除”复选框。
【讨论】:
未分类类别的 ID 为 1。我们的工作流程将是,
获取分配给未分类类别的所有帖子。
我们只会获得帖子 ID,这将使我们在拥有数千个帖子的网站上的查询速度提高 1000 倍。这也有助于我们的查询不会超时或遇到最大内存致命错误。
使用wp_set_object_terms() 删除和设置我们的新条目
下面的代码需要 PHP 5.4+ 并且任何更改都是不可逆的,所以请先备份您的数据库
$args = [
'nopaging' => true, // Gets all posts
'cat' => 1, // Only gets posts assigned to category 1 which is the uncategorized category
'fields' => 'ids', // Only get post ID's, make query up 1000 times faster on huge databases
];
$q = get_posts( $args );
if ( $q ) {
foreach ( $q as $v ) {
// Get all the post categories
$categories = get_the_category( $v );
$category_ids = [];
foreach ( $categories as $category ) {
// Replace all uncategorized category instances with our new category id and build new array
if ( $category->term_id == 1 ) {
$category_ids[] = (int) 21; // REPLACE WITH THE CORRECT NEW CATEGORY ID
} else {
$category_ids[] = (int) $category->term_id;
}
}
// Set our new categories to the post
if ( $category_ids ) // Unnecessary check for categories, but just in case should something fail
wp_set_object_terms( $v, $category_ids, 'category' );
}
}
注意,我们没有在任何地方更改 $post 全局或设置后数据,所以我们不需要调用 wp_reset_postdata() :-)
【讨论】:
Wordpress 将类别和帖子之间的父/子关系存储在wp_term_relationships 表中,该表记录在here 中。正如@Pieter Goosen 所指出的,“未分类”类别的 ID 为1。因此,您可以备份您的 SQL 数据库,然后使用 SQL 命令行客户端(sudo mysql wordpress 适合我)连接到它,然后运行以下 SQL 命令:
delete from wp_term_relationships where term_taxonomy_id = 1;
【讨论】:
如果您想将所有个未分类的帖子移动到另一个类别,您可以使用Bulk Move 插件。
如果您想从 一些 帖子中删除一个类别,Bulk remove posts from category 可能是更好的选择。
【讨论】:
正如 Melebius 所说,使用 https://wordpress.org/plugins/bulk-remove-posts-from-category/ 更快(也更容易)!它适用于产品和帖子。太棒了!
【讨论】:
您可以将此添加到主题的functions.php 文件中,然后刷新您网站上的任何页面一次,然后删除该功能。
使用风险自负并首先备份数据库!这上面没有UNDO按钮。
<?php
$args = array(
'posts_per_page' => -1
);
$myposts = get_posts( $args );
foreach ( $myposts as $post ) :
setup_postdata( $post );
$categories = get_the_category();
$catcount = count($categories);
$postid = $post->ID;
$catlist = array();
//Building a list of categories for each post and EXCLUDING "uncategorized"
foreach( $categories as $category ) {
if($category->name == 'Uncategorized') {
continue;
}
$catlist[] = $category->term_id;
}
// If there's just one category, and that category is "Uncategorized", move the category to one of your choosing
if($catcount == 1 && $categories[0]->name == "Uncategorized") {
// This is the category ID that you want to move uncategorized posts to
$catlist = array(189);
}
wp_set_object_terms( $postid, $catlist, 'category' );
endforeach;
wp_reset_postdata();
?>
【讨论】: