向购物车项目添加一个复选框,用于在 WooCommerce 中存储一些数据

问题描述 投票:0回答:1

我对 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 . '&nbsp;' );
        } 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 中保存将在全球范围内持续存在的变量/数组?

php html ajax woocommerce hook-woocommerce
1个回答
0
投票

您可以使用 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');

已测试且有效。

© www.soinside.com 2019 - 2024. All rights reserved.