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

允许访问WooCommerce前端的任何订单

凌翔宇
2023-03-14

我的目标是允许特定角色查看商店中的任何订单。虽然在“我的帐户”页面中显示所有订单相对容易,但访问不同用户创建的特定订单总是以“无效订单。我的帐户”错误结束。

到目前为止,我已经在woocommerce\u my\u account\u my\u orders\u queryfilter中添加了自定义查询,这样就可以查看具有相同角色的帐户所做的所有订单。我将角色权限设置为完全权限(根据此链接,权限与店铺经理和管理员相同,但默认情况下这些角色也无法查看所有订单:https://github.com/woocommerce/woocommerce/blob/ee01d4219282387c2975ef4594677453c1dd7a0e/includes/class-wc-install.php#L1052

我正在考虑创建自定义视图顺序。php模板,但是我宁愿使用wc\u get\u order()一次获取整个order对象。有人遇到过这样的挑战吗?

下面是我如何添加新角色的:

function lf_wc_role_custom() {  
    add_role(
        'custom_role',
        'Custom Role',
        [
            'level_9'                => true,
            'level_8'                => true,
            'level_7'                => true,
            'level_6'                => true,
            'level_5'                => true,
            'level_4'                => true,
            'level_3'                => true,
            'level_2'                => true,
            'level_1'                => true,
            'level_0'                => true,
            'read'                   => true,
            'read_private_pages'     => true,
            'read_private_posts'     => true,
            'edit_posts'             => true,
            'edit_pages'             => true,
            'edit_published_posts'   => true,
            'edit_published_pages'   => true,
            'edit_private_pages'     => true,
            'edit_private_posts'     => true,
            'edit_others_posts'      => true,
            'edit_others_pages'      => true,
            'publish_posts'          => true,
            'publish_pages'          => true,
            'delete_posts'           => true,
            'delete_pages'           => true,
            'delete_private_pages'   => true,
            'delete_private_posts'   => true,
            'delete_published_pages' => true,
            'delete_published_posts' => true,
            'delete_others_posts'    => true,
            'delete_others_pages'    => true,
            'manage_categories'      => true,
            'manage_links'           => true,
            'moderate_comments'      => true,
            'upload_files'           => true,
            'export'                 => true,
            'import'                 => true,
            'list_users'             => true,
            'edit_theme_options'     => true,
        ]
    );
}
add_action('admin_init', 'lf_wc_role_custom');

到目前为止,我是如何修改订单查询的:

function lf_modify_my_order_query( $query ) {
        global $wpdb;

        $current_user_id = get_current_user_id();
        $user = wp_get_current_user();
        $allowed_roles = ['administrator', 'custom_role'];

        if ( array_intersect( $allowed_roles, $user->roles ) ) {
            $args = array(
                'role' => $user->roles[0],
            );
            $all_users_with_role = get_users( $args );
            $user_ids = [];

            foreach ($all_users_with_role as $user_with_role) {
                array_push($user_ids, $user_with_role->data->ID);
            }

            $user_ids_query = implode("', '", $user_ids);

            $prepare_query = $wpdb->prepare(
                "SELECT post_id
                FROM {$wpdb->postmeta}
                WHERE
                    meta_key LIKE %s
                    AND meta_value IN ('$user_ids_query');",
                '_customer_user',
                $user_ids
            );

            $results = $wpdb->get_results( $prepare_query, ARRAY_A );
            $main_post_ids = wp_list_pluck( $results, 'post_id' );

            unset( $query['customer'] );
            $query['post__in'] = $main_post_ids;
        }

        return $query;
}
add_filter( 'woocommerce_my_account_my_orders_query', 'lf_modify_my_order_query', 20, 1 );```

共有1个答案

呼延明朗
2023-03-14

好吧,我是这样解决的。我最终创建了一个view-order.php模板的副本,我将为属于特定角色的用户提供服务。在我的子主题目录中,我创建了伍德商业/我的帐户/view-my-order.php文件,其中包含以下内容:

$user = wp_get_current_user();
$allowed_roles = ['custom_role'];
if ( array_intersect( $allowed_roles, $user->roles ) ) {
    $order = wc_get_order($order_id);
    $customer_id = $order->customer_id;
    $customer_meta = get_userdata($customer_id);
    $customer_roles = $customer_meta->roles;

    if (!array_intersect($allowed_roles, $customer_roles)) {
        echo 'You do not have permission to view this order.';
        die();
    }
}
else {
    die();
}

以上是为了确保登录用户只能在客户具有相同角色时查看订单。

然后在函数中。php我提出了以下内容:

// Creates new query var so we can access new page
function lf_custom_query_vars( $vars ) {
    $vars['view-my-order'] = 'view-my-order';

    return $vars;
}
add_filter( 'woocommerce_get_query_vars', 'lf_custom_query_vars', 0 );

// Flushes rewrite rules (required with custom WC pages?)
function lf_custom_flush_rewrite_rules() {
    flush_rewrite_rules();
}
add_action( 'wp_loaded', 'lf_custom_flush_rewrite_rules' );

// Replaces native "View" button button next to each order on the list
add_filter('woocommerce_my_account_my_orders_actions', function($actions, $order) {
    $user = wp_get_current_user();
    $allowed_roles = ['custom_role'];

    if ( array_intersect( $allowed_roles, $user->roles ) ) {
        $actions['view'] = [
            'url' => wc_get_endpoint_url( 'view-my-order', $order->get_id() ),
            'name' => __( 'View', 'txtdomain' )
        ];
    }

    return $actions;
}, 10, 2);

// Renders new template
function lf_view_my_order_endpoint_content() {
    $order_id = get_query_var('view-my-order');

    wc_get_template('myaccount/view-my-order.php', [
        'order_id' => $order_id,
    ]);
}
add_action( 'woocommerce_account_view-my-order_endpoint', 'lf_view_my_order_endpoint_content' );

这一切都可以进一步优化,但你得到的想法。

 类似资料:
  • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您

  • 在WooCommerce中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过更改订单状态以完成来确认订单已经到达。 我已经看到允许客户通过电子邮件相关的问题代码改变订单的状态(没有答案),这并没有真正帮助实现我的目标。 客户是否可以通过将订单状态更改为“已完成”来确认订单是否已到达?

  • 我正在使用Microsoft扩展访问Azure DevOps中的密钥库,从密钥库中获取秘密。我得到了这个错误消息,它似乎说我需要允许Azure Devops代理访问KeyVault的权限。“无法获取托管服务主体的访问令牌。请为虚拟机”https://aka.ms/azure-MSI-docs“配置托管服务标识(MSI)。状态代码:400,状态消息:错误请求” 我在一个单独的测试订阅中运行这个功能,

  • 我已创建IAM策略并分配给IAM用户。 请查找保险单 我未选中s3 bucket testingbucket00的“阻止新公共bucket策略”。 我尝试登录aws控制台使用IAM用户列出所有桶,但显示"访问为错误"。 我想给IAM用户分配一个桶,请帮忙。

  • 我正在从主机(http://abc.com.au)向主机http://localhost:8081上运行的Spring Cloud API网关发送ajax请求。 jquery AJAX请求代码。 SimplifiedAdoptionBulkUpload.jsp spring cloud gateway cors配置。 我在chrome控制台中遇到以下错误。 SimplifiedAdoptionBu

  • 本文向大家介绍linux允许端口远程访问开放端口的方法,包括了linux允许端口远程访问开放端口的方法的使用技巧和注意事项,需要的朋友参考一下 1.修改防火墙配置文件 wq保存退出,重启防火墙 这样6379端口就可以远程访问了 2.linux命令开放端口 添加一个开放端口如80端口 保存设置 重启服务即可生效 查看开放端口是否生效 输出以下内容80端口已开放 以上这篇linux允许端口远程访问开放