【问题标题】:How to change/delete tags in wordpress post with python XML-RPC API如何使用 python XML-RPC API 更改/删除 wordpress 帖子中的标签
【发布时间】:2014-01-10 15:09:38
【问题描述】:

一些 wordpress 主题使用标签(例如“特色”)在首页上显示特色内容。

如果帖子中的某些 custom_field 值高于定义的值,我有一个 python 脚本,它用“特色”标签标记所有帖子。该脚本还会在每次运行时减少这些值。现在,如果此 custom_field 低于定义的值,我想从帖子中删除“精选”标签。

为我使用的现有帖子添加标签:

server = xmlrpclib.ServerProxy(wp_url)
client = Client(wp_url, wp_username, wp_password)

post = client.call(posts.GetPost(postID))  
post.custom_fields = [{'id': featuredscoreID, 'key':'featuredscore','value': featscore}]
post.terms_names = {
    'post_tag': ['new tag'],
    }
post.call(posts.EditPost(postID, fpost))

但此代码只会附加标签。

print post.terms 

会给我这样的东西:

[<WordPressTerm: Architecture>, <WordPressTerm: featured>, <WordPressTerm: Image>, <WordPressTerm: redevelopment>, <WordPressTerm: station>]

但我发现无法用 python 替换或删除现有帖子 wordpress 中的标签

类似:remove_tag(postID, 'tag')

谢谢

编辑:

似乎无法使用 python XML-RPC API 从帖子 ID ID 定义的帖子中删除标签(或标签)。应该可以使用数据库查询(Wordpress - Delete all tags by Post ID),但是这个特定的例子(对我来说)不起作用,如果需要从本地主机以外的其他位置运行这个(脚本),则需要放松 MySQL 安全性并打开一些端口。

因此,作为解决方案,从 wordpress 中删除标签,然后将其应用回应该在的帖子中。删除标签:

postTags = client.call(taxonomies.GetTerms('post_tag'))   

for tag in postTags:
    try:  
        if str(tag) == 'tag you would like to delete':
            client.call(taxonomies.DeleteTerm('post_tag', tag.id))         
    except:
        print "error"

自动“精选”帖子:http://imageoftheday.org/

【问题讨论】:

    标签: python wordpress tags


    【解决方案1】:

    如果您能够将代码/插件添加到您的 wordpress 实例,那么您可以使用custom XML-RPC methods 来处理这个问题。

    在 Wordpress 中,您需要添加一个函数来处理服务器端的魔法。 (我已将此添加到 functions.php,但更好的 WP 开发人员可能知道更好的地方。也许是一个插件。)

    我相信您的问题需要wp_remove_object_terms,但是您的自定义 xml-rpc 函数当然可以做任何您喜欢的事情。我使用这种方法来删除自定义字段,并与我安装的另一个插件进行交互。

    function xmlrpc_add_method_delete_tags( $methods ) {
      $methods['my_namespace.delete_tags'] = 'xmlrpc_delete_tags_handler';
      return $methods;
    }
    add_filter('xmlrpc_methods', 'xmlrpc_add_method_delete_tags');
    
    function xmlrpc_delete_tags_handler( $args ) {
      $result = array("ok" => false);
    
      try {
        // inspect $args for your parameters. I like to validate with regex,
        // but they should just be at the end of $args
        $n = count($args);
        $postId   = $args[$n-3];
        $term     = $args[$n-2];
        $taxonomy = $args[$n-1];
    
        $del = wp_remove_object_terms( $postId, $term, $taxonomy );
        $result["ok"] = ($del === true);
    
        if(is_wp_error($del)) {
          $result['wp_errors'] = $del->get_error_messages();
        }
      }
      catch(Exception $ex) {
        $result["msg"] = $ex->getMessage();
      }
    
      return json_encode($result); // send a json response
    }
    

    在 Python 中,定义一个 wordpress_xmlrpc.AuthenticatedMethod(或 AnonymousMethod,如果您不需要身份验证)。

    import json
    from wordpress_xmlrpc import Client, AuthenticatedMethod
    
    client = Client(WP_XMLRPC_URL, WP_USER, WP_PASSWORD)
    
    class WordpressRemoveTag(AuthenticatedMethod):
        # method_name must match the key string you added to $methods in WP
        method_name = 'my_namespace.delete_tags'
        method_args = ('postId', 'term', 'taxonomy')
    
    def remove_tag_from_obj(obj_id, term, tax='post_tag'):
        # return parsed json server response
        res = client.call(WordpressRemoveTag(obj_id, term, tax))
        return json.loads(res)
    

    然后在python中调用remove_tag_from_obj(...),你应该会得到服务器的json响应:

    print remove_tag_from_obj(post.id, 'my_tag')
    >> {"ok":true}
    

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2020-04-15
      相关资源
      最近更新 更多