WooCommerce:如何在订单元数据对象中获取具有自定义ID的订单?

时间:2018-10-02 10:30:29

标签: php arrays wordpress serialization woocommerce

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

  •   

    woocommerce_account_orders


我已经添加了字段

  •   

    mycustom_id

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

  •   

    (mycustom_id = current_user_id())


customer的支票应保留。我只需要添加其他current_user_id支票。

这真是令人振奋的住宿:

  •   

    '客户'=> get_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的新手,所以必须学习很多东西。

1 个答案:

答案 0 :(得分: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 );