【问题标题】:how to handle serialized data with WP_User_Query如何使用 WP_User_Query 处理序列化数据
【发布时间】:2015-04-01 20:33:54
【问题描述】:


我正在尝试在 Wordpress 中扩展自定义用户搜索;即,我想按城市、州和国家搜索用户,但这些数据是序列化的。 我的例子
元密钥:pie_address_3;
元值:a:6:{s:7:"address";s:18:"New York Street, 4";s:8:"address2";s:0:"";s:4:"city";s:5:"Venice";s:5:"state";s:7:"Vicenza";s:3:"zip";s:5:"36015";s:7:"country";s:5:"Italy";}

这是我想要做的:

$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_User_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'
                )
              )
          )
        );

但是,它仍然不起作用。我哪里做错了?

【问题讨论】:

    标签: php wordpress serialization


    【解决方案1】:

    更新答案

    我意识到您需要在至少一个其他列中的pie_address_3 字段OR 中找到包含字符串$search 的用户。

    不幸的是,WP_User_Query 似乎不允许列和元字段之间的 OR 关系。事实上,结果查询的“条件”部分是这样的:

    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%'
    )
    

    注意两部分之间的AND

    有一个钩子pre_user_query 在解析WP_User_Query 之后触发,在执行查询之前,它通过引用传递当前的WP_User_Query 实例。因此,我们可以截取该 AND 并将其更改为 OR,方法是将这段代码包含到我们的 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_User_Query调用!

    为了防止我们可以将一个虚拟参数传递给WP_User_Query 函数,并且只有在传递该参数时才更改OR 中的AND。所以这是带有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);
    }
    

    旧答案

    这是搜索序列化元字段的查询(无需拆分它,就像您在更新时所做的那样):

    $my_users = new WP_User_Query(
        array(
            'role'         => $role,
            'meta_key'     => 'pie_address_3',
            'meta_value'   => $search,
            'meta_compare' => 'LIKE'
        )
    );
    

    通过您的查询,您甚至在 search_columns 参数中指定的字段上搜索 $search

    【讨论】:

      【解决方案2】:

      试试这个

      $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 '='.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        相关资源
        最近更新 更多