正确删除数组中的wp标记

时间:2016-08-23 01:51:20

标签: php mysql wordpress tags

我需要定期从wp表中删除一些标记。现在我用这个:

DELETE FROM wp_terms WHERE slug = 'tag-to-delete';

但我想我这样做的方式并不正确,因为我认为我必须删除与该术语的所有关系,对吗?

此外,我需要通过将标签放在数组中来通过functions.php来完成此操作。例如:$tags_to_delete = tag1, tag2, tag3;

是否可以通过functions.php执行此操作?如果是这样,有人能解释我正确的方法吗?

已编辑:我已经管理this solution,但这可能不是最终解决方案,因为我仍然有一些问题:

  1. 这样安全吗?
  2. 查询是正确还是可以改进?
  3. 有没有办法返回已删除标签的数量?
  4. 还有其他办法吗?
  5. 请参阅my solution bellow并帮助更好地回答这个问题。

2 个答案:

答案 0 :(得分:0)

您应该使用WordPress功能删除它们。他们会自动清理关系:

$tag = get_term( $tag_name, $taxonomy );
if ( ! $tag || is_wp_error( $tag ) ) {
    echo 'cant find the tag: ' . $tag_name ;
} else {
    wp_delete_term( $tag->term_id, $taxonomy );
}

答案 1 :(得分:0)

OK!我得到了这个工作,我希望这对任何人都有用。不过,我还有一些问题:

  1. 这样安全吗?
  2. 查询是正确还是可以改进?
  3. 有没有办法返回已删除标签的数量?
  4. 还有其他办法吗?

    $all_terms = array( 'tag number one', 'tag number two', );
    
    foreach ( $all_terms as $term ) {
    $terms = $wpdb->get_row( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.name IN ('".$term."') AND tt.taxonomy = 'post_tag' ORDER BY t.name ASC" );
    
    if( !empty( $terms ) ) {
        $wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $terms->term_taxonomy_id ) );
        $wpdb->delete( $wpdb->terms, array( 'term_id' => $terms->term_id ) );
       }
    }