我有一个自定义模板文件,呈现了一些产品及其尝试添加到“添加到购物车”中的按钮,这些都是我试图手动实现的。按下“添加到购物车”后,页面将重新加载,并且包含某些数据的$ _POST变量将添加新产品。 'cart_contents_count'也反射(reflect)了添加的项目。但是,当我进入购物车页面时,它是空的。请参见以下代码。

global $woocommerce;
if ( isset( $_POST['AddedToCart'] ) ) {
$woocommerce->cart->add_to_cart($_POST['event'], $_POST['qty']);
}
$cart_total = $woocommerce->cart->cart_contents_count;

但是,当我转到正常的默认商店页面(/shop/)并从那里添加产品时,我的购物车页面指示已添加该产品。当我现在转到我的自定义页面并通过“添加到购物车”按钮添加产品​​时,它可以完美运行。

在我看来,在运行上述代码之前,我必须检查Cart Session是否已初始化,如果尚未初始化,则将其初始化。有人可以为我确认我理解正确并向我展示如何初始化购物车吗?

最佳答案

如果您的自定义表单位于页面模板上,则这是一种解决方案。这段代码在您的functions.php文件中。确保将yourtheme_template更改为更独特的名称。另外,将$session_templates数组中的项目更改为要使用此过滤器的模板文件名。它使用了template_include过滤器,这不是一个易于跟踪的过滤器,更不用说$woocommerce->session->set_customer_session_cookie(true)了-特别感谢@vrazer(在twitter上)的帮助。

function yourtheme_template($template) {

//List of template file names that require WooCommerce session creation
$session_templates = array(
    'page-template-file-name.php', 'another-page-template-filename.php'
);

//Split up the template path into parts so the template file name can be retrieved
$parts = explode('/', $template);

//Check the template file name against the session_templates list and instantiate the session if the
//template is in the list and the user is not already logged in.  If the session already exists from
//having created a cart, WooCommerce will not destroy the active session
 if (in_array($parts[count($parts) - 1], $session_templates)  && !is_user_logged_in()) {
 global $woocommerce;

  $woocommerce->session->set_customer_session_cookie(true);
 }

 return $template;
}

//Filter to run the WooCommerce conditional session instantiation code
add_filter('template_include', 'yourtheme_template');

关于wordpress - 如何正确初始化Woocommerce购物车,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24477698/

10-14 14:42