Untitled

 avatar
webwizards
plain_text
5 days ago
13 kB
4
Indexable
// Add price lists section to user profile
add_action('show_user_profile', 'cspg_add_price_lists_section', 100);
add_action('edit_user_profile', 'cspg_add_price_lists_section', 100);

function cspg_add_price_lists_section($user) {
    if (!current_user_can('edit_users')) return;
    
    $price_lists = cspg_get_user_price_lists($user->ID);
    
    // Get B2BKing groups
    $groups = get_posts(array('post_type' => 'b2bking_group', 'numberposts' => -1, 'post_status' => 'publish'));
    
    ?>
    <div style="background:#fff;border:1px solid #ccd0d4;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:20px;margin-top:20px;">
        <h3 style="margin-top:0;"><?php _e('B2BKing Price Lists'); ?></h3>
        
        <div style="background:#f0f0f1;padding:15px;margin-bottom:20px;border-radius:4px;">
            <label style="display:block;margin-bottom:8px;font-weight:600;"><?php _e('Product Search'); ?></label>
            <select id="cspg-product-search" style="width:100%;"></select>
            <p class="description" style="margin-top:8px;"><?php _e('Search for products to find their ID. Selected product ID will be shown below.'); ?></p>
            <div id="cspg-selected-product" style="margin-top:10px;display:none;padding:8px;background:#fff;border-left:3px solid #2271b1;">
                <strong><?php _e('Selected Product ID:'); ?></strong> <span id="cspg-selected-product-id"></span>
            </div>
        </div>
        
        <table class="form-table">
            <tr>
                <th><label><?php _e('Product Price Lists'); ?></label></th>
                <td>
                    <div id="cspg-product-lists">
                        <?php if (!empty($price_lists['products'])): ?>
                            <?php foreach ($price_lists['products'] as $index => $item): ?>
                                <div class="cspg-row" style="margin-bottom:10px;">
                                    <input type="text" name="cspg_product_id[]" value="<?php echo esc_attr($item['product_id']); ?>" placeholder="Product ID" style="width:100px;">
                                    <?php
                                    $product = wc_get_product($item['product_id']);
                                    if ($product) {
                                        echo '<span style="color:#666;margin-left:8px;">' . esc_html($product->get_name()) . '</span>';
                                    }
                                    ?>
                                    <select name="cspg_product_group[]" style="width:200px;margin-left:8px;">
                                        <option value=""><?php _e('Select Group'); ?></option>
                                        <?php foreach ($groups as $group): ?>
                                            <option value="<?php echo $group->ID; ?>" <?php selected($item['group_id'], $group->ID); ?>><?php echo $group->post_title; ?></option>
                                        <?php endforeach; ?>
                                    </select>
                                    <button type="button" class="button cspg-remove" style="color:#a00;margin-left:8px;">Remove</button>
                                </div>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </div>
                    <button type="button" class="button" id="cspg-add-product">+ Add Product</button>
                    
                    <p class="description"><?php _e('Assign pricing groups to specific products (highest priority).'); ?></p>
                </td>
            </tr>
            <tr>
                <th><label><?php _e('Category Price Lists'); ?></label></th>
                <td>
                    <div id="cspg-category-lists">
                        <?php if (!empty($price_lists['categories'])): ?>
                            <?php foreach ($price_lists['categories'] as $index => $item): ?>
                                <div class="cspg-row" style="margin-bottom:10px;">
                                    <?php
                                    $categories = get_terms(array('taxonomy' => 'product_cat', 'hide_empty' => false));
                                    ?>
                                    <select name="cspg_category_id[]" style="width:200px;">
                                        <option value=""><?php _e('Select Category'); ?></option>
                                        <?php foreach ($categories as $cat): ?>
                                            <option value="<?php echo $cat->term_id; ?>" <?php selected($item['category_id'], $cat->term_id); ?>><?php echo $cat->name; ?></option>
                                        <?php endforeach; ?>
                                    </select>
                                    <select name="cspg_category_group[]" style="width:200px;">
                                        <option value=""><?php _e('Select Group'); ?></option>
                                        <?php foreach ($groups as $group): ?>
                                            <option value="<?php echo $group->ID; ?>" <?php selected($item['group_id'], $group->ID); ?>><?php echo $group->post_title; ?></option>
                                        <?php endforeach; ?>
                                    </select>
                                    <button type="button" class="button cspg-remove" style="color:#a00;">Remove</button>
                                </div>
                            <?php endforeach; ?>
                        <?php endif; ?>
                    </div>
                    <button type="button" class="button" id="cspg-add-category">+ Add Category</button>
                    
                    <p class="description"><?php _e('Assign pricing groups to product categories.'); ?></p>
                </td>
            </tr>
        </table>
        
        <p style="border-top:1px solid #ccd0d4;padding-top:15px;margin-top:20px;">
            <button type="submit" class="button button-primary"><?php _e('Save Price Lists'); ?></button>
        </p>
    </div>
    
    <script>
    jQuery(document).ready(function($) {
        var groups = <?php echo json_encode(array_map(function($g) { return array('id' => $g->ID, 'title' => $g->post_title); }, $groups)); ?>;
        
        // Initialize product search with Select2
        $('#cspg-product-search').select2({
            ajax: {
                url: ajaxurl,
                dataType: 'json',
                delay: 300,
                data: function (params) {
                    var searchTypes = ['products'];
                    
                    return {
                        action: 'b2bking_admin_content_search',
                        security: b2bking.security,
                        search: params.term,
                        types: searchTypes
                    };
                },
                processResults: function (data) {
                    if (data.success) {
                        return {
                            results: data.data
                        };
                    }
                    return { results: [] };
                },
                cache: true
            },
            minimumInputLength: 3,
            placeholder: 'Search for products...',
            allowClear: true,
            width: '100%'
        });
        
        // Show selected product ID
        $('#cspg-product-search').on('select2:select', function (e) {
            var data = e.params.data;
            $('#cspg-selected-product-id').text(data.id);
            $('#cspg-selected-product').show();
        });
        
        $('#cspg-product-search').on('select2:clear', function (e) {
            $('#cspg-selected-product').hide();
        });
        
        $('#cspg-add-product').click(function() {
            var html = '<div class="cspg-row" style="margin-bottom:10px;">' +
                '<input type="text" name="cspg_product_id[]" placeholder="Product ID" style="width:100px;">' +
                '<select name="cspg_product_group[]" style="width:200px;margin-left:8px;"><option value="">Select Group</option>';
            groups.forEach(function(g) { html += '<option value="' + g.id + '">' + g.title + '</option>'; });
            html += '</select><button type="button" class="button cspg-remove" style="color:#a00;margin-left:8px;">Remove</button></div>';
            $('#cspg-product-lists').append(html);
        });
        
        $('#cspg-add-category').click(function() {
            var categories = <?php echo json_encode(array_map(function($c) { return array('id' => $c->term_id, 'name' => $c->name); }, get_terms(array('taxonomy' => 'product_cat', 'hide_empty' => false)))); ?>;
            var html = '<div class="cspg-row" style="margin-bottom:10px;">' +
                '<select name="cspg_category_id[]" style="width:200px;"><option value="">Select Category</option>';
            categories.forEach(function(c) { html += '<option value="' + c.id + '">' + c.name + '</option>'; });
            html += '</select><select name="cspg_category_group[]" style="width:200px;"><option value="">Select Group</option>';
            groups.forEach(function(g) { html += '<option value="' + g.id + '">' + g.title + '</option>'; });
            html += '</select><button type="button" class="button cspg-remove" style="color:#a00;">Remove</button></div>';
            $('#cspg-category-lists').append(html);
        });
        
        $(document).on('click', '.cspg-remove', function() {
            $(this).closest('.cspg-row').remove();
        });
    });
    </script>
    <?php
}

