首页 > 解决方案 > WooCommerce:如何在订单元数据对象中获取具有自定义 ID 的订单?

问题描述

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


我已经添加了字段

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


检查的customer应该留下我只需要添加其他current_user_id检查。

这将保持原样:


. 这是我不工作的代码片段:

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 新手,必须学习很多..

标签: phparrayswordpressserializationwoocommerce

解决方案


如果您想更改此查询,您可以通过调用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 );

推荐阅读