首页 > 解决方案 > 如何使用 Timber 和 WooCommerce 为单个产品获取正确的上下文?

问题描述

在构建我最新的 Woocommerce 项目时,我一直在使用 Timber。这一切都很好,但我有一个我无法弄清楚的问题:单个产品页面上的上下文不正确。在单品页面上,我有相关产品,循环中最后一个产品的上下文用作当前单品的上下文。

关于使用 Timber 和 Woocommerce 的文档有限。虽然我已经尝试了所有这些,但它似乎并没有解决问题。

function timber_set_product($post)
{
    global $product;

    if (is_woocommerce() || is_search() || is_front_page()) {
        $product = wc_get_product($post->ID);
    }
}

我究竟做错了什么?我的设置与https://github.com/timber/timber/blob/master/docs/guides/woocommerce.md相同,但它对我来说无法正常工作。

提前致谢!

标签: wordpresswoocommercetimber

解决方案


将 WooCommerce 与 Timber 集成可能有点复杂,但一旦您知道一些技巧,它就可以正常工作。

主要问题出现在您想要覆盖 WooCommerce 时,因为您必须以经典的 Wordpress 方式在主题中的“/woocommerce”文件夹中复制您想要覆盖的插件中的文件,而不是在 Timber 中在 PHP 和 TWIG 文件中分离关注点的方法。不过这里不需要。

我们获取产品上下文和相关产品的一种方法是在 woocommerce.php 中设置产品:

$context = Timber::get_context();

if (is_singular('product')) {

    $context['page']    = Timber::get_post();
    $product            = get_product( $context['page']->id );
    $context['product'] = $product;

    $args = array(
        'post_type'            => 'product',
        'posts_per_page'       => -1,
        'orderby'              => 'DESC',
        'post__in'             => $product->get_related(),
        'post__not_in'         => array( $product->id )
    ) ;
    $context['related'] = Timber::get_posts( $args );

    Timber::render('woo/single-product.twig', $context);

}

推荐阅读