在wordpress中,用户与分类法(如分类、标签或自定义分类法)的关联方式并非单一。通常存在两种主要情景:
- 间接关联:用户创作了属于某个分类法术语的文章。 这是最常见的关联方式,即用户通过发布文章、产品或其他自定义内容类型,而这些内容又被归类到特定的分类法术语下。在这种情况下,用户本身并未直接与分类法术语关联,而是通过其发布的内容建立联系。
- 直接关联:用户本身被直接关联到某个分类法术语。 这种情况通常出现在自定义的WordPress实现中。例如,开发者可能通过插件或主题代码,将用户ID作为wp_term_relationships表中的object_id,直接与某个分类法术语的term_taxonomy_id进行关联。这并非WordPress核心的默认行为,但通过自定义代码是可实现的。
本教程将针对这两种不同的关联场景,提供相应的WordPress编程方法,帮助您准确获取所需的用户列表。
方法一:通过用户发布的文章间接关联分类法这种方法适用于查找那些发布了特定分类法下内容的用户的场景。它通过WordPress的get_users()和WP_Query功能来实现。
实现原理核心思想是首先获取所有用户(或特定用户子集),然后对每个用户执行一个WP_Query,检查该用户是否发布了归属于目标分类法术语的内容。
示例代码以下代码演示了如何获取所有用户,然后筛选出那些发布了特定产品分类下产品的用户。
<?php // 1. 定义获取用户的参数 $user_args = array( 'orderby' => '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' . "<br>"; } // 重置查询,以防影响后续的查询 wp_reset_postdata(); } // 6. 输出所有关联的用户ID if (!empty($associated_user_ids)) { echo "与分类法术语 22 关联的用户ID列表:<br>"; echo implode(', ', $associated_user_ids); } else { echo "没有找到与分类法术语 22 关联的用户。"; } ?>优化:针对特定用户ID的查询
如果您已经有一个用户ID的子集,并且只想检查这些用户是否符合条件,可以使用get_users()函数的include参数来优化查询,避免遍历所有用户。
<?php // 1. 定义要检查的用户ID列表 $specific_user_ids = array(11, 33, 52, 57, 997); // 替换为您要检查的用户ID // 2. 获取这些特定的用户 $user_args = array( '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列表:<br>"; 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。
示例代码<?php global $wpdb; // 获取WordPress数据库操作对象 // 用于存储所有关联的用户ID $all_ids = array(); // 执行SQL查询来获取直接关联的用户ID // 注意:这里的SQL查询假设用户ID被存储在wp_term_relationships.object_id中 $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", 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列表:<br>"; 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-youjiankuohaophpcnprepare()函数来防止SQL注入攻击,确保查询参数的安全。
获取与分类法关联的WordPress用户是一个常见的需求,但实现方式取决于“关联”的具体定义。本教程提供了两种主要方法:通过get_users()和WP_Query间接查找发布了特定分类法下内容的用户,以及通过$wpdb直接查询数据库来获取自定义直接关联的用户。理解每种方法的原理、优缺点和适用场景,可以帮助您选择最适合当前项目需求的解决方案,并确保代码的效率和可维护性。
以上就是获取与特定分类法关联的WordPress用户列表教程的详细内容,更多请关注知识资源分享宝库其它相关文章!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。