我已经建立了一个自定义销售页面,我要在该页面上执行来自相同输入值(每种产品一个输入值)的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()
表单处理。如果我成功了,我会在这里发布结果。
非常感谢,
尼古拉斯