添加不存在的订单元数据以扩展 WooCommerce 管理订单对特定产品的搜索

2024-03-17

继我之前的问题之后,我还有一个问题:添加不存在的订单元数据以扩展 WooCommerce 管理订单搜索 https://stackoverflow.com/questions/77206771/add-unexisting-order-metadata-to-extend-woocommerce-admin-orders-search

我有两个问题:

First:如果我希望只有当客户购买了ID为120和260的两个产品时才保存这个md5值,该怎么办? (即当支付成功并完成购买时,如果ID为120和260的这两个产品之一或两个产品都在客户的(成功)订单中,则应存储此md5值)

  • 对于这个问题的一个额外请求,可以检查一下这个客户之前是否保存过这个md5值,新的值会被保存吗?因为md5码是根据邮箱创建的,对于特定邮箱的客户来说,肯定会得到重复的金额。

Second:如何执行以下代码或在订购两个特定产品(例如 ID 为 120 和 260)后执行一段 PHP 代码?

$pro_message = 'Hi dear'
echo $pro_message. 'custom php code';

To make “只有当这个md5值被保存时”特定产品在购物车(或订单商品)中,我们需要一个可重用的条件函数来检查商品:

// Conditional function: Check if specific products are in cart or order items
function has_items_for_email_md5( $object_items ) {
    $found_120 = $found_260 = false; // Initializing
    
    foreach ( $object_items as $item ) {
        $product_id   = isset($item['product_id'])   ? $item['product_id']   : $item->get_product_id();
        $variation_id = isset($item['variation_id']) ? $item['variation_id'] : $item->get_variation_id();

        if ( in_array('120', [$product_id , $variation_id]) ) $found_120 = true;
        if ( in_array('260', [$product_id , $variation_id]) ) $found_260 = true;
    }
    return ( $found_120 && $found_260 );
}

现在我们可以对之前的代码进行一些小的更改,这将使用这个条件函数:

// When order is created after checkout
add_action( 'woocommerce_checkout_create_order', 'save_billing_email_md5', 20, 2 );
function save_billing_email_md5( $order, $data ) {
    if ( ! has_items_for_email_md5( WC()->cart->get_cart() ) ) return;

    if( $billing_email = $order->get_billing_email() ) {
        $order->add_meta_data('_billing_email_md5', md5($billing_email));
    }
}

// When an order is manually created/updated in admin
add_action( 'woocommerce_process_shop_order_meta', 'admin_save_billing_email_md5' );
function admin_save_billing_email_md5( $order_id ) {
    $order = wc_get_order( $order_id );

    if ( ! has_items_for_email_md5( $order->get_items() ) ) return;

    if( $billing_email = $order->get_billing_email() ) {
        update_post_meta($order_id, '_billing_email_md5', md5($billing_email));
    }
}

最后一个函数保持不变:

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;
}

它应该有效。


然后,为了在购买这两种特定产品(ID 120 和 260)后执行一些代码,我们将使用条件函数,如下所示(来自订单 ID):

$order = wc_get_order( $order_id ); // Get WC_Order object (if needed)

