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