我已按照本指南将Woocommerce集成到Timber中: https://timber.github.io/docs/guides/woocommerce/
我也在functions.php
add_action( 'after_setup_theme', 'add_woocommerce_support' );
function add_woocommerce_support() {
add_theme_support( 'woocommerce' );
}
我的woocommerce.php
与指南中的完全相同:
<?php
if ( ! class_exists( 'Timber' ) ){
echo 'Timber not activated. Make sure you activate the plugin in <a href="/wp-admin/plugins.php#timber">/wp-admin/plugins.php</a>';
return;
}
$context = Timber::get_context();
$context['sidebar'] = Timber::get_widgets( 'shop-sidebar' );
if ( is_singular( 'product' ) ) {
$context['post'] = Timber::get_post();
$product = wc_get_product( $context['post']->ID );
$context['product'] = $product;
// Get related products
$related_limit = wc_get_loop_prop( 'columns' );
$related_ids = wc_get_related_products( $context['post']->id, $related_limit );
$context['related_products'] = Timber::get_posts( $related_ids );
// Restore the context and loop back to the main query loop.
wp_reset_postdata();
Timber::render( 'views/woo/single-product.twig', $context );
} else {
$posts = Timber::get_posts();
$context['products'] = $posts;
if ( is_product_category() ) {
$queried_object = get_queried_object();
$term_id = $queried_object->term_id;
$context['category'] = get_term( $term_id, 'product_cat' );
$context['title'] = single_term_title( '', false );
}
Timber::render( 'views/woo/archive.twig', $context );
}
但是,每当我尝试访问产品页面时,都会出现此错误
Fatal error: Uncaught Error: Call to a member function is_on_sale() on null in /app/wp-content/plugins/woocommerce/templates/single-product/sale-flash.php on line 30
这意味着全局$product
为null
。
在错误行之前直接添加$product = wc_get_product($post->ID)
可以解决此问题,但这显然不是解决方法,因为我要修改核心文件。
我在这里错过了什么吗?
答案 0 :(得分:0)
当然弄乱核心文件不是一个好主意。
您已经通过了该产品
$product = wc_get_product( $context['post']->ID );
要使该产品与单个产品页面中的现有WooCommerce模板文件一起使用,我认为如果在$product
条件下设置WooCommerce的if ( is_singular( 'product' ) )
全局设置会有所帮助,以便上面的行将用所需的数据覆盖(可能为空)全局变量:
if ( is_singular( 'product' ) ) {
// Get product global so that we can overwrite it afterwards.
global $product;
$post = Timber::get_post();
// Overwrite product global.
$product = wc_get_product( $post->ID );
$context['post'] = $post;
$context['product'] = $product;
// Get related products
$related_limit = wc_get_loop_prop( 'columns' );
$related_ids = wc_get_related_products( $context['post']->id, $related_limit );
$context['related_products'] = Timber::get_posts( $related_ids );
// Restore the context and loop back to the main query loop.
wp_reset_postdata();
Timber::render( 'views/woo/single-product.twig', $context );
答案 1 :(得分:0)
这本身不是解决方案,但我设法找到了罪魁祸首-这是Timber的get_post()
函数覆盖Woocommerce的$product
的方式。
建议的解决方法之一是在functions.php
中添加此方法-到目前为止,Timber 2.0会提供适当的解决方案,似乎对我来说仍然有效。
add_action( 'the_post', 'wc_setup_product_data_fix',11 );
function wc_setup_product_data_fix() {
remove_action( 'the_post', 'wc_setup_product_data' );
return;
}