当前位置: 首页 > 知识库问答 >
问题:

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

刘和昶
2023-03-14

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

这就是我一步一步做的

用户B单击一个按钮-

$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单击另一个按钮-

$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\u user\u 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

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

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

在那之后,我得到了一个友好的人的帮助,他告诉我,这不能像我那样工作。必须允许用户B查看来自A的订单和许多其他东西...有人能帮我完成这部分吗?我的实现出了什么问题,如何根据需要更改功能?

共有1个答案

施永宁
2023-03-14

如果我们查看WooCommerce用于查询客户的Responsibile功能,您将根据用户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,我们需要对此查询进行某种破解,我现在可以想到的可能选项是使用post\u in而不是通过客户id获取订单。

我们将使用woocommerce\u my\u account\u my\u orders\u查询过滤器来更改查询。

我将假设该用户的额外订单存储在wp_usermeta表中

解决方案将是:

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

在上面的解决方案中,首先我们检查当前用户是否有额外的订单,如果是的话,然后我们选择他所有的默认订单id,并将数组与他的额外订单合并,然后我们修改查询,以便我们可以获得所有这些订单。

现在唯一剩下的事情是允许用户看到他的额外订单,要做到这一点,我们需要使用user_has_cap钩子。

 add_filter( 'user_has_cap',   'give_permissions'  , 10, 3 );

 function give_permissions( $allcaps, $cap, $args ) {

    if ( isset( $cap[0] ) && $cap[0] == 'view_order' ) {
        $get_additional_ids = get_user_meta( get_current_user_id(), 'additional_orders', false );
        if ( isset( $get_additional_ids[0] ) && in_array( $args[2], $get_additional_ids[0] ) ) {
            $allcaps[ $cap[0] ] = true;
        }
    }
    return ( $allcaps );
}

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

 类似资料:
  • 问题内容: 我在JVM(Scala)中构建了一个庞大的图形,我想反复使用它来调整算法。我不想每次都从磁盘重新加载它。有没有办法让它坐在一个JVM中,而又与另一个正在开发算法的JVM连接呢? 问题答案: 将图形保存到磁盘,然后使用MappedByteBuffer将其映射到内存。两个进程应使用相同的内存,该内存将与页面缓存共享。

  • 在Java中,对于两个JVM(运行在同一台物理机器上),是否有办法使用/共享相同的内存地址空间?假设JVM-1中的生产者将消息放在特定的预定义内存位置,如果JVM-2上的消费者知道要查看哪个内存位置,那么它是否可以检索消息?

  • 问题内容: 我有2个需要共享状态的React组件,react- router显示了组件A,该组件接受一些输入并将其添加到其状态,在状态成功更新后,我想重定向到组件B,用户在其中添加在我向我的api提交发布请求以保存来自组件A和B的数据之前,使用一些更多的输入并更新与组件A相同的状态以使用来自A和B的输入来构建对象。如何做到这一点,使用react- router的方式,还是我必须在组件之间设置父/子

  • 问题内容: 我正在将AngularJS与c#mvc一起使用。我有一个主页,用户可以在其中输入一些数据,并将其传递给第二个模块,在该模块中,我将使用这些数据进行处理和决策。我必须使用第二个模块中第一个模块中输入或更新的数据。有人可以帮我实现这个目标吗? 问题答案: 希望以下实现可以帮助您有所了解。

  • 我正在努力理解使用的好处。文档和其他帖子(Junit@Rule是如何工作的?)所有这些都暗指能够在类内的测试之间共享代码和/或在测试类之间共享代码。 在功能/集成测试中,我试图使用进行DB连接,但我不知道如何跨类共享该连接。事实上,在这种情况下,我并没有看到比有什么好处。我是不是用错了,还是我遗漏了什么?