WooCommerce:如何在两个客户之间共享订单?

时间:2018-10-02 20:27:58

标签: php wordpress woocommerce

一周前,我开始建立WooCommerce商店,该商店应该可以选择在两个客户之间共享订单。这是我为您制作的一张小图,您可以了解它的样子(请看一下):

enter image description here

这就是我一步一步做


用户B单击按钮->(将第二个用户ID保存到订单中):

$related_order = $_POST['related_order'];
$current_user = wp_get_current_user();
$userID = $current_user->ID;
update_post_meta($related_order, 'second_user_id', $userID);

用户B单击另一个按钮->(从订单中删除第二个用户ID)

$related_order = $_POST['related_order'];
$current_user = wp_get_current_user();
$user_id = $current_user->ID;
delete_post_meta($related_order , 'second_user_id');

这两个步骤(显示和隐藏用户B的订单)运行正常-我已经对其进行了测试。该字段已设置和未设置。


现在情况越来越糟:

我进行了很多搜索,要求一些人在WooCommerce中找到该功能,该功能可为客户获取所有订单。找到它之后,我尝试对其进行更改,以便将second_user_id字段选中。我只是以为我可以这样显示从客户A到客户B的订单:

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(),
        'second_user_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


如您所见,我已尝试将second_user_id添加到查询中以返回客户的订单。这是我在每个订单中保存的自定义字段:

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

那没有用,我从一个友好的家伙那里得到了帮助,他告诉我,这不能像我那样做。必须授予用户B许可,才能从A和许多其他东西查看订单...那么有人可以为我提供帮助吗?我的实现有什么问题,我该如何根据需要更改功能?

1 个答案:

答案 0 :(得分:2)

如果我们查看WooCommerce用于查询客户的响应功能,您将WooCommerce根据用户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(),
        '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,
        )
    );
}
}

如果您要更改此查询并添加默认订单旁边不属于该用户的特定订单ID,我们需要对此查询进行某种修改,我现在想到的可能选项是使用{ {1}},而不是通过客户ID获取订单。

我们将使用post__in过滤器来更改查询。

我将假定该用户的其他订单存储在woocommerce_my_account_my_orders_query表中

解决方案将是:

wp_usermeta

您将首先在上面的解决方案中看到我们检查当前用户是否还有其他订单(如果是),然后选择其所有默认订单ID,然后将数组与他的其他订单合并,然后修改查询,以便可以获取所有这些命令。

现在剩下的唯一事情就是允许用户查看他的其他订单,并且这样做,我们需要使用add_filter( 'woocommerce_my_account_my_orders_query', 'modify_my_order_query' , 20, 1 ); function modify_my_order_query( $q ) { global $wpdb; $current_user_id = get_current_user_id(); //Check if the user have addtional orders $secondary_post_ids = get_user_meta( $current_user_id, 'additional_orders', false ); if ( ! empty( $secondary_post_ids ) ) { // Get All Orders ID for the main customers $prepare_query = $wpdb->prepare( " SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key LIKE %s and meta_value LIKE %d ", '_customer_user', $current_user_id ); $results = $wpdb->get_results( $prepare_query, ARRAY_A ); $main_post_ids = wp_list_pluck( $results, 'post_id' ); // Merge All Orders IDs $all_posts_ids = ( isset( $secondary_post_ids[0] ) ) ? array_merge( $main_post_ids, $secondary_post_ids[0] ) : $main_post_ids; //Modify the my Order Query to include all orders ID including the additional ones unset( $q['customer'] ); $q['post__in'] = $all_posts_ids; } return $q; } 挂钩。

user_has_cap

我相信该解决方案将实现您的目标目标。