如何通过外部自定义PHP脚本为WordPress文章设置分类与标签
嘿,我来帮你搞定这个问题!WordPress的分类和标签关联确实不是直接写wp_posts就行,得和另外三个核心表打交道,我给你一步步拆解怎么做:
先搞懂WordPress分类/标签的存储逻辑
WordPress用三个表来管理术语(分类、标签都属于术语)和文章的关联:
wp_terms:存储所有术语的基础信息,比如名称、别名(slug)、描述wp_term_taxonomy:把术语和具体的分类法绑定(比如category是分类,post_tag是标签),同时记录术语的父级ID、描述等wp_term_relationships:最终关联文章ID和术语分类ID(term_taxonomy_id),一个文章可以对应多个术语,所以这里会有多条记录
具体操作步骤(带PHP代码示例)
假设你已经成功插入文章到wp_posts,拿到了文章ID $post_id,并且已经有了数据库连接对象(比如$mysqli),表前缀是默认的wp_(如果你的前缀不一样,记得替换成自己的)。
1. 处理文章分类(Category)
比如你要给文章添加名为「技术教程」的分类:
// 定义表前缀(根据你的实际情况修改) $table_prefix = 'wp_'; // 已插入文章的ID $post_id = 123; // 替换成你实际的文章ID // 定义要添加的分类信息 $category_name = '技术教程'; $category_slug = 'tech-tutorial'; // 可选,不填的话可以用名称转slug $taxonomy = 'category'; // 第一步:检查分类是否已经存在 $check_category_sql = $mysqli->prepare(" SELECT tt.term_taxonomy_id FROM {$table_prefix}terms t JOIN {$table_prefix}term_taxonomy tt ON t.term_id = tt.term_id WHERE t.name = ? AND tt.taxonomy = ? "); $check_category_sql->bind_param("ss", $category_name, $taxonomy); $check_category_sql->execute(); $result = $check_category_sql->get_result(); $term_taxonomy_id = null; if ($result->num_rows === 0) { // 分类不存在,先插入wp_terms表 $insert_term_sql = $mysqli->prepare(" INSERT INTO {$table_prefix}terms (name, slug, term_group) VALUES (?, ?, 0) "); // 如果没传slug,用名称生成一个简单的slug(可以自己优化逻辑) if (empty($category_slug)) { $category_slug = strtolower(str_replace(' ', '-', $category_name)); } $insert_term_sql->bind_param("ss", $category_name, $category_slug); $insert_term_sql->execute(); $term_id = $mysqli->insert_id; // 再插入wp_term_taxonomy表 $insert_taxonomy_sql = $mysqli->prepare(" INSERT INTO {$table_prefix}term_taxonomy (term_id, taxonomy, description, parent, count) VALUES (?, ?, '', 0, 0) "); $insert_taxonomy_sql->bind_param("ss", $term_id, $taxonomy); $insert_taxonomy_sql->execute(); $term_taxonomy_id = $mysqli->insert_id; } else { // 分类已存在,直接获取term_taxonomy_id $row = $result->fetch_assoc(); $term_taxonomy_id = $row['term_taxonomy_id']; } // 第二步:关联文章和分类 if ($term_taxonomy_id) { $insert_relationship_sql = $mysqli->prepare(" INSERT INTO {$table_prefix}term_relationships (object_id, term_taxonomy_id, term_order) VALUES (?, ?, 0) ON DUPLICATE KEY UPDATE term_order = 0 "); $insert_relationship_sql->bind_param("ii", $post_id, $term_taxonomy_id); $insert_relationship_sql->execute(); }
2. 处理文章标签(Post Tag)
标签的逻辑和分类几乎一样,只是分类法换成post_tag,而且标签通常是多个,所以可以循环处理:
// 定义要添加的标签数组 $tags = ['PHP', 'WordPress', '开发技巧']; $taxonomy = 'post_tag'; foreach ($tags as $tag_name) { // 检查标签是否存在 $check_tag_sql = $mysqli->prepare(" SELECT tt.term_taxonomy_id FROM {$table_prefix}terms t JOIN {$table_prefix}term_taxonomy tt ON t.term_id = tt.term_id WHERE t.name = ? AND tt.taxonomy = ? "); $check_tag_sql->bind_param("ss", $tag_name, $taxonomy); $check_tag_sql->execute(); $result = $check_tag_sql->get_result(); $term_taxonomy_id = null; if ($result->num_rows === 0) { // 标签不存在,插入wp_terms $tag_slug = strtolower(str_replace(' ', '-', $tag_name)); $insert_term_sql = $mysqli->prepare(" INSERT INTO {$table_prefix}terms (name, slug, term_group) VALUES (?, ?, 0) "); $insert_term_sql->bind_param("ss", $tag_name, $tag_slug); $insert_term_sql->execute(); $term_id = $mysqli->insert_id; // 插入wp_term_taxonomy $insert_taxonomy_sql = $mysqli->prepare(" INSERT INTO {$table_prefix}term_taxonomy (term_id, taxonomy, description, parent, count) VALUES (?, ?, '', 0, 0) "); $insert_taxonomy_sql->bind_param("ss", $term_id, $taxonomy); $insert_taxonomy_sql->execute(); $term_taxonomy_id = $mysqli->insert_id; } else { $row = $result->fetch_assoc(); $term_taxonomy_id = $row['term_taxonomy_id']; } // 关联文章和标签 if ($term_taxonomy_id) { $insert_relationship_sql = $mysqli->prepare(" INSERT INTO {$table_prefix}term_relationships (object_id, term_taxonomy_id, term_order) VALUES (?, ?, 0) ON DUPLICATE KEY UPDATE term_order = 0 "); $insert_relationship_sql->bind_param("ii", $post_id, $term_taxonomy_id); $insert_relationship_sql->execute(); } }
一些注意事项
- 记得替换
$table_prefix为你实际的WordPress表前缀(比如你的表是mywp_xxx就用mywp_) - 代码里用了
mysqli的预处理语句,尽量避免直接拼接SQL,防止注入风险 - 如果需要给分类设置父级,只需要在插入
wp_term_taxonomy时把parent参数改成父分类的term_id就行 - 插入后,
wp_term_taxonomy里的count字段WordPress会自动更新,不用手动维护
内容的提问来源于stack exchange,提问作者Oliverkahn
相关产品推荐
相关产品推荐

