【问题标题】:Wordpress: How do I remove the category "uncategorized" from all posts in bulk?Wordpress:如何从所有帖子中批量删除“未分类”类别?
【发布时间】:2015-07-22 16:52:46
【问题描述】:

场景:

我有 1000 个帖子属于“未分类”类别,我想从所有这些帖子中删除“未分类”并为这些帖子设置不同的类别。

换句话说,一举将所有未分类的帖子移到另一个类别。

我可以批量执行此操作而不单独查看每个帖子吗?

【问题讨论】:

  • 只需将“帖子->类别”下的类别重命名为您想要的名称。

标签: wordpress categories


【解决方案1】:

您正在寻找的是 WordPress 批量编辑器。

  1. 转到帖子 > 类别 > 未分类

  2. 单击右上角的“屏幕选项”选项卡,然后将“每页的项目数:”更改为 1000。(如果您使用的是非常慢的服务器,您可能会考虑一次少做一些)

  3. 现在选择页面上的所有项目,然后单击全选上方的“批量操作”下拉菜单,然后选择“编辑”选项。

  4. 点击应用

  5. 在批量编辑器中,点击您想要将所有帖子更改为的“新类别”并点击更新。

将所有帖子添加到“新类别”后,您需要删除“未分类”类别。为此:

  1. 进入设置>写作
  2. 现在将“默认帖子类别”更改为“未分类”以外的其他内容
  3. 返回帖子 > 类别并删除“未分类”类别
  4. 现在您可以根据需要再次创建“未分类”类别并将其更改回默认值。

一旦您删除“未分类”类别,它将从您的所有帖子中删除。

如果您有一些帖子想要保留在“未分类”中,则创建一个名为“temp”的新类别,并将所有要保留的帖子分配给该类别。删除“未分类”后,再次创建它并将“临时”中的帖子分配回该类别。

【讨论】:

    【解决方案2】:

    正如您所发现的,批量编辑器只允许向多个帖子添加类别 - 无法从多个帖子中删除类别。我发现最好的选择是临时安装这个插件https://wordpress.org/plugins/bulk-remove-posts-from-category/(在 WP 存储库中),它增加了使用相同的批量编辑方法从多个帖子中删除类别的能力。它只是在类别列表下添加了一个额外的“删除”复选框。

    【讨论】:

      【解决方案3】:

      未分类类别的 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() :-)

      【讨论】:

        【解决方案4】:

        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;
        

        【讨论】:

          【解决方案5】:

          如果您想将所有个未分类的帖子移动到另一个类别,您可以使用Bulk Move 插件。

          如果您想从 一些 帖子中删除一个类别,Bulk remove posts from category 可能是更好的选择。

          【讨论】:

            【解决方案6】:

            正如 Melebius 所说,使用 https://wordpress.org/plugins/bulk-remove-posts-from-category/ 更快(也更容易)!它适用于产品和帖子。太棒了!

            【讨论】:

              【解决方案7】:

              您可以将此添加到主题的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(); 
              ?>
              

              【讨论】:

              • 这运行起来非常苛刻,而且非常昂贵。如果在几百个帖子后超时,我不会超额
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-29
              • 2013-08-24
              • 1970-01-01
              • 1970-01-01
              • 2014-09-02
              相关资源
              最近更新 更多