WooCommerce自定义销售页面-未保存Cookie和购物车

时间:2019-05-26 17:47:55

标签: php wordpress woocommerce

我已经建立了一个自定义销售页面,我要在该页面上执行来自相同输入值(每种产品一个输入值)的add_to_cart操作和/或两种不同产品的update_cart数量以及单一形式POST。使用自定义代码执行此操作的原因是仅关注少数几种产品,并且只允许使用一个提交按钮来添加和更新数量。

如果用户已登录或已经设置了购物车cookie,那么它将运行良好。 我需要帮助以使其适合新访客。

我在下面放置了一种产品的示例代码。如果我设置了Cookie或购物车中有产品,它就可以工作。

<?php

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly
}

// shortcode [question_code]
function question_code_shortcode() 
{
    // check to enable saving pages which use this shortcode
    if ( (! is_admin()) && is_object(WC()->cart) ) 
    {

        ob_start();

        $stdbox_id = 30;
        unset($qty_in_cart_stdbox);
        $cart_updated = false;  // unused flag which might be useful

        $cart_items = WC()->cart->get_cart();
        foreach ($cart_items as $cart_item_key => $cart_item)
        {
            if ( $cart_item['product_id'] == $stdbox_id ) {
                $qty_in_cart_stdbox = $cart_item['quantity'];
                $stdbox_cart_key = $cart_item_key;
            }
        }

        if ( (is_object(WC()->cart)) && ($_SERVER["REQUEST_METHOD"] == "POST") && (isset($_POST['qty-stdbox'])) )
        {
            $qty_stdbox = (0 < intval($_POST['qty-stdbox'])) ? intval($_POST['qty-stdbox']) : 0;
            echo 'a) qty_stdbox = ' . $qty_stdbox . '<br>';

            if (isset($qty_in_cart_stdbox)) {
                echo 'b) quantity before update = ' . $qty_in_cart_stdbox . '<br>';
                WC()->cart->set_quantity( $stdbox_cart_key, $qty_stdbox, true );
                $qty_in_cart_stdbox = $qty_stdbox;
                echo 'c) updated quantity = ' . $qty_in_cart_stdbox . '<br>';
                $cart_updated = true;
            } elseif ($qty_stdbox > 0) {
                echo 'd) quantity to be added = ' . $qty_stdbox . '<br>';
                WC()->cart->add_to_cart( $stdbox_id , $qty_stdbox);
                $qty_in_cart_stdbox = $qty_stdbox;
                echo 'e) newly added quantity = ' . $qty_in_cart_stdbox . '<br>';
                $cart_updated = true;
            }
        }

        ?>
        <div style="text-align: center;">
        <form name="question-action" action="./" method="POST">

        <label for="qty-stdbox">Choose how many boxes</label>
        <br>
        <!-- set value to the value just submitted -->
        <input name="qty-stdbox" type="number" min="0" value="<?php echo isset($qty_in_cart_stdbox) ? esc_html($qty_in_cart_stdbox) : ''; ?>"/>
        <br>
        <br>

        <input type="submit" name="iself-boxes" value="Choose storage"/>

        </form>
        </div>

        <?php

        /**
         * Print selected fields within the cart contents
         * after the form submit has been processed, showing
         * that the cart picks up the values added, but only updates
         * the cart if there is already a product in the cart.
         */
        function print_cart_contents($cart_contents)
        {
            echo '<pre>';
            echo 'Cart contents: product_id, quantity, key and data_hash<br>';
            print_r(wp_list_pluck($cart_contents, "product_id"));
            print_r(wp_list_pluck($cart_contents, "quantity"));
            print_r(wp_list_pluck($cart_contents, "key"));
            print_r(wp_list_pluck($cart_contents, "data_hash"));
            // Alternative print
            // echo 'Cart contents<br>';
            // print_r($cart_contents);
            echo '</pre>';
            return $cart_contents;
        } 

        $cart_items = WC()->cart->get_cart();
        print_cart_contents($cart_items);

        $temp_content = ob_get_contents();
        ob_end_clean();

        return $temp_content;
    }
}

add_shortcode( 'question_code', 'question_code_shortcode' );

?>

我已经设置了:

  • 在激活的子主题文件夹中另存为question-shortcode.php的文件;
  • product_id设置为与WooCommerce测试站点中的产品匹配的数字;
  • functions.php中的一行要加载:

    require(realpath(__DIR__) . '/question-shortcode.php');
    
  • 短代码[question_code]被添加为新页面上的唯一条目。

代码植入

一个简单的形式返回数量编号。在我的情况下,我使用的是固定的product_id

我正在按照以下思路处理表格中的POST: add_to_cart_action()update_cart_action()。 我正在使用简单的产品,所以我正在使用

WC()->cart->add_to_cart( $product_id, $quantity );

位于add_to_cart_handler_simple()下方的add_to_cart_action(),并且

WC()->cart->set_quantity( $cart_item_key, $quantity, true );

WC_Cart中方法的代码在这里:add_to_cart()set_quantity()

我正在使用

$cart_items = WC()->cart->get_cart();

获取现有的$cart_items$cart_item_key的{​​{1}}(如果购物车已存在)。

为使其正常工作,我发现我应该已经设置了以下cookie:

set_quantity()

使它工作的想法

我显然错过了一些东西。

我希望能有任何想法来帮助它为该网站的新访问者工作,他们在到达页面时没有设置购物车Cookie。

我一直在尝试的其他事情

我一直在研究woocommerce_cart_hash woocommerce_items_in_cart wp_woocommerce_session_ 中的方法,该文件包含在WC_Cart_Session中。我尝试添加:

class-wc-cart.php

但是它们会导致“致命错误”。

我可以WC()->cart->session->set_cart_cookies() and WC()->cart->session->maybe_set_cart_cookies() 作为访客

add_to_cart

,我使用单独的表单<a href="./?add-to-cart=30&quantity=4" class="btn" role="button">Add to cart directly</a> 来处理此问题,并且可以使用在StackOverflow上找到的多个this idea产品来完成此操作。但是,我也想更新数量,而不是只想更改购物车页面上的购物车内容。

我可以看到,我可以像使用POST在{{1 }}方法。

在等待帮助的同时,我将尝试更紧密地重现/检查add_action()表单处理。如果我成功了,我会在这里发布结果。

非常感谢,

尼古拉斯

0 个答案:

没有答案