WooCommerce Order Dashboard Customization

User
– Again, ideally these should all be individual 'screen options' on the order dashboard so we can decide whether we want to enable and disable DOB, sex and/or account/user ID on the order dashboard as we chose (if this is simple enough). 

Please devlop above in wordpress admin order dashboard woocommerce

Assistant
To add individual "Screen Options" for Date of Birth (DOB), Sex, and Account/User ID on the WooCommerce order dashboard, follow these steps:

### **1. Hook into WooCommerce Admin Order List**
You need to modify the **WooCommerce Orders table** and add options to show/hide columns using the **Screen Options** panel.

#### **Step 1: Add Columns to WooCommerce Order List**
Add the following code to your theme’s `functions.php` or a custom plugin:

// Add custom columns to WooCommerce Orders table
add_filter('manage_edit-shop_order_columns', function ($columns) {
    $columns['dob'] = __('DOB', 'your-textdomain');
    $columns['sex'] = __('Sex', 'your-textdomain');
    $columns['account_id'] = __('Account/User ID', 'your-textdomain');
    return $columns;
});

#### **Step 2: Populate Custom Columns**
Fetch and display the data in the orders table:

// Populate custom columns with data
add_action('manage_shop_order_posts_custom_column', function ($column, $post_id) {
    if ($column === 'dob') {
        echo esc_html(get_post_meta($post_id, '_dob', true) ?: '—');
    }
    if ($column === 'sex') {
        echo esc_html(get_post_meta($post_id, '_sex', true) ?: '—');
    }
    if ($column === 'account_id') {
        $user_id = get_post_meta($post_id, '_customer_user', true);
        echo $user_id ? esc_html($user_id) : '—';
    }
}, 10, 2);

### **2. Add Screen Options Toggle**
Now, let’s make these columns optional via the **Screen Options** panel.

#### **Step 3: Register Screen Options**

// Add custom screen options
add_filter('manage_edit-shop_order_columns', function ($columns) {
    $user = get_current_user_id();
    
    // Check if user has disabled columns
    $dob_enabled = get_user_meta($user, 'woocommerce_order_dob_column', true) !== 'no';
    $sex_enabled = get_user_meta($user, 'woocommerce_order_sex_column', true) !== 'no';
    $account_id_enabled = get_user_meta($user, 'woocommerce_order_account_id_column', true) !== 'no';

    if (!$dob_enabled) unset($columns['dob']);
    if (!$sex_enabled) unset($columns['sex']);
    if (!$account_id_enabled) unset($columns['account_id']);

    return $columns;
});

#### **Step 4: Save User Preferences for Columns**

// Save user screen options preferences
add_filter('set-screen-option', function ($status, $option, $value) {
    if (in_array($option, ['woocommerce_order_dob_column', 'woocommerce_order_sex_column', 'woocommerce_order_account_id_column'])) {
        return $value;
    }
    return $status;
}, 10, 3);

#### **Step 5: Add Settings to Screen Options**

// Add fields to the Screen Options tab
add_action('woocommerce_admin_order_list_table_columns', function () {
    $user = get_current_user_id();

    $dob_checked = get_user_meta($user, 'woocommerce_order_dob_column', true) !== 'no' ? 'checked' : '';
    $sex_checked = get_user_meta($user, 'woocommerce_order_sex_column', true) !== 'no' ? 'checked' : '';
    $account_id_checked = get_user_meta($user, 'woocommerce_order_account_id_column', true) !== 'no' ? 'checked' : '';

    ?>
    <fieldset class="screen-options">
        <legend><?php _e('Order Columns', 'your-textdomain'); ?></legend>
        <label for="woocommerce_order_dob_column">
            <input type="checkbox" name="woocommerce_order_dob_column" id="woocommerce_order_dob_column" <?php echo $dob_checked; ?> />
            <?php _e('Show DOB', 'your-textdomain'); ?>
        </label>
        <br>
        <label for="woocommerce_order_sex_column">
            <input type="checkbox" name="woocommerce_order_sex_column" id="woocommerce_order_sex_column" <?php echo $sex_checked; ?> />
            <?php _e('Show Sex', 'your-textdomain'); ?>
        </label>
        <br>
        <label for="woocommerce_order_account_id_column">
            <input type="checkbox" name="woocommerce_order_account_id_column" id="woocommerce_order_account_id_column" <?php echo $account_id_checked; ?> />
            <?php _e('Show Account/User ID', 'your-textdomain'); ?>
        </label>
    </fieldset>
    <?php
});

#### **Step 6: Save User Preferences**

// Save user preferences when screen options are updated
add_action('admin_init', function () {
    $user = get_current_user_id();

    if (isset($_POST['woocommerce_order_dob_column'])) {
        update_user_meta($user, 'woocommerce_order_dob_column', 'yes');
    } else {
        update_user_meta($user, 'woocommerce_order_dob_column', 'no');
    }

    if (isset($_POST['woocommerce_order_sex_column'])) {
        update_user_meta($user, 'woocommerce_order_sex_column', 'yes');
    } else {
        update_user_meta($user, 'woocommerce_order_sex_column', 'no');
    }

    if (isset($_POST['woocommerce_order_account_id_column'])) {
        update_user_meta($user, 'woocommerce_order_account_id_column', 'yes');
    } else {
        update_user_meta($user, 'woocommerce_order_account_id_column', 'no');
    }
});

### **Final Result**
– The WooCommerce order dashboard will have three new columns: **DOB, Sex, and Account/User ID**.
– Users can enable/disable these columns from **Screen Options**.
– Their preferences will be saved per user.

This keeps the order dashboard clean and customizable without overwhelming users with unnecessary data.

Let me know if you need further modifications!

Leave a Comment

Your email address will not be published. Required fields are marked *