Untitled

 avatar
unknown
plain_text
19 days ago
2.9 kB
5
Indexable
// Display the custom order number field in the product edit page
add_action('marketking_edit_product_after_tags', function($post) {
    $product_id = $post->ID;
    $order_number = get_post_meta($product_id, '_custom_order_number', true);
    ?>
    <div class="col-xxl-12 col-md-12 marketking_card_gal_cat_tags" style="background: white; padding:20px;border-radius: 4px;">
        <div class="custom-order-field">
            <label for="custom_order_number"><strong><?php _e('Sort Number', 'marketking'); ?></strong></label>
            <input type="number" id="custom_order_number" name="custom_order_number" value="<?php echo esc_attr($order_number); ?>" min="0" step="1">
            <p class="description"><?php _e('Configure a sort number for this product to control the order in which it is shown in your shop (optional).', 'marketking'); ?></p>
        </div>
    </div>
    <?php
});

// Save the custom order number when the product is saved
add_action('marketking_after_save_product', function($product_id, $vendor_id) {
    // Check if our custom field was submitted
    if (isset($_POST['custom_order_number'])) {
        // Sanitize the input
        $order_number = absint($_POST['custom_order_number']);
        
        // Update the post meta
        update_post_meta($product_id, '_custom_order_number', $order_number);
    }
}, 10, 2);
add_filter('woocommerce_shortcode_products_query', function($query_args, $atts, $shortcode_name) {

    add_filter('posts_clauses', function($clauses) {
        global $wpdb;
        
        // This creates a custom ORDER BY that puts products with _custom_order_number first
        // and sorts them by that value in DESCENDING order (higher numbers first)
        $clauses['orderby'] = "
            CASE WHEN {$wpdb->postmeta}.meta_key = '_custom_order_number' THEN 0 ELSE 1 END ASC,
            CASE WHEN {$wpdb->postmeta}.meta_key = '_custom_order_number' 
                THEN CAST({$wpdb->postmeta}.meta_value AS SIGNED) 
                ELSE -1 END DESC,
            {$wpdb->posts}.post_title ASC
        ";
        
        // Make sure we're joining the postmeta table
        $clauses['join'] .= " LEFT JOIN {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_custom_order_number'";
        
        // Group by post ID to avoid duplicates
        $clauses['groupby'] = "{$wpdb->posts}.ID";
        
        return $clauses;
    }, 10);
    
    // Remove the filter after the query runs (to avoid affecting other queries)
    add_action('pre_get_posts', function() {
        add_action('posts_selection', function() {
            remove_all_filters('posts_clauses', 10);
        });
    });
    
    // Remove default orderby parameters to avoid conflicts
    unset($query_args['orderby']);
    unset($query_args['order']);
    unset($query_args['meta_key']);
        
    return $query_args;
}, 10, 3);
Editor is loading...
Leave a Comment