使用MySQL删除海量标签

时间:2014-04-24 作者:rakibtg

我正在使用WordPress 3.4.2 对于我的一个站点,当前38,251 标签enter image description here
现在我想从我的站点中删除所有标记,那么哪种方法可以更安全地截断我的站点上的所有标记。

1 个回复
SO网友:gmazzap

MySqlDELETE 语法与fiom差别不大SELECT, 因此,您可以使用单个查询从多个表中删除。

WordPress中的分类信息包含在3个表中:

  • wp_terms
  • wp_term_taxonomy
  • wp_term_relationships

    要删除的查询all WordPress db中的标记为:

    DELETE t, tr, tt
    FROM wp_terms t  
    INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
    INNER JOIN wp_term_relationships tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
    WHERE tt.taxonomy = \'post_tag\'
    
    请注意,前缀wp_ 您的设置可能会有所不同,具体取决于$table_prefix 设置您的wp_config.php 文件更多信息here.

    确保在所有3个表的查询中使用正确的值替换前缀。

    另请注意,在multisite 安装时,完整表名为

    $prefix . $blogid . \'_\' . $tablename`
    
    例如,如果前缀是默认值\'wp_\' 日志为2,3个表将命名为:

    • wp_2_terms
    • wp_2_term_relationships
    • wp_2_term_taxonomy
    更多信息here.

    最后,请,be sure to have a full, valid database backup before running such a query.

    可以使用数据库管理工具运行查询,如phpMyAdmin.

    一方面,通过php运行查询很简单,因为使用WordPress$wpdbtable names are auto-resolved, 但在另一方面则更难,因为必须防止查询多次运行,必须检查用户功能,并且需要编辑php文件。

    以下代码使用transient 确保函数只运行一次,并且仅当超级管理员使用is_super_admin().

    add_action(\'admin_init\', function() {
      if ( ! is_super_admin() ) return;
      if ( get_transient(\'tags_cleaned\') ) return;
      add_action( \'shutdown\', \'my_clean_tags\' );
    });
    
    function my_clean_tags() {
      if ( ! is_super_admin() ) return;
      if ( get_transient(\'tags_cleaned\') ) return;
      remove_action( current_filter(), __FUNCTION__ );
      global $wpdb;
      $q = "
      DELETE t, tr, tt
      FROM {$wpdb->terms} t  
      INNER JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id
      INNER JOIN {$wpdb->term_relationships} tr ON tt.term_taxonomy_id = tr.term_taxonomy_id
      WHERE tt.taxonomy = \'post_tag\'
      ";
      $result = $wpdb->query( $q );
      set_transient(\' tags_cleaned\', $result );
      return $result;
    }
    

结束