Php 如何使用WP\u User\u查询处理序列化数据

Php 如何使用WP\u User\u查询处理序列化数据,php,wordpress,serialization,Php,Wordpress,Serialization,我尝试在Wordpress中扩展自定义用户搜索;也就是说,我想按城市、州和国家搜索用户,但这些数据是序列化的。 我的例子 元键:饼图地址3 meta_值:a:6:{s:7:“地址”;s:18:“纽约街,4”;s:8:“地址2”;s:0:;s:4:“城市”;s:5:“威尼斯”;s:5:“州”;s:7:“维琴察”;s:3:“邮政编码”;s:5:“36015”;s:7:“国家”;s:5:“意大利”} 以下是我想做的: $my_users = new WP_User_Query( array


我尝试在Wordpress中扩展自定义用户搜索;也就是说,我想按城市、州和国家搜索用户,但这些数据是序列化的。 我的例子
元键:
饼图地址3

meta_值:
a:6:{s:7:“地址”;s:18:“纽约街,4”;s:8:“地址2”;s:0:;s:4:“城市”;s:5:“威尼斯”;s:5:“州”;s:7:“维琴察”;s:3:“邮政编码”;s:5:“36015”;s:7:“国家”;s:5:“意大利”}

以下是我想做的:

$my_users = new WP_User_Query(
      array( 
        'role' => $role,
        'search' => '*' . $search . '*',
        'search_columns' => array(
            'user_login',
            'user_nicename',
            'user_email',
            'user_url',
            'display_name'
        ),
        'meta_query' => array(
              'key'     => 'pie_address_3',
              'value'   => $search,
              'compare' => 'LIKE'
          )
      ));
但是,当我键入某个国家或城市(我知道它与某个用户关联)时,搜索结果将不返回任何内容。我该怎么办?谢谢

更新

我已经更新了
WP\u User\u查询
,如下所示:

$args = array(
            'meta_key' => 'pie_address_3'
        );
        $query = new WP_User_Query($args);

        $authors = $query->get_results();

        foreach ($authors as $author){
            $c = get_user_meta($author->id,'pie_address_3',true);
            if(isset($c)){
                if(empty(get_user_meta($author->id,'address',true))){
                   add_user_meta($author->ID,'address',$c['address']); 
                }
                if(empty(get_user_meta($author->id,'address2',true))){
                   add_user_meta($author->ID,'address2',$c['address2']); 
                }
                if(empty(get_user_meta($author->id,'city',true))){
                   add_user_meta($author->ID,'city',$c['city']); 
                }
                if(empty(get_user_meta($author->id,'state',true))){
                   add_user_meta($author->ID,'state',$c['state']); 
                }
                if(empty(get_user_meta($author->id,'zip',true))){
                   add_user_meta($author->ID,'zip',$c['zip']); 
                }
                if(empty(get_user_meta($author->id,'country',true))){
                   add_user_meta($author->ID,'country',$c['country']); 
                };
                //delete_user_meta($author->ID,'pie_address_3',$c);
            }
        }

        $my_users = new WP_User_Query(
          array( 
            'role' => $role,
            'search' => '*' . $search . '*',
            'search_columns' => array(
                'user_login',
                'user_nicename',
                'user_email',
                'user_url',
                'display_name'
            ),
            'meta_query' => array(
                'relation' => 'OR',
                array(
                  'key'     => 'address',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'address2',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'city',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'state',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'zip',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'country',
                  'value'   => $search,
                  'compare' => 'LIKE'
                )
              )
          )
        );
WHERE (
    user_login LIKE '%$search%' OR 
    user_nicename LIKE '%$search%' OR 
    user_email LIKE '%$search%' OR 
    user_url LIKE '%$search%'
    ) AND (
    wp_usermeta.meta_key = 'pie_address_3' AND 
    CAST(wp_usermeta.meta_value AS CHAR) LIKE '%$search%'
)
但它仍然不起作用。我哪里做错了?

更新答案 我意识到您需要在
pie\u address\u 3
字段或其他至少一列中查找包含字符串
$search
的用户

不幸的是,
WP\u User\u Query
似乎不允许列和元字段之间存在关系。事实上,结果查询的“条件”部分如下所示:

$args = array(
            'meta_key' => 'pie_address_3'
        );
        $query = new WP_User_Query($args);

        $authors = $query->get_results();

        foreach ($authors as $author){
            $c = get_user_meta($author->id,'pie_address_3',true);
            if(isset($c)){
                if(empty(get_user_meta($author->id,'address',true))){
                   add_user_meta($author->ID,'address',$c['address']); 
                }
                if(empty(get_user_meta($author->id,'address2',true))){
                   add_user_meta($author->ID,'address2',$c['address2']); 
                }
                if(empty(get_user_meta($author->id,'city',true))){
                   add_user_meta($author->ID,'city',$c['city']); 
                }
                if(empty(get_user_meta($author->id,'state',true))){
                   add_user_meta($author->ID,'state',$c['state']); 
                }
                if(empty(get_user_meta($author->id,'zip',true))){
                   add_user_meta($author->ID,'zip',$c['zip']); 
                }
                if(empty(get_user_meta($author->id,'country',true))){
                   add_user_meta($author->ID,'country',$c['country']); 
                };
                //delete_user_meta($author->ID,'pie_address_3',$c);
            }
        }

        $my_users = new WP_User_Query(
          array( 
            'role' => $role,
            'search' => '*' . $search . '*',
            'search_columns' => array(
                'user_login',
                'user_nicename',
                'user_email',
                'user_url',
                'display_name'
            ),
            'meta_query' => array(
                'relation' => 'OR',
                array(
                  'key'     => 'address',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'address2',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'city',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'state',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'zip',
                  'value'   => $search,
                  'compare' => 'LIKE'
                ),
                array(
                  'key'     => 'country',
                  'value'   => $search,
                  'compare' => 'LIKE'
                )
              )
          )
        );
WHERE (
    user_login LIKE '%$search%' OR 
    user_nicename LIKE '%$search%' OR 
    user_email LIKE '%$search%' OR 
    user_url LIKE '%$search%'
    ) AND (
    wp_usermeta.meta_key = 'pie_address_3' AND 
    CAST(wp_usermeta.meta_value AS CHAR) LIKE '%$search%'
)
请注意,位于这两个部分之间

有一个钩子
pre\u user\u query
,它在解析
WP\u user\u query
之后和执行查询之前触发,通过引用传递当前
WP\u user\u query
实例。因此,我们可以截取并将其更改为,方法是将此代码包含到我们的
functions.php
文件中:

add_action('pre_user_query', 'my_custom_users_search');
function my_custom_users_search( $args ) {
    $args->query_where = str_replace(') AND (', ') OR (', $args->query_where);
}
这将使以下查询工作正常:

$my_users = new WP_User_Query(
    array(
        'role'   => $role,
        'search' => '*' . $search . '*',
        'search_columns' => array(
            'user_login',
            'user_nicename',
            'user_email',
            'user_url',
            'display_name'
        ),
        'meta_key'     => 'pie_address_3',
        'meta_value'   => $search,
        'meta_compare' => 'LIKE'
    )
);
警告:上一个操作功能可能会影响每个
WP\u用户查询
调用

为了防止出现这种情况,我们可以将一个伪参数传递给
WP\u User\u Query
函数,并仅在传递该参数的情况下更改中的。这是一个带有
and2or
伪参数的查询:

$my_users = new WP_User_Query(
    array(
        'and2or' => 1,
        'role'   => $role,
        'search' => '*' . $search . '*',
        'search_columns' => array(
            'user_login',
            'user_nicename',
            'user_email',
            'user_url',
            'display_name'
        ),
        'meta_key'     => 'pie_address_3',
        'meta_value'   => $search,
        'meta_compare' => 'LIKE'
    )
);
这是动作功能:

add_action('pre_user_query', 'my_custom_users_search');
function my_custom_users_search( $args ) {
    if( isset( $args->query_vars['and2or'] ) )
        $args->query_where = str_replace(') AND (', ') OR (', $args->query_where);
}

旧答案 这是搜索序列化元字段的查询(不需要像更新时那样拆分它):

您在查询中搜索
$search
,甚至在
搜索列
参数中指定的字段上也是如此。

试试这个

$user_query = new WP_User_Query( array( 'meta_key' => 'pie_address_3', 'meta_value' => $keyword, 'meta_compare' => 'LIKE' ) );


compare (string) - Operator to test. Possible values are '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', and 'NOT EXISTS'. Default value is '='.
$user\u query=new WP\u user\u query(数组('meta\u key'=>'pie\u address\u 3','meta\u value'=>$关键字,'meta\u compare'=>'LIKE');
比较(字符串)-要测试的运算符。可能的值为“=”、“!=”、“>”、“>=”、“