php - 将变体描述移至 Woocommerce 产品变量描述

标签 php jquery wordpress templates woocommerce

我正在尝试:在产品选项卡描述区域的单个产品页面上显示可变产品子项的变体描述。

在 WooCommerce 和可变产品中,父级具有存储在 wp_posts->post_content 中的描述,每个子级都有一个附加的 _variation_description 字段。在前端,父项的描述始终可见,并且当选择变体时,子项的_variation_description 将显示。它使用 js 进行更新,并显示在“添加到购物车”按钮之前以及变体的价格。

描述在description.php中用代码调用

the_content();

输出父产品 post_content 数据库字段。 变体描述在variation.php中用代码调用

<script type="text/template" id="tmpl-variation-template">
    <div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
</script>

据我了解,这适用于 wp.template,我还检查了 Javascript Reference wp.template 上的信息 js 位于 add-to-cart-variation.js 中,模板使用

构建
template     = wp.template( 'variation-template' );

然后可以更新数据,我不太了解详细信息。我的理解是所有的js调用都是这样的形式,

form.$singleVariation.html( $template_html );

然后我意识到为什么我不能直接从variation.php复制代码并将其粘贴到description.php,因为它会在表单标记之外。

另一方面,SKU 的数据不是从表单内调用的,而是通过 .product_meta 调用的,因此如果我放置一个带有 class="product_meta"的 div,我可以调用 sku 并使用 js 从任何地方更新它。例如我可以将此代码放入description.php

 <div class="product_meta">
       <?php if ( wc_product_sku_enabled() && ( $product->get_sku() || $product->is_type( 'variable' ) ) ) : ?>
          <?php if ( $sku = $product->get_sku() ) : ?>
             <span class="sku_wrapper"><?php esc_html_e( 'SKU:', 'woocommerce' ); ?> 
             <span class="sku" itemprop="sku"><?php echo $sku; ?></span></span>
          <?php endif; ?>
       <?php endif; ?>
 </div>

而且效果很好。

所以我被困在这里了。我只想在description.php 中动态显示变体描述,并且我想如果我了解 wp.template 在 add-to-cart-variation.js 中的工作原理,我就能弄清楚。但我不能。我不太明白内容是如何以变体形式更新的,以及与 SKU 中的数据有什么区别。

也许有一个完全简单易行的解决方案来满足我想要的,也许我的方法太复杂了。我将非常高兴任何想法或提示或只是指出正确的方向。

最佳答案

这可以通过一些 jQuery 代码来完成,我们将在其中将变体描述复制到变量产品描述选项卡中。但首先您需要对某些模板进行一些非常小的更改。

这里是相关的官方文档:Template structure & Overriding templates via a theme

模板更改和必要的代码:

  1. 关于single-product/tabs/description.php模板文件中,您将替换该行:

    <?php the_content(); ?>
    

    通过以下行(我们只需添加一个带有选择器类的周围 html <div> 标签):

    <div class="product-post-content"><?php the_content(); ?></div>
    
  2. 关于single-product/add-to-cart/variation.php模板文件中,您将替换该行:

    <div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
    

    通过以下行(我们只是隐藏变体描述):

    <div class="woocommerce-variation-description" style="display:none;">{{{ data.variation.variation_description }}}</div>
    
  3. 现在 jQuery (已注释) 代码(仅在可变产品的单个产品页面上):

    add_action( 'wp_footer', 'move_variation_description' );
    function move_variation_description(){
        global $product;
        // Only on single product pages for variable products
        if ( ! ( is_product() && $product->is_type('variable') ) ) return;
        // jQuery code
        ?>
        <script type="text/javascript">
            jQuery(function($){
                a = '.woocommerce-variation-description', b = a+' p', c = 'input.variation_id',
                d = '#tab-description .product-post-content', de = $(d).html();
    
                // On load, adding a mandatory very small delay
                setTimeout(function(){
                    // variation ID selected by default
                    if( '' != $(c).val() && $(a).text() != '' )
                        $(d).html($(a).html());
                }, 300);
    
                // On live event (attribute select fields change)
                $('table.variations select').on( 'blur', function(){
                    // variation ID is selected
                    if( '' != $(c).val() && $(a).text() != '' ){
                        $(d).html($(a).html()); // We copy the variation description
                    }
                    // No variation ID selected
                    else {
                        $(d).html($(a).html()); // We set back the variable product description
                    }
                    console.log($('input.variation_id').val()); // TEST: Selected variation ID … To be removed
                });
            });
        </script>
        <?php
    }
    

    此代码位于事件子主题(或事件主题)的 function.php 文件中。

经过测试并有效。

其他相关主题:

关于php - 将变体描述移至 Woocommerce 产品变量描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51330304/

相关文章:

php - 获取非对象的属性错误

javascript - 添加后选择部分文本

php - Woocommerce 使用 ajax 在 "endless scroll"之后在新选项卡中打开产品链接

php - Symfony:如何从数据库中刷新经过身份验证的用户?

php - 如何在 PHP 中创建哈希顶部列表?

php - 使用 simpleXML 编辑 XML

javascript - 使用 jQuery getJSON 并在处理结果后触发一个函数...应该可以...但不行

jquery - AJAX 加载的内容是否得到 "document.ready"?

linux - 亚马逊 Linux AMI : NGINX: upstream timed out (110: Connection timed out) while reading response header from upstream

javascript - Wordpress 管理员 ajax.php 400 错误请求