if ( has_items_for_email_md5( $order->get_items() ) ) {
    $pro_message = __('Hi dear');

    echo $pro_message . __('custom php code');
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加不存在的订单元数据以扩展 WooCommerce 管理订单对特定产品的搜索 的相关文章

随机推荐

  • emberjs 文档就绪函数应该放在哪里?

    我正在尝试附加一个预先输入 https github com twitter typeahead js 到我的模板之一中的文本输入 因为 Ember 使用把手 所以 jQuery 的文档就绪函数不是用于预输入定义的地方 放置 模板就绪 代码
  • vim + iterm:如何使用鼠标执行除选择之外的所有操作?

    好的 有一个非常具体的设置问题 我使用的是 Mac OS X iTerm 和 vim 我真的很喜欢使用鼠标在正常模式下单击选项卡 在正常模式下滚动等 例如 我鼠标已经可以工作了在 iTerm vim 中 但是 我不喜欢使用视觉模式进行选择
  • 在构建期间将 Visual Studio 项目文件复制到输出目录

    当我生成 Visual Studio 项目时 可执行文件将写入项目属性页中指定的输出目录 我有一个包含一些额外文件的项目 例如 ini文件 由程序使用 如何配置项目以将文件复制到输出目录 以便当程序运行时 它的 CWD 中有另一个文件的副本
  • 优化 Node.js 内存消耗

    我正在用 Node js Express 和 MongoDB 编写一个简单的 cms 我计划为每个站点运行不同的 Node js 进程 问题是启动后该进程需要大约 90m 的 RAM 对我来说太大了 8 个站点占用了所有服务器 RAM 该内
  • 删除从另一个指针分配的指针,我应该再次删除另一个指针吗?

    所以 这是我的例子来解释这个问题 void p1 int p2 p3 p2 new int p1 p2 p3 int p1 要释放内存 以下 3 行是否彼此等效 delete p2 delete p3 delete int p1 我使用这样
  • 嵌套循环、内循环并行化、重用线程

    免责声明 以下示例只是一个快速理解问题的虚拟示例 如果您正在考虑现实世界的问题 请考虑任何动态编程 问题 我们有一个 n m 矩阵 我们想要复制前一行的元素 如以下代码所示 for i 1 i lt n i for j 0 j lt m j
  • Erlang 记忆的简单示例

    假设您有一个简单的函数 对于较大的值来说 它的成本可能会相当高 fact 0 gt 1 fact N gt N fact N 1 在哪里可以找到使用缓存 或记忆 函数值的简单示例dets 任何其他方便记忆的方法都将受到高度赞赏 根据您的情况
  • symfony2 表单复选框分组(扩展和多项选择)

    在我的表单类型中我有这个 builder gt add options choice choices gt choices multiple gt true expanded gt true label gt false 选择是一个数组 c
  • 为什么SQL不支持“= null”而不支持“is null”?

    我不是在问if确实如此 我知道事实并非如此 我很好奇原因 我已阅读过诸如此之类的支持文档关于在 MySQL 中使用 Null 值 http dev mysql com doc refman 5 0 en working with null
  • Eclipse 打开空白工作区

    我什至不知道在哪里寻找这个问题 发生的情况是 当我打开 Eclipse 时 它 会打开一个空白工作区 然后我必须切换到当前的 现在每次打开 Eclipse 都会发生这种情况 知道我应该在哪里解决这个问题吗 日食朱诺 看看 eclipse安装
  • 为转译而构建的抽象(编程)语言

    介绍 我经常遇到这样的情况 库是用特定的编程语言编写的 这很好 如果我想以同一种语言使用该库 但如果我想使用不同的语言 这将是一个问题 这并不意味着可能存在或多或少的 hacky 方式 对于某些库 我感觉它们是用特定的编程语言编写的 只是因
  • 如何使用 markdown 按顺序编写两个单独的块引用?

    我需要按顺序放置两个块引用 但是 markdown 将它们组合成一个块引用 我能让它们分开的唯一方法是在它们之间放置一些垃圾文本 由于此文本字段允许我使用 Markdown 因此我可以演示 gt First Quote gt Second
  • 如何从 Emacs 中的混乱情况中恢复?

    我刚刚开始使用 Emacs 有时我会尝试一些东西 当我完成实验时 我想返回到我正在编辑的缓冲区 但我不知道如何做 更糟糕的是 有时我不小心敲到了一个键 甚至不知道我敲到了什么 在 Vim 中 我只需按 ESC 即可恢复 Emacs中有没有类
  • 指定 Random.nextInt() 的最大值和最小值? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 生成一定范围内的随机数 https stackoverflow com questions 363681 java generating random number in a range 我
  • 从 Jest 到 stdout 再到 GitLab 的代码覆盖率

    我正在 GitLab CI 中运行代码覆盖率的玩笑测试 GitLab 从 gitlab 中运行程序的标准输出捕获百分比 jest coverage在 stdout 中生成覆盖范围 并且 gitlab 使用以下命令捕获它 All files
  • 从javascript中的字符串中提取带有“=”的变量的最佳方法是什么

    我想从这样的字符串中提取变量名称 foo valor bar second 等等 回来 foo valor bar second 您可以使用正则表达式展望 https www regular expressions info lookaro
  • Cassandra 时间序列数据模型

    我正在研究用于存储时间序列的 Cassandra 数据模型 我是 Cassandra 新手 我有两个应用程序 日内股票数据和传感器数据 股票数据将以一分钟的时间分辨率保存 七个数据字段构建一个时间范围 符号 日期时间 开盘价 最高价 最低价
  • 如何测试两个时间范围是否重叠?

    我需要实现预订功能并确保预订不会在 Rails 应用程序中重叠 The cover and between 方法不太符合我的需要 与同一模型上的其他潜在范围相比 我必须确保时间范围的唯一性 并高效地做到这一点 我认为可以使用overlaps
  • Python:Ascii字符<->十进制表示转换

    您好 我需要能够将 ascii 字符转换为其十进制等效字符 反之亦然 我怎样才能做到这一点 num ord char char chr num 例如 gt gt gt ord a 97 gt gt gt chr 98 b 您可以阅读有关 P
  • 添加不存在的订单元数据以扩展 WooCommerce 管理订单对特定产品的搜索

    继我之前的问题之后 我还有一个问题 添加不存在的订单元数据以扩展 WooCommerce 管理订单搜索 https stackoverflow com questions 77206771 add unexisting order meta