【问题标题】:WooCommerce: How can I get orders with a custom ID in order meta data object?WooCommerce:如何在订单元数据对象中获取具有自定义 ID 的订单?
【发布时间】:2018-10-02 10:30:29
【问题描述】:

因为一个项目,我需要你的帮助。我已经搜索了很多,但我找不到解决方案。 我正在尝试编辑一个名为

的 WooCommerce 函数
  • woocommerce_account_orders


我已经添加了字段

  • mycustom_id

到订单元数据对象,因为我需要在 mycustom_id 字段中获取当前登录用户的所有订单:

  • (mycustom_id = current_user_id())


customer 的检查应该保留。我只需要添加另一个current_user_id 支票。

这应该保持原样:

  • '客户' => get_current_user_id()


。这是我不工作的代码 sn-p:

function woocommerce_account_orders( $current_page ) {
    $current_page    = empty( $current_page ) ? 1 : absint( $current_page );
    $customer_orders = wc_get_orders( apply_filters( 'woocommerce_my_account_my_orders_query', array(
        'customer' => get_current_user_id(),
        'mycustom_id' => get_current_user_id(),
        'page'     => $current_page,
        'paginate' => true,
    ) ) );

    wc_get_template(
        'myaccount/orders.php',
        array(
            'current_page'    => absint( $current_page ),
            'customer_orders' => $customer_orders,
            'has_orders'      => 0 < $customer_orders->total,
        )
    );
}

方法位于:https://docs.woocommerce.com/wc-apidocs/source-function-woocommerce_account_orders.html#2465-2486


如何像过滤器一样以智能方式将此功能添加到函数中,以及如何将自定义参数以正确的方式传递给函数?我已将参数保存为 order_meta 属性:

[5] => WC_Meta_Data Object (
     [current_data:protected] => Array (
          [id] => 3477
          [key] => mycustom_id
          [value] => 2
)

感谢您的帮助。我已经尝试了很多,但我是 PHP 新手,必须学习很多..

【问题讨论】:

  • 没有人可以帮助我吗?这是疯了吗? ://

标签: php arrays wordpress serialization woocommerce


【解决方案1】:

如果你想改变这个查询,你可以通过调用woocommerce_my_account_my_orders_query过滤器来完成,而不是修改核心函数,这样你就可以达到如下要求:

add_filter( 'woocommerce_my_account_my_orders_query', 'modify_my_order_query', 10, 1 );

function modify_my_order_query( $q ) {
    $q['customer'] = [ 1, 3 ]; // you customers ids here 

    return $q;
}

但是上面的这个功能只会在列表中显示订单,如果客户点击该订单查看详细信息,他会收到一条错误消息,因为他没有查看订单的权限,您需要修改view_order 能力

例如,您可以授予 ID 1 的用户查看 ID 3 订单的权限,如下所示:

function give_permissions( $allcaps, $cap, $args ) {
    $user = 3; //user id 
    if ( $cap[0] == 'view_order' ) {
        $allcaps[ $cap[0] ] = true;
    }
    return ( $allcaps );
}
add_filter( 'user_has_cap', 'give_permissions', 10, 3 );

【讨论】:

  • 关键是我需要实现一个“共享订单”功能,所以如果我的自定义 id 设置为其他用户,他也应该看到原始客户的订单。所以这就是为什么我实现了自定义字段来保存第二个用户的 id。您的函数只返回客户 1 和 3 的所有订单,对吗?所以这对我不起作用:/因此,我需要使用我的自定义 ID 以这种方式修改原始函数。
  • @Johnny97 如果您将客户 ID 存储在数据库中,您可以将自定义客户 ID 与 get_current_user_id 合并,上面的想法是为您提供如何开始实现目标的提示跨度>
  • 我应该如何为一个订单设置 2 个客户 ID?我的意思是检查每个订单中的参数会更容易吗?
  • 我将第二个客户 ID 保存为每个订单中的订单元字段。例如订单 A 由用户 1 购买,我想将此订单显示给用户 2,我将 2 设置为我的自定义字段。所以我需要更改获取订单的函数以检查该字段是否有值。如果这是真的,我也必须向客户 2 出示订单。
  • 在这种情况下,您不需要合并,因为您已经将它们作为数组存储在其中,您只需使用 get_post_meta 函数从数据库中获取这些 id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2021-06-10
  • 2014-03-05
  • 2020-05-08
  • 2021-11-04
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多