
在wordpress开发中,我们经常需要根据用户的某些特性来筛选用户列表。其中一个常见的需求是获取与特定分类法(taxonomy)关联的用户。然而,wordpress核心系统并未直接提供用户与分类法之间的关联机制。通常,这种关联是通过用户发布的内容(如文章、自定义文章类型)来间接实现的。但在某些自定义场景下,用户id可能被直接关联到分类法。本文将深入探讨这两种情况下的实现方法。
在标准的WordPress实践中,用户通常通过其发布的文章、页面或自定义文章类型(Custom Post Type, CPT)与分类法建立间接关联。例如,如果一个用户发布了多篇属于“产品分类”中某个特定术语(Term)的文章,我们就可以认为该用户与该分类法术语相关联。
实现原理: 这种方法的核心是首先获取所有用户,然后遍历每个用户。对于每个用户,我们再执行一个 WP_Query 查询,检查该用户是否发布了任何属于指定分类法和术语的文章。
示例代码:
/**
* 获取发布了特定分类法术语文章的用户ID列表
*
* @param string $post_type 文章类型,默认为 'post'
* @param string $taxonomy 分类法别名,例如 'category', 'product_cat'
* @param int $term_id 分类法术语ID
* @return array 关联的用户ID数组
*/
function get_users_by_post_taxonomy($post_type = 'post', $taxonomy = 'category', $term_id) {
$associated_user_ids = [];
// 1. 获取所有用户
$all_users = get_users(array(
'fields' => 'ID', // 仅获取用户ID以优化性能
));
if (empty($all_users)) {
return $associated_user_ids;
}
// 2. 遍历每个用户,检查其是否发布了符合条件的文章
foreach ($all_users as $user_id) {
$user_posts_query = new WP_Query(array(
'post_type' => $post_type,
'author' => $user_id,
'posts_per_page' => 1, // 只需要检查是否存在,所以只获取一篇
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'term_id',
'terms' => $term_id,
),
),
'fields' => 'ids', // 仅获取文章ID以优化性能
'no_found_rows' => true, // 不需要分页信息
'update_post_term_cache' => false, // 不需要更新术语缓存
'update_post_meta_cache' => false, // 不需要更新元数据缓存
));
if ($user_posts_query->have_posts()) {
$associated_user_ids[] = $user_id;
}
wp_reset_postdata(); // 重置全局文章数据
}
return array_unique($associated_user_ids); // 确保返回唯一的用户ID
}
// 使用示例:获取发布了产品分类ID为22的“product”类型文章的用户
$users_with_product_category_22 = get_users_by_post_taxonomy('product', 'product_cat', 22);
if (!empty($users_with_product_category_22)) {
echo "与产品分类ID 22关联的用户ID列表:<br>";
echo implode(', ', $users_with_product_category_22);
} else {
echo "未找到与产品分类ID 22关联的用户。";
}代码解析:
注意事项:
在某些非标准或自定义的WordPress实现中,用户ID可能被直接存储在 wp_term_relationships 表中作为 object_id,从而直接与分类法术语关联。这通常发生在开发者通过自定义代码或插件扩展了WordPress核心功能时。WordPress核心默认不会将用户ID作为 object_id 存储在此表中。
实现原理: 直接使用 wpdb 对象执行SQL查询,连接 wp_users 表和 wp_term_relationships 表,以找出那些 object_id 与用户ID匹配,并且关联到特定 term_taxonomy_id 的用户。
示例代码:
/**
* 通过直接SQL查询获取与特定分类法术语关联的用户ID列表
* (适用于用户ID直接作为wp_term_relationships表object_id的自定义场景)
*
* @param int $term_taxonomy_id 要查询的term_taxonomy_id
* @return array 关联的用户ID数组
*/
function get_users_by_direct_taxonomy_sql($term_taxonomy_id) {
global $wpdb;
$associated_user_ids = [];
// 构建SQL查询
// 注意:wp_users.user_status 字段在现代WordPress版本中已废弃,通常为0表示活跃用户。
// 如果您的系统中有其他用户状态,请相应调整 WHERE 子句。
$sql_query = $wpdb->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",
$term_taxonomy_id
);
// 执行查询并获取结果
$results = $wpdb->get_results($sql_query, ARRAY_A);
// 提取用户ID
if (!empty($results)) {
foreach ($results as $row) {
$associated_user_ids[] = (int)$row['ID'];
}
}
return $associated_user_ids;
}
// 使用示例:获取与term_taxonomy_id为1186关联的用户
$users_with_direct_taxonomy_1186 = get_users_by_direct_taxonomy_sql(1186);
if (!empty($users_with_direct_taxonomy_1186)) {
echo "与term_taxonomy_id 1186直接关联的用户ID列表:<br>";
echo implode(', ', $users_with_direct_taxonomy_1186);
} else {
echo "未找到与term_taxonomy_id 1186直接关联的用户。";
}代码解析:
注意事项:
在WordPress中获取与分类法关联的用户列表,主要取决于您如何定义这种“关联”:
基于用户发布内容的关联(方法一):
基于直接数据库关联(方法二):
在大多数情况下,我们推荐优先使用方法一。它更符合WordPress的开发范式,并且更容易理解和维护。只有在明确知道有自定义数据库关联且性能要求极高时,才考虑方法二。无论选择哪种方法,都应充分测试代码,并根据实际环境进行性能优化。
以上就是WordPress中检索与分类法关联的用户ID:基于内容与直接关联的两种实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号