我是WooCommerce的新手,以下是我的问题. 我成功地展开了购物车的默认模板,现在它看起来确实如下所示:

Cart page

自定义文件路径:my-theme/woocommerce/cart/cart.php

大多数更改确实发生在cart.php文件中: 下面是表格中内容的 struct ,最后一项是"product-remove"按钮.

表格内容 struct (表格的前three个单元格):

<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>

Question:当有人选中复选框时,我需要知道所选项目的id. 如何通过选中一个复选框来触发一个复选框onChange函数,该函数将执行php代码,将产品ID添加到全局数组中.

应该如何修改以下代码才能实现这一点:

<td class="">
 <input type="checkbox" name="demoCheckBox" value="1" onClick="onClickCheckbox()">
 <script>
   function onClickCheckbox () {
      return "<?php
      echo 'Hello World';
                    ?>"
  }
   

推荐答案

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

然后,您将在您的子主题的函数.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');

经过测试,效果良好.

如果您希望在下单后使用此数据,则必须将其另存为订单中的自定义元数据.

Php相关问答推荐

在PHP中结合每周日程安排和特殊日子查找下一个可用日期

邮箱打开跟踪器不工作时发送邮件使用laravel调度程序

FatFreeFramework上的不同路由

WordPress:将自定义单选输入字段添加到用户配置文件

在php中有没有办法比较两个包含相同枚举类型的枚举数组

如何让PHP变量跨越多个脚本调用?

PHP,ZipArchive删除一个空文件?

如果WooCommerce中存在特定的运输方式,则隐藏其他运输方式

如何将WooCommerce产品属性术语名称显示为链接术语?

WooCommerce常规价格增加额外的附加平价

PHP-准备用于TCP套接字的数据包

未定义的类型';PDF';在Laravel 8

隐藏WooCommerce管理子菜单;主页;来自store 经理

如何在 PHP laravel 中将图像的透明背景转换为白色?

正则表达式将文本替换为标签 html 以字符开头

从 Laravel 机制中排除目录并直接访问该目录

如何使用在产品快速编辑菜单前端的自定义框中 Select 的值更新 woocommerce 产品属性值?

php preg_match 验证 Tiktok 用户名

适当的时区处理 Laravel / Carbon

如何限制for循环php中的条目数