WooCommerce 3+ WC_Order在后端

时间:2017-07-21 16:26:03

标签: php wordpress woocommerce user-roles orders

我在Woocommerce 3.X中遇到了一个问题。我(我想)理解这是因为WC_Order不能再直接访问了,但我不确定如何在函数中修复它(我没写过)。

//Admin JS
    add_action('admin_enqueue_scripts', 'admin_hooks');
    function admin_hooks( $hook ) {

        global $woocommerce, $post;
        $order = new WC_Order($post->ID);
        //to escape # from order id
        $order_id = trim(str_replace('#', '', $order->get_order_number()));
        $user_id = $order->user_id;
        $user_info = get_userdata($user_id);


        wp_enqueue_script( 'admin-hooks', get_template_directory_uri(). '/js/admin.hook.js' );
        wp_localize_script( 'admin-hooks', 'myTest', $user_info->roles );
    }

我尝试将$order = new WC_Order($post->ID);更改为$order = new wc_get_order( $order_id );而没有运气,这是有道理的。我可以看到我试图获得帖子ID而不是订单ID,只是不确定如何。正如你所看到的,我只是围绕代码,所以放轻松。我确实看到了this post,但无法解决如何使用我的代码实现的任何输入。

只是提供一些关于该功能的快速反馈,它会在管理订单页面上显示登录用户角色。

1 个答案:

答案 0 :(得分:1)

您只能在后端,"发布编辑页面"中获取帖子ID,因此对于订单,它将是"订单编辑页面" (但不是"订单列表页面")。

在您加入 admin_enqueue_scripts 的函数中,您只需要定位订阅编辑页面。

您不需要获取WC_Order对象,对于订单页面,订单ID是帖子ID。

订单中的用户ID是客户ID('客户'用户角色)。
另外,有关信息, $user_info->roles; 是一个数组!

所以正确的代码是:

add_action('admin_enqueue_scripts', 'admin_hooks');
function admin_hooks( $hook ) {

    // Targeting only post edit pages
    if ( 'post.php' != $hook && ! isset($_GET['post']) && ! $_GET['action'] != 'edit' )
        return;

    // Get the post ID
    $post_id = $_GET['post']; // The post_id

    // Get the WP_Post object
    $post = get_post($post_id);

    // Targeting only Orders
    if( $post->post_type != 'shop_order' )
        return;

    // Get the customer ID (or user ID for customer user role)
    $customer_id      = get_post_meta( $post_id, '_customer_user', true ); 
    $user_info        = get_userdata($customer_id);

    $user_roles_array = $user_info->roles; // ==> This is an array !!!

    wp_enqueue_script( 'admin-hooks', get_template_directory_uri(). '/js/admin.hook.js' );
    wp_localize_script( 'admin-hooks', 'myTest', $user_roles_array );
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

我无法测试此代码,因为它涉及其他外部文件。但它应该有用。