Kan ik voorkomen dat klanten individuele onderdelen van bundelproducten kunnen bestellen?

Dit is mogelijk, maar vereist wel een kleine aanpassing in het thema in WooCommerce. Om ervoor te zorgen dat klanten bepaalde onderdelen van bundelproducten niet kunnen bestellen, dient voor deze onderdelen de optie “Zichtbaar op website” binnen Vendit te worden uitgeschakeld. Daarnaast dient de volgende code aan het thema in de website te worden toegevoegd.

Image Description

Dit is mogelijk, maar vereist wel een kleine aanpassing in het thema in WooCommerce.

Om ervoor te zorgen dat klanten bepaalde onderdelen van bundelproducten niet kunnen bestellen, dient voor deze onderdelen de optie “Zichtbaar op website” binnen Vendit te worden uitgeschakeld.

Daarnaast dient de volgende code aan het thema in de website te worden toegevoegd.

Let op: We raden aan om deze code door een ontwikkelaar toe te laten voegen. Hoewel de code door ons is getest, kan de compatibiliteit per website verschillen. Wanneer code zonder controle vooraf of verkeerd aan de website wordt toegevoegd, kan de website stoppen met werken.

/**
 * Add products to the bundled parent product, regardless of the status being draft.
 */
add_filter( 'woocommerce_bundled_items', function( array $bundledItems, WC_Product_Bundle $product ): array {
    if ( ! $product || is_admin() ) {
        return $bundledItems;
    }

    $bundledItems     = [];
    $bundledDataItems = $product->get_bundled_data_items();

    foreach ( $bundledDataItems as $bundledDataItem ) {
        $bundledItem = $product->get_bundled_item( $bundledDataItem );

        if ( $bundledItem && $bundledItem->exists() ) {
            $bundledItems[ $bundledDataItem->get_id() ] = $bundledItem;
        }
    }

    return $bundledItems;
}, 10, 2 );

/**
 * Make bundled products purchasable, regardless of child items being draft.
 */
add_filter( 'woocommerce_is_purchasable', function ( bool $isPurchasable, $product ) {
    if ( ! $product || empty( $product->get_type() ) ) {
        return $isPurchasable;
    }

    switch ( $product->get_type() ) {
        case 'bundle':
            /**
             * @var WC_Product_Bundle $product
             */
            if ( 'draft' !== $product->get_status() && ! empty( $product->get_bundled_data_items() ) ) {
                return true;
            }

            break;

        default:
            /**
             * This check is being used upon:
             * - visiting the bundled product page.
             * - adding the product to the cart.
             */
            if ( is_product() || ! empty( $_REQUEST['add-to-cart'] ) ) {
                $currentProduct = ! empty( $_REQUEST['add-to-cart'] ) ?
                    wc_get_product( $_REQUEST['add-to-cart'] ) : wc_get_product( get_the_ID() );

                if ( $currentProduct ) {
                    if ( isBundleParentOfChild( $currentProduct, $product ) ) {
                        return true;
                    }
                }
            }

            /**
             * Final check, when visiting a page like the cart of the checkout
             * we also need to allow the children of a bundled product.
             */
            if ( ! is_admin() && ! empty( WC()->session ) && ! empty( $sessionData = WC()->session->get_session_data() ) && ! empty( $sessionData['cart'] ) ) {
                /**
                 * @var WC_Product $product
                 */
                foreach ( unserialize( $sessionData['cart'] ) as $cartItem ) {
                    if ( empty( $parentProduct = wc_get_product( $cartItem['product_id'] ) ) || $parentProduct->get_type() !== 'bundle' ) {
                        continue;
                    }

                    if ( isBundleParentOfChild( $parentProduct, $product ) ) {
                        return true;
                    }
                }
            }
    }

    return $isPurchasable;
}, 10, 2 );

/**
 * @param $bundleParent
 * @param WC_Product $child
 * @return bool|mixed
 */
function isBundleParentOfChild( $bundleParent, WC_Product $child ) {
    if ( ! $bundleParent || $bundleParent->get_type() !== 'bundle' || empty( $bundledProducts = $bundleParent->get_bundled_data_items() ) ) {
        return false;
    }

    foreach ( $bundledProducts as $bundledProduct ) {
        /**
         * @var WC_Bundled_Item_Data $bundledProduct
         */
        if ( $child->get_id() == $bundledProduct->get_product_id() ) {
            return true;
        }
    }

    return false;
}

Was dit artikel nuttig?

Ja Nee