有没有办法通过functions.php更改WooCommerce add-to-cart表单?
目标是为其他产品添加复选框。选中该复选框后,单击“添加到购物车”按钮后,该产品也将添加到购物车中。
我正在寻找一种不依赖于javascript的解决方案。
答案 0 :(得分:3)
更好的标题是" WooCommerce向上销售为复选框" 。
许多研究和解决这个问题的策略使我找到了一个我认为在开始时甚至都不可能的解决方案。
解决方案现在正是我想要的。非JavaScript,无模板覆盖,但是对functions.php的简单而纯粹的补充。它适用于简单和可变的产品(也可能是分组和外部产品)。
它仍然缺少一些不错的功能。如果向上销售是可变产品,那么它还无法运作。每件商品或订单的数量选择和限制向上销售也是很好的补充。基于下面的代码,添加这些功能不应该是一个大问题。
// create the checkbox form fields and add them before the cart button
add_action( 'woocommerce_before_add_to_cart_button', 'action_woocommerce_before_add_to_cart_form', 10, 0 );
function action_woocommerce_before_add_to_cart_form(){
global $woocommerce, $product;
// get the product up-sells
$upsells = $product->get_upsells();
// store the number of up-sells and pass it on to the add-to-cart hook
?>
<input type="hidden" name="upsells_size" value="<?php echo(sizeof($upsells)); ?>">
<div id="wb-upsell-div">
<?php
// iterate through all upsells and add an input field for each
$i = 1;
foreach( $upsells as $value ){
$product_id = $value;
?>
<input id="wb-upsell-checkboxes" type="checkbox" name="upsell_<?php echo($i) ?>" value="<?php echo($product_id); ?>"><?php echo( '<a href="' . esc_url( get_permalink( $product_id )) . '" target="_blank">' . get_the_title( $product_id ) . "</a>". " ($" . get_post_meta( $product_id, '_regular_price', true) . ")"); ?><br>
<?php
$i++;
}
?>
</div>
<?php
}
// function to add all up-sells, where the checkbox have been checked, to the cart
add_action('woocommerce_add_to_cart', 'custom_add_to_cart', 10, 3);
function custom_add_to_cart() {
global $woocommerce;
// get the number of up-sells to iterate through
$upsell_size = $_POST['upsells_size'];
// iterate through up-sell fields
for ($i=1; $i<=$upsell_size; $i++){
// get the product id of the up-sell
$product_id = $_POST['upsell_' . $i];
$found = false;
//check if product already in cart
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
// if product not found, add it
if ( ! $found )
WC()->cart->add_to_cart( $product_id );
} else {
// if no products in cart, add it
WC()->cart->add_to_cart( $product_id );
}
}
}
这是用于格式化<div>
和复选框的CSS。它进入了style.css文件:
#wb-upsell-div {
margin-top: 10px;
margin-bottom: 20px;
}
#wb-upsell-checkboxes{
}
答案 1 :(得分:1)
所以对这个问题有一个实际的答案,你可以使用钩子在添加到购物车<form>
中添加你想要的任何内容。例如:
add_action( 'woocommerce_before_add_to_cart_button', 'so_34115452_add_input' );
function so_34115452_add_input(){
echo '<input type="checkbox" name="something"/>' . __( 'Some Checkbox', 'text-domain' );
}