从wordPress分类法中获取关联用户列表的两种策略。本教程将深入探讨如何在wordpress中获取与特定分类法相关的用户列表。我们将介绍两种主要方法:一是通过迭代用户并查询其关联文章的分类法,适用于查找发布了特定分类文章的用户;二是通过直接sql查询wp_term_relationships表,适用于查找那些在非标准或自定义实现中直接与分类法关联的用户ID。
在wordpress开发中,有时我们需要识别与特定分类法(如分类、标签或自定义分类法)相关的用户。然而,wordpress核心功能并没有直接提供 get_user_by_taxonomy() 这样的函数。用户与分类法的关联通常是间接的,例如通过用户发布的文章。本文将详细介绍两种实现此目标的方法,并探讨它们的适用场景与注意事项。
方法一:通过用户发布的文章关联分类法
这种方法是WordPress生态系统中最常见且符合常规逻辑的用户与分类法关联方式。其核心思想是:首先获取所有用户,然后对每个用户执行一个 WP_Query 查询,以判断该用户是否发布了属于特定分类法的文章。
1. 工作原理
此方法通过以下步骤实现:
- 使用 get_users() 函数获取所有或部分用户。
- 遍历这些用户。
- 对于每个用户,构造一个 WP_Query 对象,该查询会筛选出由当前用户发布、且属于指定文章类型和特定分类法(及其术语ID)的文章。
- 如果 WP_Query 返回了文章,则说明该用户与该分类法间接关联。
2. 示例代码
以下代码演示了如何查找发布了特定自定义文章类型(例如 product)且关联到特定分类法(例如 product_cat,术语ID为 22)的用户:
<?php // 定义用户查询参数 $user_args = array( 'orderby' => 'ID', // 按用户ID排序 // 'include' => array(11, 33, 52), // 如果只需要检查特定用户,可以取消注释并在此处添加用户ID ); // 获取所有(或指定)用户 $users = get_users( $user_args ); // 用于存储符合条件的用户ID $associated_user_ids = array(); if ( ! empty( $users ) ) { foreach ( $users as $user ) { // 为每个用户构建文章查询 $user_posts_query = new WP_Query( array( 'post_type' => 'product', // 替换为你的自定义文章类型 'author' => $user->ID, // 查询当前用户发布的文章 'posts_per_page' => 1, // 只需要检查是否存在一篇文章,所以设为1 'tax_query' => array( array( 'taxonomy' => 'product_cat', // 替换为你的自定义分类法slug 'field' => 'term_id', // 根据术语ID查询 'terms' => 22, // 替换为你的目标分类法术语ID ), ), 'fields' => 'ids', // 仅获取文章ID,提高效率 ) ); // 如果用户发布了符合条件的文章 if ( $user_posts_query->have_posts() ) { $associated_user_ids[] = $user->ID; // 示例:输出用户信息 // echo $user->first_name . ' ' . $user->last_name . ' 关联到分类法术语ID 22<br>'; } // 重置文章查询,防止对后续查询产生影响 wp_reset_postdata(); } } // 输出所有关联的用户ID if ( ! empty( $associated_user_ids ) ) { echo '与分类法术语ID 22关联的用户ID:' . implode( ', ', $associated_user_ids ) . '<br>'; } else { echo '未找到与分类法术语ID 22关联的用户。<br>'; } ?>
3. 适用场景与注意事项
- 适用场景: 当你需要查找那些通过发布特定分类法下的文章而与该分类法产生关联的用户时,此方法是首选。
- 性能考量: 对于拥有大量用户和文章的网站,此方法可能会导致性能问题,因为它会为每个用户执行一次 WP_Query。可以考虑缓存结果,或者在用户数量巨大时结合其他优化手段。
- 灵活性: 可以轻松调整 post_type、taxonomy 和 terms 参数来适应不同的业务需求。
方法二:直接通过数据库查询用户与分类法的关联
在某些特定或自定义的WordPress实现中,用户ID可能被直接存储在 wp_term_relationships 表的 object_id 字段中,从而与某个分类法术语建立直接关联。这通常不是WordPress的默认行为,但如果你的系统有这样的定制,直接的SQL查询会是更高效的解决方案。
1. 工作原理
此方法直接利用WordPress的全局 $wpdb 对象执行SQL查询,连接 wp_users 表和 wp_term_relationships 表,以查找 object_id 等于用户ID且 term_taxonomy_id 符合条件的记录。
2. 示例代码
假设你的系统将用户ID u.ID 作为 wp_term_relationships 表中的 r.object_id 存储,并且用户状态 u.user_status 为 0(通常表示活跃用户),目标分类法术语的 term_taxonomy_id 为 1186:
<?php global $wpdb; // 用于存储符合条件的用户ID $all_ids = array(); // 执行SQL查询,查找直接关联到特定分类法术语的用户 $results = $wpdb->get_results( "SELECT u.ID FROM {$wpdb->users} AS u INNER JOIN {$wpdb->term_relationships} AS r ON u.ID = r.object_id WHERE u.user_status = 0 AND r.term_taxonomy_id = 1186", // 替换为你的目标 term_taxonomy_id ARRAY_A // 以关联数组形式返回结果 ); // 遍历查询结果,提取用户ID if ( ! empty( $results ) ) { foreach ( $results as $id_array ) { $all_ids[] = $id_array['ID']; } } // 输出所有关联的用户ID if ( ! empty( $all_ids ) ) { echo '直接关联到分类法术语ID 1186的用户ID:' . implode( ', ', $all_ids ) . '<br>'; } else { echo '未找到直接关联到分类法术语ID 1186的用户。<br>'; } ?>
3. 适用场景与注意事项
- 适用场景: 当你确信用户ID被直接存储在 wp_term_relationships.object_id 字段中,并且需要高效地获取这些用户时。这通常发生在自定义的用户角色/权限系统、会员插件或特定数据模型中。
- 非标准用法: 强调这是对 wp_term_relationships 表的非标准用法。在WordPress默认设置中,object_id 通常指向文章、页面或自定义文章类型的ID,而非用户ID。使用此方法前务必确认你的数据库结构。
- 效率: 直接的SQL查询通常比迭代 WP_Query 更高效,因为它直接在数据库层面进行连接和过滤。
- 安全性: 在构造SQL查询时,务必注意SQL注入风险。对于动态参数,应使用 $wpdb-youjiankuohaophpcnprepare() 进行安全处理。本示例中的 term_taxonomy_id 是硬编码的,所以风险较低。
- 维护性: 如果你的WordPress核心或插件更新改变了相关的数据库结构,此方法可能需要相应调整。
总结与选择建议
选择哪种方法取决于你的具体需求和WordPress站点的实现方式:
- 如果你想查找那些发布了特定分类法下文章的用户,请使用方法一(get_users() + WP_Query)。这是更符合WordPress常规开发实践的方式,易于理解和维护,但对于大量数据可能存在性能瓶颈。
- 如果你明确知道用户ID被直接作为 wp_term_relationships 表的 object_id 存储,并且追求最高效率,请使用方法二(直接SQL查询)。但请务必了解这是一种非标准的数据库关联方式,需要谨慎验证和维护。
无论选择哪种方法,都应根据实际情况调整代码中的占位符(如文章类型、分类法slug、术语ID等),并考虑结果缓存以优化性能。
以上就是从WordPress分类法中获取关联用户列表的两种策略的详细内容,更多请关注php中文网其它相关文章!
评论(已关闭)
评论已关闭