// Helper function to get user price lists from flattened meta keys
function cspg_get_user_price_lists($user_id) {
    global $wpdb;
    
    $price_lists = array('products' => array(), 'categories' => array());
    
    $meta_keys = $wpdb->get_col($wpdb->prepare(
        "SELECT meta_key FROM {$wpdb->usermeta} WHERE user_id = %d AND (meta_key LIKE '_cspg_product_%' OR meta_key LIKE '_cspg_category_%')",
        $user_id
    ));
    
    foreach ($meta_keys as $meta_key) {
        $group_id = get_user_meta($user_id, $meta_key, true);
        
        if (strpos($meta_key, '_cspg_product_') === 0) {
            $product_id = intval(str_replace('_cspg_product_', '', $meta_key));
            $price_lists['products'][] = array('product_id' => $product_id, 'group_id' => intval($group_id));
        } elseif (strpos($meta_key, '_cspg_category_') === 0) {
            $category_id = intval(str_replace('_cspg_category_', '', $meta_key));
            $price_lists['categories'][] = array('category_id' => $category_id, 'group_id' => intval($group_id));
        }
    }
    
    return $price_lists;
}

// Save price lists
add_action('personal_options_update', 'cspg_save_price_lists');
add_action('edit_user_profile_update', 'cspg_save_price_lists');

function cspg_save_price_lists($user_id) {
    if (!current_user_can('edit_user', $user_id)) return;
    
    // Save product assignments
    if (isset($_POST['cspg_product_id']) && is_array($_POST['cspg_product_id'])) {
        foreach ($_POST['cspg_product_id'] as $index => $product_id) {
            $group_id = isset($_POST['cspg_product_group'][$index]) ? intval($_POST['cspg_product_group'][$index]) : 0;
            if (!empty($product_id) && $group_id > 0) {
                update_user_meta($user_id, '_cspg_product_' . intval($product_id), $group_id);
            }
        }
    }
    
    // Save category assignments
    if (isset($_POST['cspg_category_id']) && is_array($_POST['cspg_category_id'])) {
        foreach ($_POST['cspg_category_id'] as $index => $category_id) {
            $group_id = isset($_POST['cspg_category_group'][$index]) ? intval($_POST['cspg_category_group'][$index]) : 0;
            if ($category_id > 0 && $group_id > 0) {
                update_user_meta($user_id, '_cspg_category_' . intval($category_id), $group_id);
            }
        }
    }
}

// Hook into B2BKing pricing group filter
add_filter('b2bking_b2b_group_for_pricing', 'cspg_override_pricing_group', 10, 3);

function cspg_override_pricing_group($default_group, $user_id, $product_id) {
    // Check product-specific assignment (highest priority)
    $product_group = get_user_meta($user_id, '_cspg_product_' . intval($product_id), true);
    if ($product_group) {
        return intval($product_group);
    }
    
    // Check category assignments
    $product_categories = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'ids'));
    foreach ($product_categories as $cat_id) {
        $category_group = get_user_meta($user_id, '_cspg_category_' . intval($cat_id), true);
        if ($category_group) {
            return intval($category_group);
        }
    }
    
    return $default_group;
}
Editor is loading...
Leave a Comment