Разрешить пользователям покупать продукты только один раз в Woocommerce - PullRequest
1 голос
/ 21 марта 2019

Следующий код для Woocommerce, позволяет приобретать снова после покупки

function sv_disable_repeat_purchase( $purchasable, $product ) {
    // Enter the ID of the product that shouldn't be purchased again
    $non_purchasable = 40021;

    // Get the ID for the current product (passed in)
    $product_id = $product->is_type( 'variation' ) ? $product->variation_id : $product->id;

    // Bail unless the ID is equal to our desired non-purchasable product
    if ( $non_purchasable != $product_id ) {
        return $purchasable;
    }

    // return false if the customer has bought the product
    if ( wc_customer_bought_product( wp_get_current_user()->user_email, get_current_user_id(), $product_id ) ) {
        $purchasable = false;
    }

    // Double-check for variations: if parent is not purchasable, then variation is not
    if ( $purchasable && $product->is_type( 'variation' ) ) {
        $purchasable = $product->parent->is_purchasable();
    }

    return $purchasable;
}
add_filter( 'woocommerce_variation_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 );
add_filter( 'woocommerce_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 );

, пожалуйста, можете помочь мне изменить $ non_purchasable = 40021 на массив продуктов

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Обновление (удалены устаревшие ненужные $product->variation_id…)

Вы можете просто использовать условную функцию PHP in_array()… Кроме того, ваш код устарел:

  • Это устарело $product->variation_id
  • заменить $product->id на $product->get_id()

Вот упрощенная версия пересмотренного кода:

add_filter( 'woocommerce_variation_is_purchasable', 'products_purchasable_once', 10, 2 );
add_filter( 'woocommerce_is_purchasable', 'products_purchasable_once', 10, 2 );
function products_purchasable_once( $purchasable, $product ) {
    // Here set the product IDs in the array that can be purchased only once 
    $targeted_products = array(40021, 40038, 40171);

    // Only for logged in users and not for variable products
    if( ! is_user_logged_in() || $product->is_type('variable') )
        return $purchasable; // Exit

    $user = wp_get_current_user(); // The WP_User Object

    if ( in_array( $product->get_id(), $targeted_products ) &&
    wc_customer_bought_product( $user->user_email, $user->ID, $product->get_id() ) ) {
        $purchasable = false;
    }

    return $purchasable;
}

Код поступает в файл function.php вашей активной дочерней темы (или активной темы).Проверено и работает.

1 голос
/ 21 марта 2019

Вот ваш код с массивом. Пожалуйста, проверьте, если он делает то, что вы хотите:

function sv_disable_repeat_purchase( $purchasable, $product ) {

    // Enter the ID of the product that shouldn't be purchased again
    $non_purchasable_arr = array(
        40021,
        40022
    );

    // Get the ID for the current product (passed in)
    $product_id = $product->is_type( 'variation' ) ? $product->variation_id : $product->id;

    // Bail unless the ID is equal to our desired non-purchasable product
    foreach ( $non_purchasable_arr as $non_purchasable ) {
        if ( $non_purchasable !== $product_id ) {
            return $purchasable;
        }
    }

    // return false if the customer has bought the product
    if ( wc_customer_bought_product( wp_get_current_user()->user_email, get_current_user_id(), $product_id ) ) {
        $purchasable = false;
    }

    // Double-check for variations: if parent is not purchasable, then variation is not
    if ( $purchasable && $product->is_type( 'variation' ) ) {
        $purchasable = $product->parent->is_purchasable();
    }

    return $purchasable;
}

add_filter( 'woocommerce_variation_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 );
add_filter( 'woocommerce_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 );
...