使用Python按ID为WordPress文章添加标签时出现参数错误
错误原因
报错信息 tags[0] is not of type integer 直接点明问题:WordPress REST API 的 tags 参数要求传入整数类型的标签ID列表,但你当前传入的是字符串类型的标签名称列表,参数类型不匹配导致400错误。
解决方法
WordPress API 不支持直接通过标签名称关联文章,必须先获取标签对应的ID(若标签不存在则创建新标签),再用ID列表更新文章。
1. 实现标签ID的获取/创建逻辑
先写一个工具函数,负责查询标签是否存在:存在则返回ID,不存在则创建新标签并返回ID:
def get_or_create_tag(tag_name, site_url, headers): # 查询标签是否存在 tag_search_url = f"{site_url}/wp-json/wp/v2/tags?search={tag_name}" response = requests.get(tag_search_url, headers=headers) if response.status_code == 200 and len(response.json()) > 0: return response.json()[0]['id'] # 不存在则创建新标签 create_tag_url = f"{site_url}/wp-json/wp/v2/tags" payload = {"name": tag_name} create_response = requests.post(create_tag_url, headers=headers, json=payload) if create_response.status_code == 201: return create_response.json()['id'] raise Exception(f"Failed to handle tag {tag_name}: {create_response.text}")
2. 修改原代码更新文章标签
替换原代码中标签处理的部分,先批量获取所有标签ID,再用 PUT 请求(注意:更新文章必须用PUT,原代码的POST是创建新文章的请求)更新文章:
import requests site_url = "https://set-services.shop" api_key = "T70A Bb2B HyF9 xS4L tzka R782" headers = {"Authorization": "Basic " + api_key} POST_ID = 540 tag_names = ["tag1", "tag2", "tag3"] # 批量获取/创建标签ID tag_ids = [] for name in tag_names: try: tag_id = get_or_create_tag(name, site_url, headers) tag_ids.append(tag_id) except Exception as e: print(f"Error with tag {name}: {str(e)}") exit(1) # 更新文章标签 endpoint = f"{site_url}/wp-json/wp/v2/posts/{POST_ID}" payload = {"tags": tag_ids} # 用PUT请求执行更新操作 response = requests.put(endpoint, headers=headers, json=payload) if response.status_code in [200, 201]: print(f"Successfully added tags to post {POST_ID}") else: print(f"Error adding tags to post {POST_ID}: {response.text}") # 定义标签处理函数 def get_or_create_tag(tag_name, site_url, headers): tag_search_url = f"{site_url}/wp-json/wp/v2/tags?search={tag_name}" response = requests.get(tag_search_url, headers=headers) if response.status_code == 200 and len(response.json()) > 0: return response.json()[0]['id'] create_tag_url = f"{site_url}/wp-json/wp/v2/tags" payload = {"name": tag_name} create_response = requests.post(create_tag_url, headers=headers, json=payload) if create_response.status_code == 201: return create_response.json()['id'] raise Exception(f"Failed to handle tag {tag_name}: {create_response.text}")
关键注意事项
- 请求方法错误:原代码用
POST请求更新文章是错误的,WordPress REST API 中,更新已有资源需要用PUT请求,POST仅用于创建新资源。 - 权限验证:确保你的API密钥拥有编辑文章、管理标签的权限,否则会返回权限错误。
内容的提问来源于stack exchange,提问作者ELOUTMADI
相关产品推荐
相关产品推荐

