嘿伙计们,我有一个关于woocommerce的问题,我试图解决几天。
我正在为一个人创建一个网站,他希望我在产品页面上添加一个自定义输入,我不能自己做,所以我在网上使用了一个自由职业者。在产品页面上我
添加到购物车按钮,数量输入和日期输入。
“日期输入”是自由职业者所做的。
问题是,当$ _REQUEST ['thedate']为空时,自定义错误弹出,但产品仍然添加到购物车。
代码:(functions.php)
function add_the_date_validation() {
if ( empty( $_REQUEST['thedate'] )) {
wc_add_notice( __( 'Please enter a date.', 'woocommerce' ), 'error' );
return false;
}
return true;
}
add_action( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );
观点: http://i.stack.imgur.com/a75P6.png
自由职业者所做的其他代码:
function save_add_the_date_field( $cart_item_key, $product_id = null, $quantity= null, $variation_id= null, $variation= null ) {
if( isset( $_REQUEST['thedate'] ) ) {
WC()->session->set( $cart_item_key.'_the_date', $_REQUEST['thedate'] );
}
}
add_action( 'woocommerce_add_to_cart', 'save_add_the_date_field', 1, 5 );
function render_meta_on_checkout_order_review_item( $quantity = null, $cart_item = null, $cart_item_key = null ) {
if( $cart_item_key && WC()->session->__isset( $cart_item_key.'_the_date' ) ) {
echo $quantity. '<dl class="">
<dt class="">Date: </dt>
<dd class=""><p>'. WC()->session->get( $cart_item_key.'_the_date') .'</p></dd>
</dl>';
}
}
add_filter( 'woocommerce_checkout_cart_item_quantity', 'render_meta_on_checkout_order_review_item', 1, 3 );
function the_date_order_meta_handler( $item_id, $values, $cart_item_key ) {
if( WC()->session->__isset( $cart_item_key.'_the_date' ) ) {
wc_add_order_item_meta( $item_id, "the_date", WC()->session->get( $cart_item_key.'_the_date') );
}
}
add_action( 'woocommerce_add_order_item_meta', 'the_date_order_meta_handler', 1, 3 );
function the_date_force_individual_cart_items($cart_item_data, $product_id)
{
$unique_cart_item_key = md5( microtime().rand() );
$cart_item_data['unique_key'] = $unique_cart_item_key;
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data','the_date_force_individual_cart_items', 10, 2 );
答案 0 :(得分:3)
我会说你应该使用Product Add-Ons但它似乎没有日期选择器。无论如何,我会尝试按如下方式修改验证函数:
function add_the_date_validation( $passed ) {
if ( empty( $_REQUEST['thedate'] )) {
wc_add_notice( __( 'Please enter a date.', 'woocommerce' ), 'error' );
$passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );
您想要返回TRUE
变量的当前状态,而不是返回$passed
。我不能保证会工作,因为我不会设置测试它所需的其余代码,但这与我多次做的类似。
另一方面,除非您的意思是将此验证应用于商店中的每个产品,否则您需要使用一些额外的条件逻辑来限制此功能。
答案 1 :(得分:0)
我遇到了这个问题,经过反复试验,解决方法是在:中调整$ priority参数(默认为10)。
add_filter( 'woocommerce_add_to_cart_validation', 'add_the_date_validation', 10, 5 );
和往常一样,我首先尝试了其他所有方法……将其更改为15,然后宾果游戏..!我猜它是在代码优先级较低的代码之前运行的,该代码然后将项目放入购物车。
答案 2 :(得分:-4)
是的,对不起,我是这个论坛的新手。 但是我找到了一个解决方案,我在第900行直接编辑了 class-wc-cart.php ,我在if之前复制了这个函数:
if($passed!=false)
{
do_action( 'woocommerce_add_to_cart', $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data );
}
现在对我来说它有效,我知道这不是最正确的解决方案,但目前它的工作原理,我只有要小心当我更新woocommerce < /强>