WordPress,在user_meta中获取与逗号分隔值字符串完全匹配的用户

时间:2021-01-16 作者:Mike Smith

我将数据保存在用户_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

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

You can\'t do this in a query with that kind of data.

真正做到这一点的唯一方法是检索所有用户,并在PHP中手动处理他们以找到ID。否则,您将得到误报,如您给出的示例。

根本问题是数据的存储方式。还有其他几种选择:

存储每个areapref 作为一个单独的键/值对,请记住元键不是唯一的,您可以使用同一个键添加多个值。只需设置get_user_metafalse 它将返回array 而不是单个值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个拥有该用户元集的用户,为这些用户创建新数据,删除您查询的旧元,然后重新加载页面,直到它说找不到为止。

相关推荐

在WordPress上使用ElasticSearch

我是个傻瓜,所以感谢你的耐心:-)我正在尝试使用ElasticSearch和使用ElasticPress插件的Wordpress安装。所有配置和生产中。到目前为止取得了惊人的成绩。我对所有ES的使用位置感到困惑。“默认情况下,它仅在搜索页上工作。如果要使用它处理任何其他页,或索引、循环、主页、存档、税务(WP\\U查询),则必须添加到查询中:”“ep\\U integrate”“=>true”有人能帮我用代码片段实现这个吗?谢谢