Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Woocommerce:用户只能购买一次产品_Php_Mysql_Wordpress_Woocommerce - Fatal编程技术网

Php Woocommerce:用户只能购买一次产品

Php Woocommerce:用户只能购买一次产品,php,mysql,wordpress,woocommerce,Php,Mysql,Wordpress,Woocommerce,我可以在主题的functions.php文件中添加哪些内容,以便用户只能购买一次产品?就像他们以前在商店里买过任何产品一样,他们被禁止再次购买 我想象代码看起来像这样(伪代码),并使用woocommerce\u add\u cart\u item\u数据过滤器 add_filter( 'woocommerce_add_cart_item_data', 'woo_check_not_bought_before' ); function woo_check_not_bought_before( $

我可以在主题的functions.php文件中添加哪些内容,以便用户只能购买一次产品?就像他们以前在商店里买过任何产品一样,他们被禁止再次购买

我想象代码看起来像这样(伪代码),并使用woocommerce\u add\u cart\u item\u数据过滤器

add_filter( 'woocommerce_add_cart_item_data', 'woo_check_not_bought_before' );

function woo_check_not_bought_before( $cart_item_data ) {

    global $woocommerce;

    // Some MYSQL to check if product was bought before

    if ($bought_before == 'true') {       
         $woocommerce->cart->empty_cart();
    }

    // Echo some text to explain why you can only buy the product once

    return $cart_item_data;
}

您可以使用此代码来实现您的需求。在主题中创建一个名为woocommerce的文件夹。然后在其中创建一个名为loop的文件夹。然后在其中创建add-to-cart.php文件,并编写以下代码:

如果(!defined('ABSPATH'))退出;//如果直接访问,则退出
全球$产品;
$current_user=wp_get_current_user();
如果(wc_客户_购买了_产品($current_user->user_email,$current_user->ID,$product->ID)){
echo“购买”;
}
其他的
{
回显应用过滤器('woocommerce\u loop\u add\u to\u cart\u link',
sprintf(“”,
esc_url($product->add_to_cart_url()),
esc_attr($product->id),
esc_attr($product->get_sku()),
$product->is_purchasable()?“添加到购物车按钮”:“,
esc_attr($product->product_type),
esc_html($product->add_to_cart_text())
),
$product);
} 

但用户仍然可以使用不同的帐户再次购买该产品

添加到Wisdmlab的答案中,您还需要编辑“添加到购物车”按钮的快捷码和其他实例

为此,请创建另一个文件夹: /wp内容/主题/[主题]/woocommerce/单一产品/添加到购物车/

在该文件夹中创建一个文件:simple.php并添加以下代码:

<?php
/**
 * Simple product add to cart
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     2.1.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

global $product;

if ( ! $product->is_purchasable() ) {
    return;
}

?>

<?php
    // Availability
    $availability      = $product->get_availability();
    $availability_html = empty( $availability['availability'] ) ? '' : '<p class="stock ' . esc_attr( $availability['class'] ) . '">' . esc_html( $availability['availability'] ) . '</p>';

    echo apply_filters( 'woocommerce_stock_html', $availability_html, $availability['availability'], $product );
?>

<?php if ( $product->is_in_stock() ) : ?>

    <?php do_action( 'woocommerce_before_add_to_cart_form' ); ?>

    <form class="cart" method="post" enctype='multipart/form-data'>
        <?php do_action( 'woocommerce_before_add_to_cart_button' ); ?>

        <?php
            if ( ! $product->is_sold_individually() ) {
                woocommerce_quantity_input( array(
                    'min_value'   => apply_filters( 'woocommerce_quantity_input_min', 1, $product ),
                    'max_value'   => apply_filters( 'woocommerce_quantity_input_max', $product->backorders_allowed() ? '' : $product->get_stock_quantity(), $product ),
                    'input_value' => ( isset( $_POST['quantity'] ) ? wc_stock_amount( $_POST['quantity'] ) : 1 )
                ) );
            }
        ?>

        <input type="hidden" name="add-to-cart" value="<?php echo esc_attr( $product->id ); ?>" />
        <?php $current_user = wp_get_current_user();

        if ( wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product->id)) { echo '<span class="product-purchased">Purchased</span>';}
        else { ?><button type="submit" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button><?php }?>

        <?php do_action( 'woocommerce_after_add_to_cart_button' ); ?>
    </form>

    <?php do_action( 'woocommerce_after_add_to_cart_form' ); ?>

<?php endif; ?>

然后,您还可以使用css类编辑“购买的”文本:product Purchased


如果您想让external.php、grouped.php、variable.php的功能也适用于这些产品类型,则需要使用不同的代码添加单独的文件。

这里有一个简单的解决方案

add_filter('woocommerce_add_to_cart_validation','rei_woocommerce_add_to_cart_validation',20, 2);
function rei_woocommerce_add_to_cart_validation($valid, $product_id){
    $current_user = wp_get_current_user();
    if ( wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product_id)) {
        wc_add_notice( __( 'Purchased', 'woocommerce' ), 'error' );
        $valid = false;
    }
    return $valid;
}
截图


但问题是,任何人都可以创建新用户并再次购买。

这看起来很棒。不幸的是,正如您所说,我已经将该文件添加到我的主题中:/themes/squareone/woocommerce/loops/add-to-cart.php,它似乎不起作用。是否需要检查它是否被调用而不是原始文件夹?嗨,Alex,你应该将文件夹命名为“loop”,而不是“loops”。因此,它类似于/themes/squareone/woocommerce/loop/add-to-cart.php这不会阻止用户多次购买产品。这只会删除“添加到购物车”按钮。。还有其他方法可以将产品添加到购物车。。。那些不使用按钮的人…很好的简单解决方案,兄弟。有没有任何片段可以知道客户之前购买产品的次数。还是产品购买历史?
add_filter('woocommerce_add_to_cart_validation','rei_woocommerce_add_to_cart_validation',20, 2);
function rei_woocommerce_add_to_cart_validation($valid, $product_id){
    $current_user = wp_get_current_user();
    if ( wc_customer_bought_product( $current_user->user_email, $current_user->ID, $product_id)) {
        wc_add_notice( __( 'Purchased', 'woocommerce' ), 'error' );
        $valid = false;
    }
    return $valid;
}