• Resolved allainbreme

    (@allainbreme)


    Im kinda new to woocommerce dev and haven’t developped in PHP for ages.

    With the help of [@LoicTheAztec][1], I implemented Preording on my Woocommerce store using this :

        // Admin Variation custom fields
        add_action( 'woocommerce_product_after_variable_attributes', 'ab_preorder_variation_fields', 10, 3 );
        function ab_preorder_variation_fields( $loop, $variation_data, $variation ) {
        
            echo '<div class="options_group form-row form-row-full">';
            
            // Is Preordable
            woocommerce_wp_checkbox(
                array(
                    'id'            => '_ab_preorder_checkbox['.$loop.']',
                    'wrapper_class' => 'show_if_simple',
                    'label'         => __(' Disponible à la précommande', 'woocommerce' ),
                    'description'   => __( 'Disponible à la précommande', 'woocommerce' ),
                    'desc_tip'    => true,
                    'value' => get_post_meta( $variation->ID, '_ab_preorder_checkbox', true )
                )
            );
        
            // Custom Preorder Price
            woocommerce_wp_text_input(
                array(
                    'id'                => '_ab_preorder_custom_price['.$loop.']',
                    'label'             => __( 'Prix à la précommande', 'woocommerce' ),
                    'placeholder'       => '',
                    'desc_tip'          => true,
                    'description'       => __( "Prix à la précommande", 'woocommerce' ),
                    'type'              => 'number',
                    'custom_attributes' => array(
                            'step'  => 'any',
                            'min'   => '0'
                        ),
                    'value' => get_post_meta( $variation->ID, '_ab_preorder_custom_price', true )
                )
            );
        
            // Date de livraison estimée
            woocommerce_wp_text_input(
                array(
                    'id'          => '_ab_preorder_estimated_date['.$loop.']',
                    'label'       => __( 'Date de livraison estimé', 'woocommerce' ),
                    'desc_tip'    => true,
                    'description' => __( "Date de livraison estimé", "woocommerce" ),
                    'type'        => 'date',
                    'value' => get_post_meta( $variation->ID, '_ab_preorder_estimated_date', true )
                )
            );
        
            echo '</div>';
        }
        
        // Save admin Variations custom fields values
        add_action( 'woocommerce_admin_process_variation_object', 'ab_preorder_variation_fields_saving', 10, 2 );
        function ab_preorder_variation_fields_saving( $variation, $loop ) {
            if( isset($_POST['_ab_preorder_checkbox'][$loop]) ) {
                $variation->update_meta_data( '_ab_preorder_checkbox', esc_attr($_POST['_ab_preorder_checkbox'][$loop]) );
            }
        
            if( isset($_POST['_ab_preorder_custom_price'][$loop]) ) {
                $variation->update_meta_data( '_ab_preorder_custom_price', esc_attr($_POST['_ab_preorder_custom_price'][$loop]) );
            }
        
            if( isset($_POST['_ab_preorder_estimated_date'][$loop]) ) {
                $variation->update_meta_data( '_ab_preorder_estimated_date', esc_attr($_POST['_ab_preorder_estimated_date'][$loop]) );
            }
        }
        
        // Set the variation backorder price
        add_filter('woocommerce_product_variation_get_regular_price', 'custom_price', 99, 2 );
        add_filter('woocommerce_product_variation_get_price', 'custom_price', 99, 2 );
        function custom_price( $price, $product ) {
            if ( $product->get_stock_quantity() == 0 && $product->get_meta('_ab_preorder_checkbox') === 'yes' ) {
                $backorder_price = $product->get_meta('_ab_preorder_custom_price');
                
                if( $backorder_price > 0 ) {
                    $price = (float) $backorder_price;
                }
            }
            return $price;
        }
        
        // Display prefixed backorder price and estimated delivery on single product pages
        add_filter( 'woocommerce_available_variation', 'ab_available_variation_custom_field', 10, 3 );
        function ab_available_variation_custom_field( $variation_data, $product, $variation ) {
            if ( $variation->get_stock_quantity() == 0 && $variation->get_meta('_ab_preorder_checkbox') === 'yes' ) {
                if ( $estimated_delivery_date = $variation->get_meta('_ab_preorder_estimated_date') ) {
                    // Display estimated delivery date
                    $variation_data['availability_html'] .= sprintf( '<p class="stock date-precommande">%s : %s</p>',
                    __("Date de livraison estimée (précommande)", "woocommerce"), $estimated_delivery_date );
                }
                
                // Displayed prefixed formatted price
                $variation_data['price_html'] = '<span class="price-prefix">'.__("Prix à la précommande", "") .'<span> : ' . wc_price( $variation_data['display_price'] );
            }
            return $variation_data;
        }
        
        // Display on estimated delivery date on cart and checkout
        add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 );
        function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) {
            if ( $cart_item['variation_id'] > 0 && $cart_item['data']->get_stock_quantity() == 0
            && $cart_item['data']->get_meta('_ab_preorder_checkbox') === 'yes' ) {
                if ( $estimated_delivery_date = $cart_item['data']->get_meta('_ab_preorder_estimated_date') ) {
                    $custom_items[] = array( "name" => __("Date de livraison estimée", "woocommerce"),  "value" => $estimated_delivery_date );
                }
            }
            return $custom_items;
        }

    When i want to allow preordering on a product, i just need to check the _ab_preorder_checkbox (Disponible à la précommande) checkbox and enter a _ab_preorder_custom_price and an estimated delivery date _ab_preorder_estimated_date.

    Everything works good, the problem im facing is : When i have only one copy left from a product and the client tries to order more than just one (2-3), the product gets added to the cart with the original price and not with the preorder discount.

    The behavior i want to have is : When i have X copies left of a product and the client decides to order X+Y copies, i want to set the original price for the X copies and the preorder price _ab_preorder_custom_price for the Y copies.

    I tought about using the woocommerce_before_calculate_totals hook but im not sure about how to implement that and i don’t know if the best solution.

    Can anyone help me up with that please?

    Regards

    The page I need help with: [log in to see the link]

Viewing 2 replies - 1 through 2 (of 2 total)
Viewing 2 replies - 1 through 2 (of 2 total)
  • The topic ‘Woocommerce – Product Variation Preorder price’ is closed to new replies.