我对 woocommerce 很陌生,这是我的问题。 我成功扩展了购物车的默认模板,现在它看起来像这样:
自定义文件路径:
my-theme/woocommerce/cart/cart.php
大部分更改确实发生在 cart.php 文件中: 这是表中内容的结构,最后一个是“产品删除”按钮。
表格内容结构(表格的前三个单元格):
<td class="">
<input type="checkbox" name="demoCheckBox" value="1" onClick="onClickCheckbox()">
<script>
function onClickCheckbox() {
return "<?php echo 'Hello World';?>"
}
</script>
</td>
<td class="product-thumbnail">
<?php
$thumbnail = apply_filters( 'woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key );
if ( ! $product_permalink ) {
ho $thumbnail; // PHPCS: XSS ok.
} else {
printf( '<a href="%s">%s</a>', esc_url( $product_permalink ), $thumbnail ); // PHPCS: XSS ok.
}
?>
</td>
</td>
<td class="product-name" data-title="<?php esc_attr_e( 'Product', 'woocommerce' ); ?>">
<?php
if ( ! $product_permalink ) {
echo wp_kses_post( $product_name . ' ' );
} else {
/**
* This filter is documented above.
*
* @since 2.1.0
*/
echo wp_kses_post( apply_filters( 'woocommerce_cart_item_name', sprintf( '<a href="%s">%s</a>', esc_url( $product_permalink ), $_product->get_name() ), $cart_item, $cart_item_key ) );
}
do_action( 'woocommerce_after_cart_item_name', $cart_item, $cart_item_key );
// Meta data.
echo wc_get_formatted_cart_item_data( $cart_item ); // PHPCS: XSS ok.
// Backorder notification.
if ( $_product->backorders_require_notification() && $_product->is_on_backorder( $cart_item['quantity'] ) ) {
echo wp_kses_post( apply_filters( 'woocommerce_cart_item_backorder_notification', '<p class="backorder_notification">' . esc_html__( 'Available on backorder', 'woocommerce' ) . '</p>', $product_id ) );
}
?>
</td>
问题1:当有人选择复选框时,我需要知道所选项目的id。 如何通过选择复选框触发复选框 onChange 函数,该函数将执行 php 代码,该代码应将产品 ID 添加到全局数组。
应该如何修改以下代码才能实现这一目标:
<td class="">
<input type="checkbox" name="demoCheckBox" value="1" onClick="onClickCheckbox()">
<script>
function onClickCheckbox () {
return "<?php
echo 'Hello World';
?>"
}
问题 2: 如何在 woocommerce 中保存将在全球范围内持续存在的变量/数组?
您可以使用 WooCommerce 会话变量,因为 Cart 和 Checkout 已经使用它们。
每次选中复选框时,购物车商品密钥和产品 ID pairs 将存储在会话变量(数组)中。如果未选中该复选框,则相关数据将从数组中删除(删除购物车商品时也是如此)。当下订单时,会话变量将被删除。
首先在
cart.php
模板中使用:
<td class="item-checkbox">
<?php $cart_item_cbs = (array) WC()->session->get('cart_items_cbs'); // Get session variable
printf('<input type="checkbox" name="item_cb" value="1" data-id="%s" data-key="%s"%s />',
$_product->get_id(), $cart_item_key, isset($cart_item_cbs[$cart_item_key]) ? ' checked' : '');
?>
</td>
然后您将在子主题的functions.php文件中添加以下内容:
// Javascript code for cart page only
add_action( 'woocommerce_after_cart', 'cart_item_checkbox_js' );
function cart_item_checkbox_js() {
?>
<script>
jQuery(function($) {
if (typeof wc_cart_params === 'undefined')
return false;
const cartForm = '.woocommerce-cart-form',
blockWhite = {message: null, overlayCSS: {background: '#fff', opacity: 0.6}};
$(cartForm).on('change', 'input[name=item_cb]', function(){
const checked = $(this).prop('checked') ? 'yes' : 'no';
$(cartForm).block(blockWhite);
$.ajax({
type: 'POST',
url: wc_cart_params.ajax_url,
data: {
'action' : 'cart_item_cb',
'product_id': $(this).data('id'),
'item_key' : $(this).data('key'),
'checked' : checked
},
success: function (response) {
$(cartForm).unblock();
console.log(response);
},
error: function (error) {
console.log(error);
}
});
})
});
</script>
<?php
}
// The PHP AJAX Receiver
add_action( 'wp_ajax_cart_item_cb', 'get_cart_item_cb_values' );
add_action('wp_ajax_nopriv_cart_item_cb', 'get_cart_item_cb_values');
function get_cart_item_cb_values() {
if ( isset($_POST['product_id']) && isset($_POST['item_key']) && isset($_POST['checked']) ) {
// Get session variable
$cart_item_cbs = (array) WC()->session->get('cart_items_cbs');
$product_id = intval($_POST['product_id']);
$item_key = esc_attr($_POST['item_key']);
if ( $_POST['checked'] == 'yes' ) {
$cart_item_cbs[$item_key] = $product_id; // Add to the array
$message = 'Product ID:' . $product_id . 'added to the array.';
} else {
if ( isset($cart_item_cbs[$item_key]) ) {
unset($cart_item_cbs[$item_key]); // Remove from the array
$message = 'Product ID:' . $product_id . 'removed from the array.';
}
}
if ( isset($message) ) {
WC()->session->set('cart_items_cbs', $cart_item_cbs); // save data
wp_die($message);
}
}
wp_die('Something went wrong.');
}
// When an item is removed from cart, remove it also from our session variable array
add_action( 'woocommerce_cart_item_removed', 'action_remove_cart_item' );
function action_remove_cart_item( $cart_item_key ) {
// Get session variable
$cart_item_cbs = (array) WC()->session->get('cart_items_cbs');
if ( isset($cart_item_cbs[$cart_item_key]) ) {
unset($cart_item_cbs[$cart_item_key]); // Remove from the array
WC()->session->set('cart_items_cbs', $cart_item_cbs); // Save data
}
}
// When order has been created remove the session variable
add_action( 'woocommerce_checkout_order_created', 'remove_custom_session_variable' );
function remove_custom_session_variable( $order) {
if( WC()->session->__isset('cart_items_cbs') ) {
WC()->session->__unset('cart_items_cbs');
}
}
要获取 PHP 中存储的数据数组,您将使用:
$cart_item_cbs = (array) WC()->session->get('cart_items_cbs');
已测试且有效。