我将数据保存在用户_meta->;areapref字段。它基本上是一个由逗号分隔的post ID组成的字符串(例如2、37、200、300等)
我需要检查用户在此字段中是否有特定ID。如果是这样。。。做些事情。
我可以使用LIKE检查areapref中是否有ID。但我认为这有一个问题。如果一个位置ID=10,另一个位置ID=100,则两者都将与1或10匹配?还是我误会了。我担心CONTAIN也会有同样的问题。
我需要知道如何获取在areapref字符串中具有“精确匹配”的用户列表?所以搜索ID 2,只会返回2,而不是22,或20,200等。我花了几个小时浏览stackexchange/溢出/wp codex,但找不到答案。。。虽然我很笨!
这里有足够的代码,我希望显示我目前正在做什么。。。非常感谢您的任何想法。
function ds_notify_new_event( $post_ID ){
$url = get_permalink( $post_ID );
$event = get_the_title( $post_ID );
$localeID = get_post_field( \'location_id\', $post_ID);
global $wpdb;
$locale = $wpdb->get_var( $wpdb->prepare(
" SELECT post_id FROM {$wpdb->prefix}em_locations WHERE ID = %d ",
$localeID ) );
$args = array(
\'role\' => \'subscriber\',
\'meta_query\' => array(
array( \'key\' => \'areapref\', \'value\' => $locale, \'compare\' => \'LIKE\' ),
// just checks usr is ok with email
array( \'key\' => \'notify\', \'value\' => \'yes\', \'compare\' => \'=\' )
),
\'fields\' => array( \'display_name\', \'user_email\' )
);
// retrieve users to notify about the new post
$users = get_users( $args );
// do stuff with users
最合适的回答,由SO网友:Tom J Nowell 整理而成
You can\'t do this in a query with that kind of data.
真正做到这一点的唯一方法是检索所有用户,并在PHP中手动处理他们以找到ID。否则,您将得到误报,如您给出的示例。
根本问题是数据的存储方式。还有其他几种选择:
存储每个areapref
作为一个单独的键/值对,请记住元键不是唯一的,您可以使用同一个键添加多个值。只需设置get_user_meta
到false
它将返回array
而不是单个值分类法术语通过跟踪帖子ID用于帖子,但它们可以用于任何类型的ID。Comment Category
, User Tags
, 都是有效的分类法user
作为调用时的第二个参数register_taxonomy
, 请注意,要获得WP管理UI,需要一些额外的样板文件(see Justin Tadlocks article on user taxonomies for code )如果您使用个人用户元,您的get_users
通话(实际上是WP_User_Query
包装在中间人助手功能中),将更加直接。
如果您使用用户分类法,那么您还将看到显著的性能和可伸缩性改进。Meta在数据库中进行了优化,用于您已经知道帖子/用户ID的查询。Meta表在执行搜索和筛选时的性能很差。您将使用与检索post terms(又名)时相同的方法来检索用户get_terms
检索与该位置匹配的术语,其中所有术语都有一个与em_locations
表,然后get_objects_in_term
检索用户ID。
我意识到,您可能已经将控制权交给了核心数据存储的ACF等框架,从而使自己陷入了困境。这些框架通常提供过滤器,可以帮助更改字段的数据存储和检索方式,但您需要向ACF社区寻求帮助。
此外,您还需要迁移数据。这应该相对容易,只需创建一个循环,获取50个拥有该用户元集的用户,为这些用户创建新数据,删除您查询的旧元,然后重新加载页面,直到它说找不到为止。