在我之前的问题之后,我有一个问题:Allow search using billing email in WooCommerce Admin Orders list

以下是我将邮箱和邮箱显示为MD5、电话号码和支付网关名称的代码:

add_filter( 'manage_edit-shop_order_columns', 'add_custom_columns_to_admin_orders', 20);
function add_custom_columns_to_admin_orders( $columns ) {
    $new_columns = array();
    foreach ( $columns as $column_name => $column_info ) {
        $new_columns[ $column_name ] = $column_info;

        if ( 'order_total' === $column_name ) {
            $new_columns['order_md5_email'] = __( 'MD5 Email Address', 'my-textdomain' );
            $new_columns['order_email'] = __( 'Email Address', 'my-textdomain' );
            $new_columns['order_customers_phone'] = __( 'Customers Phone', 'my-textdomain' );
            $new_columns['order_payment'] = __( 'Payment Method', 'my-textdomain' );
        }
    }
    return $new_columns;
}


add_action( 'manage_shop_order_posts_custom_column', 'custom_columns_content_in_admin_orders' );
function custom_columns_content_in_admin_orders( $column ) {
    global $post, $the_order;
    if ( 'order_md5_email' === $column ) {
        if ( $the_order->has_status( array('completed') ) ) {
            $email_address = $the_order->get_billing_email();
            $email_address = md5($email_address);
            echo '<span class="order_complete"> '.$email_address.' </span>';
        } else {
            echo '<span class="order_not_complete">This Order is Not Completed!</span>';
        }
    }
    
    if ( 'order_email' === $column ) {
        if ( $the_order->has_status( array('completed') ) ) {
            $email_address = $the_order->get_billing_email();
            echo '<span class="order_complete"> '.$email_address.' </span>';
        } else {
            echo '<span class="order_not_complete">This Order is Not Completed!</span>';
        }
    }
    
    if ( 'order_customers_phone' === $column ) {
        echo '<label for="billing_phone" class="label-billing-email">Customer Phone Number:  </label>';
        echo '<input type="text" name="billing_phone" value="' . $the_order->get_billing_phone() . '" readonly />';
    }
    
    if ( 'order_payment' === $column ) {
        echo $the_order->get_payment_method_title();
    }
}

此代码还用于过滤管理订单页面上的搜索:

add_filter( 'woocommerce_shop_order_search_fields', 'extending_admin_orders_search_field', 10, 1 );
function extending_admin_orders_search_field( $meta_keys ){
    $meta_keys[] = '_billing_email';
    $meta_keys[] = '_billing_phone';
    $meta_keys[] = '_payment_method_title';

    return $meta_keys;
}

现在我遇到的问题是,当我在管理订单页面中搜索值时,如果我搜索邮箱的MD5,它将显示在结果中,就像简单的电话号码和邮箱以及支付网关的名称一样,显示没有任何问题.

我认为以下两种方法都是适用的:

  1. 在创建搜索筛选器之前,使用邮箱并生成MD5或我想要的更改(例如,此部分$meta_keys[] = '_billing_email';应更改为此值==&gt;$meta_keys[] = md5('_billing_email');).
  2. 保存自定义元数据,然后在搜索过滤器中调用此自定义元数据,就像亲爱的杰克在回答我的问题时给出的电话号码、邮箱地址和支付网关的名称一样.

如果你能在这两种情况下给我指点,并举个例子,我将不胜感激.

推荐答案

首先,您需要在 checkout 后创建订单时将email md5保存为自定义元数据:

add_action( 'woocommerce_checkout_create_order', 'save_billing_email_md5', 20, 2 );
function save_billing_email_md5( $order, $data ) {
    if( $billing_email = $order->get_billing_email() ) {
        $order->add_meta_data('_billing_email_md5', md5($billing_email));
    }
}

然后,在管理中手动创建/更新订单时,还要添加以下内容:

add_action( 'woocommerce_process_shop_order_meta', 'admin_save_billing_email_md5' );
function admin_save_billing_email_md5( $order_id ) {

    if( $billing_email = get_post_meta($order_id, '_billing_email', true) ) {
        update_post_meta($order_id, '_billing_email_md5', md5($billing_email));
    }
}

然后将功能extending_admin_orders_search_field()替换为:

add_filter( 'woocommerce_shop_order_search_fields', 'extending_admin_orders_search_field', 10, 1 );
function extending_admin_orders_search_field( $meta_keys ){
    $meta_keys[] = '_billing_email';
    $meta_keys[] = '_billing_phone';
    $meta_keys[] = '_payment_method_title';
    $meta_keys[] = '_billing_email_md5'; // <=== HERE

    return $meta_keys;
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

这将仅适用于将帐单邮箱MD5设置为自定义元数据的订单.

Php相关问答推荐

在PHP中结合每周日程安排和特殊日子查找下一个可用日期

编写WooCommerce多步骤签出

在WooCommerce我的帐户部分添加带有自定义链接的自定义菜单项

多行PHP属性声明中是否允许单行注释

从WooCommerce订单状态更改更新用户自定义元数据

将SVG包含在另一个php生成的SVG中

这是在可召回的背景下吗?

PHP:使用FORT从数据库获取USERS表到AUTH表

获取作者';在WordPress中使用PHP

PHP 数组中第一级 node 到 XML 的唯一名称

多个产品类别 Select 自定义 WooCommerce 插件设置页面

在 Heroku 上部署 Sylius - 路由不正确

Woocommerce注册中的自定义复选框验证错误提示问题

在WooCommerce中显示 checkout 的高级自定义字段(Advanced Custom Fields)并保存其值

如何在 laravel 中的同一个 slug 上显示不同的内容?

服务器遇到内部错误或配置错误,无法完成您的请求

为什么在 phpunit 的开头测试 PHP_VERSION?

如何限制for循环php中的条目数

来自命令行的 PHP 没有给出正确的结果

PHP获取根据辞职日期自动续订的合同终止日期