remove tags from posts in php

时间:2012-04-17 作者:Alexander Bird

我觉得这应该是一个简单的问题,但我想不出来。

如果我有一个post\\u id,如何在php中从该帖子中删除特定标记??我知道如何更新元信息,但标签信息是不同的。

2 个回复
最合适的回答,由SO网友:Alexander Bird 整理而成

以下是有效的代码:

function untag_posts($post_ids, $tags) {
    global $wpdb;
    if(! is_array($post_ids) ) { 
        $post_ids = array($post_ids);
    }   
    $in_post_ids = implode("\',\'", $post_ids);

    if(! is_array($tags) ) { 
        $tags = array($tags);
    }   
    $in_tag_names = "\'" . implode("\',\'", $tags) . "\'";

    $query = "SELECT tt.term_taxonomy_id " . 
        " from $wpdb->terms as t " . 
            " JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id " . 
            " JOIN $wpdb->term_relationships as tr on tr.term_taxonomy_id = tt.term_taxonomy_id " . 
        " where t.name in ($in_tag_names) " . 
            " AND (tr.object_id in ($in_post_ids)) ";
    $tt_ids = $wpdb->get_col($query); // TODO: correct function?
    $in_tt_ids = implode("\',\'", $tt_ids);

    $delete_query = "DELETE FROM $wpdb->term_relationships where object_id in ($in_post_ids) and term_taxonomy_id in ($in_tt_ids)";
    $myrows = $wpdb->get_results( $delete_query );
}
下面是一个可行的备用代码:

function untag_post($post_ids, $tags) {
    global $wpdb;
    if(! is_array($post_ids) ) {
        $post_ids = array($post_ids);
    }
    if(! is_array($tags) ) {
        $tags = array($tags);
    }

    foreach($post_ids as $post_id) {
        $terms = wp_get_object_terms($post_id, \'post_tag\');
        $newterms = array();
        foreach($terms as $term) {
            if ( !in_array($term->name,$tags) ) { //$term will be a wordpress Term object.
                $newterms[] = $term;
            }
        }
        wp_set_object_terms($post_id, $newterms, \'post_tag\', FALSE);
    }
}
下面是我在wordpress测试环境中使用的测试数据(http://codex.wordpress.org/Automated_Testing)测试功能:

function test_untag_post() {
    function untag_post($post_ids, $tags) {
        global $wpdb;
        if(! is_array($post_ids) ) { 
            $post_ids = array($post_ids);
        }   
        if(! is_array($tags) ) { 
            $tags = array($tags);
        }   

        foreach($post_ids as $post_id) {
            $terms = wp_get_object_terms($post_id, \'post_tag\');
            $newterms = array();
            foreach($terms as $term) {
                if ( !in_array($term->name,$tags) ) { //$term will be a wordpress Term object.
                    $newterms[] = $term;
                }   
            }   
            wp_set_object_terms($post_id, $newterms, \'post_tag\', FALSE);
        }   
    }   
    $post = array();
    $post[\'post_content\'] = "Here is some content.";
    $post[\'post_excert\'] = "Quick excerpt.";
    $post[\'post_title\'] = "Test Post";
    $post[\'post_name\'] = "test-post";
    $post[\'post_type\'] = "post";
    $post_id = wp_insert_post($post);

    wp_add_post_tags($post_id, \'test-tag\');
    $terms = wp_get_object_terms($post_id, \'post_tag\');
    $this->assertEquals(\'test-tag\', $terms[0]->name);

    untag_post($post_id, \'test-tag\');

    $terms = wp_get_object_terms($post_id, \'post_tag\');
    $this->assertEmpty($terms);
} 
编辑:下面(这是我以前的答案)IS WRONG

我之前的回答所允许的只是一种删除所有贴子标签的方法。但我正在寻找一种只删除特定帖子标签的方法。

功能wp_delete_object_term_relationships (wp-includes/taxonomy.php 第1662行)是执行此操作的低级别函数。然而

如果需要的话,它不会自动将某些东西归类(这可能不是问题)

我还没有测试过这个

我觉得使用wordpress文档网站上没有提到的用于公共用途的低级功能有点不舒服。

所以也许有更好的方法。

SO网友:Chris Rae

无论出于什么原因,亚历山大·伯德的例行训练对我来说都不太管用。我对其进行了一些修改,以使用wp\\u set\\u post\\u标记,而不是wp\\u set\\u object\\u术语:

function untag_post($post_ids, $tags) {
    global $wpdb;
    if(! is_array($post_ids) ) {
        $post_ids = array($post_ids);
    }
    if(! is_array($tags) ) {
        $tags = array($tags);
    }

    foreach($post_ids as $post_id) {
        $curtags = wp_get_post_tags($post_id, \'post_tag\');
        $newtags = array();
        foreach($tags as $tag) {
            foreach($curtags as $id=>$curtag) {
                if ( $curtag->name == $tag ) {
                    unset($curtags[$id]);
                }
            }
        }

        foreach ($curtags as $curtag) {
            $newtags[] = $curtag->name;
        }

        wp_set_post_tags( $post_id, $newtags, false );
    }
}

结束

相关推荐

WordPress自动在PHP代码周围添加<!->html标签

我当时正在管理一个网站,接替了以前的管理员。在最后一口气中,他在网站上做了一些改变,正是在登录部分:http://www.spiritualresponse.com/login/我不知道是有意还是无意,但登录表单已经消失了。这是一个尽快修复它的任务,因此我可以收集到的PHP代码,调用sidebarlogin插件,会自动得到评论。这之前没有发生过,我也不知道是什么原因造成的。在我输入代码的地方,它没有“”标记,但当它呈现时,php会被注释掉。我没有在谷歌上找到任何解决方案,因为搜索“自动评论/评论”详细问题