
引言:理解用户与分类法的关联
在wordpress中,用户与分类法(如分类、标签或自定义分类法)的关联方式并非单一。通常存在两种主要情景:
- 间接关联:用户创作了属于某个分类法术语的文章。 这是最常见的关联方式,即用户通过发布文章、产品或其他自定义内容类型,而这些内容又被归类到特定的分类法术语下。在这种情况下,用户本身并未直接与分类法术语关联,而是通过其发布的内容建立联系。
- 直接关联:用户本身被直接关联到某个分类法术语。 这种情况通常出现在自定义的WordPress实现中。例如,开发者可能通过插件或主题代码,将用户ID作为wp_term_relationships表中的object_id,直接与某个分类法术语的term_taxonomy_id进行关联。这并非WordPress核心的默认行为,但通过自定义代码是可实现的。
本教程将针对这两种不同的关联场景,提供相应的WordPress编程方法,帮助您准确获取所需的用户列表。
方法一:通过用户发布的文章间接关联分类法
这种方法适用于查找那些发布了特定分类法下内容的用户的场景。它通过WordPress的get_users()和WP_Query功能来实现。
实现原理
核心思想是首先获取所有用户(或特定用户子集),然后对每个用户执行一个WP_Query,检查该用户是否发布了归属于目标分类法术语的内容。
示例代码
以下代码演示了如何获取所有用户,然后筛选出那些发布了特定产品分类下产品的用户。
'ID', // 按用户ID排序
'fields' => 'all_with_meta' // 获取所有用户数据,包括元数据
);
// 2. 获取所有WordPress用户
$users = get_users($user_args);
// 用于存储符合条件的用户ID
$associated_user_ids = array();
// 3. 遍历每个用户
foreach ($users as $user) {
// 4. 为每个用户创建一个WP_Query来检查其发布的文章
$user_posts = new WP_Query(array(
'post_type' => 'product', // 指定自定义文章类型,例如'product'
'author' => $user->ID, // 查询当前用户发布的文章
'posts_per_page' => 1, // 只需要检查是否存在,所以设置为1即可
'fields' => 'ids', // 只获取文章ID,提高效率
'tax_query' => array( // 分类法查询
array(
'taxonomy' => 'product_cat', // 指定自定义分类法别名,例如'product_cat'
'field' => 'term_id', // 根据术语ID进行查询
'terms' => 22 // 指定目标分类法术语的ID
)
)
));
// 5. 如果用户有发布符合条件的文章,则将其ID添加到列表中
if ($user_posts->have_posts()) {
$associated_user_ids[] = $user->ID;
// 示例:输出用户姓名和关联信息
// echo $user->first_name . ' ' . $user->last_name . ' 关联到分类法术语 22' . "
";
}
// 重置查询,以防影响后续的查询
wp_reset_postdata();
}
// 6. 输出所有关联的用户ID
if (!empty($associated_user_ids)) {
echo "与分类法术语 22 关联的用户ID列表:
";
echo implode(', ', $associated_user_ids);
} else {
echo "没有找到与分类法术语 22 关联的用户。";
}
?>优化:针对特定用户ID的查询
如果您已经有一个用户ID的子集,并且只想检查这些用户是否符合条件,可以使用get_users()函数的include参数来优化查询,避免遍历所有用户。
$specific_user_ids, // 只获取这些ID的用户
'fields' => 'all_with_meta'
);
$users = get_users($user_args);
$associated_user_ids = array();
// 3. 遍历这些特定用户,并检查其文章
foreach ($users as $user) {
$user_posts = new WP_Query(array(
'post_type' => 'product',
'author' => $user->ID,
'posts_per_page' => 1,
'fields' => 'ids',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => 22
)
)
));
if ($user_posts->have_posts()) {
$associated_user_ids[] = $user->ID;
}
wp_reset_postdata();
}
// 4. 输出结果
if (!empty($associated_user_ids)) {
echo "在指定用户中,与分类法术语 22 关联的用户ID列表:
";
echo implode(', ', $associated_user_ids);
} else {
echo "在指定用户中,没有找到与分类法术语 22 关联的用户。";
}
?>优缺点分析
-
优点:
- 完全使用WordPress的API,与WordPress核心逻辑一致,代码可读性好。
- 利用WP_Query的强大功能,可以轻松添加更多筛选条件(如文章状态、日期等)。
-
缺点:
- 性能问题: 对于拥有大量用户和文章的网站,为每个用户执行WP_Query可能会导致性能瓶颈,因为这会产生大量的数据库查询。
- 间接关联: 这种方法只能找到“发布了特定分类法下文章”的用户,而不是用户本身直接与分类法关联。
方法二:通过直接数据库查询获取用户与分类法的直接关联
这种方法适用于用户ID被自定义地存储在wp_term_relationships表中作为object_id,直接与分类法术语关联的情况。它直接使用WordPress的$wpdb对象执行SQL查询。
实现原理
使用$wpdb对象直接执行SQL查询,连接wp_users表和wp_term_relationships表。通过u.ID = r.object_id将用户与关系表关联,并根据r.term_taxonomy_id进行筛选,从而获取直接关联的用户ID。
示例代码
prepare(
"SELECT u.ID
FROM {$wpdb->users} u
INNER JOIN {$wpdb->term_relationships} r
ON u.ID = r.object_id
WHERE u.user_status = 0
AND r.term_taxonomy_id = %d",
1186 // 替换为您要查询的 term_taxonomy_id
);
$results = $wpdb->get_results($sql_query, ARRAY_A);
// 遍历查询结果,提取用户ID
foreach ($results as $id_array) {
$all_ids[] = $id_array['ID'];
}
// 输出所有关联的用户ID
if (!empty($all_ids)) {
echo "直接关联到分类法术语 ID (term_taxonomy_id) 1186 的用户ID列表:
";
echo implode(', ', $all_ids);
} else {
echo "没有找到直接关联到分类法术语 ID (term_taxonomy_id) 1186 的用户。";
}
?>优缺点分析
-
优点:
- 直接且高效: 精确匹配原始SQL查询的意图,直接从数据库获取数据,对于大规模数据查询通常更高效。
- 适用于自定义场景: 如果您的WordPress环境中有自定义逻辑,将用户ID直接关联到wp_term_relationships表,这是最直接的实现方式。
-
缺点:
- 绕过API: 直接操作数据库绕过了WordPress的抽象层,可能增加代码的维护难度,且对数据库结构有依赖。
- 兼容性风险: 如果WordPress未来改变了数据库表结构,直接SQL查询可能需要调整。
- 需要SQL知识: 开发者需要对SQL语言和WordPress数据库结构有一定了解。
- term_taxonomy_id: 需要使用term_taxonomy_id而非term_id。
选择合适的方案
- 如果您的需求是查找“发布了特定分类法下文章的用户”,并且用户数量或文章数量不是极其庞大以至于造成性能问题,推荐使用方法一(通过get_users()和WP_Query)。它更符合WordPress的编程范式,易于维护和扩展。
- 如果您的WordPress环境中存在自定义逻辑,将用户ID直接作为object_id存储在wp_term_relationships表中,并且需要精确匹配这种直接关联,那么方法二(直接数据库查询)是更直接且高效的选择。请务必确保您的自定义实现确实将用户ID存储在此处。
注意事项
- 性能考量: 方法一在处理大量用户时,由于循环内部的WP_Query可能导致效率不高。考虑使用缓存插件、对象缓存,或者在用户数量极大时,重新评估是否可以通过更优化的数据库查询来达到目的。
-
term_taxonomy_id与term_id:
- 在WP_Query的tax_query中,通常使用term_id来指定分类法术语。
- 在wp_term_relationships数据库表中,存储的是term_taxonomy_id。term_taxonomy_id是wp_term_taxonomy表中的ID,它唯一标识一个术语在一个特定分类法中的使用。一个term_id可能对应多个term_taxonomy_id(例如,如果同一个术语被用于不同的分类法)。请确保在相应的方法中使用正确的ID类型。
- 自定义类型: 示例代码中的post_type(如product)和taxonomy(如product_cat)需要根据您实际的自定义文章类型和自定义分类法别名进行修改。
- user_status: 在SQL查询中,u.user_status = 0通常表示正常用户。在PHP get_users中,可以通过role或其他参数进行用户筛选,以达到类似目的。
- 安全性: 直接使用$wpdb进行SQL查询时,务必使用$wpdb->prepare()函数来防止SQL注入攻击,确保查询参数的安全。
总结
获取与分类法关联的WordPress用户是一个常见的需求,但实现方式取决于“关联”的具体定义。本教程提供了两种主要方法:通过get_users()和WP_Query间接查找发布了特定分类法下内容的用户,以及通过$wpdb直接查询数据库来获取自定义直接关联的用户。理解每种方法的原理、优缺点和适用场景,可以帮助您选择最适合当前项目需求的解决方案,并确保代码的效率和可维护性。










