首页 > 解决方案 > WC:如何通过 billing_phone 或 billing_email 搜索客户

问题描述

在创建订单页面上存在搜索客户的输入。此输入按字段搜索客户:'user_login'、'user_url'、'user_email'、'user_nicename'、'display_name'

这是此处提供的信息:

wp-content/plugins/woocommerce/includes/data-stores/class-wc-customer-data-store.php

public function search_customers( $term, $limit = '' ) {
    $results = apply_filters( 'woocommerce_customer_pre_search_customers', false, $term, $limit );
    if ( is_array( $results ) ) {
        return $results;
    }
    error_log('search_customers NEXT STEP!!!');

    $query = new WP_User_Query(
        apply_filters(
            'woocommerce_customer_search_customers', array(
                'search'         => '*' . esc_attr( $term ) . '*',
                'search_columns' => array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name' ),
                'fields'         => 'ID',
                'number'         => $limit,
            ), $term, $limit, 'main_query'
        )
    );

    $query2 = new WP_User_Query(
        apply_filters(
            'woocommerce_customer_search_customers', array(
                'fields'     => 'ID',
                'number'     => $limit,
                'meta_query' => array(
                    'relation' => 'OR',
                    array(
                        'key'     => 'first_name',
                        'value'   => $term,
                        'compare' => 'LIKE',
                    ),
                    array(
                        'key'     => 'last_name',
                        'value'   => $term,
                        'compare' => 'LIKE',
                    ),
                ),
            ), $term, $limit, 'meta_query'
        )
    );
    error_log('search_customers - WHAT IS IT?');

    $results = wp_parse_id_list( array_merge( (array) $query->get_results(), (array) $query2->get_results() ) );

    if ( $limit && count( $results ) > $limit ) {
        $results = array_slice( $results, 0, $limit );
    }

    return $results;
}

我的问题是:如何将自己的列添加到 search_columns?我需要在此处添加“billing_phone”列。在实验期间,我在函数 search_customers(...) $query 中进行了更改,例如:

$query = new WP_User_Query(
        apply_filters(
            'woocommerce_customer_search_customers', array(
                'search'         => '*' . esc_attr( $term ) . '*',
                'search_columns' => array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name', 'billing_phone' ),
                'fields'         => 'ID',
                'number'         => $limit,
            ), $term, $limit, 'main_query'
        )
    );

这不是好方法,但我不知道我该怎么做。

但无论如何,这个“修复”是行不通的。

如何为搜索客户添加我自己的列?我可以通过另一列搜索客户,然后出现在 search_customers(...) 中吗?

标签: wordpresswoocommerce

解决方案


就我而言,我必须修改此搜索过滤器才能按客户身份号码进行搜索。但是,只能通过修改原始文件。在这种情况下,我不得不禁用 WooCommerce 更新。

所以第一个查询 $query = new WP_User_Query() 正在 wp_user 表中查找列值。但是,第二个查询在 wp_user_meta 中查找列值。因此,在我的情况下,代码如下(其中 billing_cedula_ruc 是我为每个客户端保存的用户元数据之一):

$query2 = new WP_User_Query(
        apply_filters(
            'woocommerce_customer_search_customers',
            array(
                'fields'     => 'ID',
                'number'     => $limit,
                'meta_query' => array(
                    'relation' => 'OR',
                    array(
                        'key'     => 'first_name',
                        'value'   => $term,
                        'compare' => 'LIKE',
                    ),
                    array(
                        'key'     => 'last_name',
                        'value'   => $term,
                        'compare' => 'LIKE',
                    ),
                    // K&I add search by client RUC
                    array(
                        'key'     => 'billing_cedula_ruc',
                        'value'   => $term,
                        'compare' => 'LIKE',
                    ),
                ),
            ),
            $term,
            $limit,
            'meta_query'
        )
    );

推荐阅读