php - 如何使用 WooCommerce 中的可用或自定义数据扩展 "variation.php"模板文件

标签 php wordpress templates woocommerce product

我想在 WooCommerce 中自定义 variation.php 文件

路径:/themes/theme-child/woocommerce/single-product/add-to-cart/variation.php

我想删除显示价格的部分并显示我的自定义数据:

<div class="woocommerce-variation-price">{{{ data.variation.price_html }}}</div>

现在我想输入每个变量的正常价格、促销价格、促销起始日期和促销日期。即当选择每个变量时,显示所需的数据。

对于简单的产品,我很容易做到这一点,但我不知道如何获取可变产品的常规价格、促销价格等,以便当您转到每个变量时,该变量的数据将显示。

在寻找答案时我发现:

不幸的是,这并不能完全回答我的问题。


例如:我想显示每个变量的正常价格和销售价格,意思是:

  • 变量 1:正常价格 = 20 美元 |售价 = 15 美元
  • 变量 2:正常价格 = 30 美元 |售价 = 20 美元
  • 变量 3:正常价格 = 40 美元 |售价 = 25 美元

如果用户选择变量 1,它将显示正常价格 20 美元和促销价 15 美元。有什么建议吗?

最佳答案

首先应该提到的是,variation.php 模板文件与其他 WooCommerce 模板文件略有不同,这是因为它是基于 JavaScript 的模板。

参见:https://codex.wordpress.org/Javascript_Reference/wp.template

下面的代码取自 /single-product/add-to-cart/variation.php模板文件(第 16-20 行@版本 2.5.0)

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

目的是用相同的语法扩展此文件或应用相同的方法!


/includes/class-wc-product-variable.php(第346-394行@version 3.0.0)中的get_available_variation()函数在其中发挥着重要作用:

/**
 * Returns an array of data for a variation. Used in the add to cart form.
 *
 * @since  2.4.0
 * @param  WC_Product $variation Variation product object or ID.
 * @return array|bool
 */
public function get_available_variation( $variation ) {
    if ( is_numeric( $variation ) ) {
        $variation = wc_get_product( $variation );
    }
    if ( ! $variation instanceof WC_Product_Variation ) {
        return false;
    }
    // See if prices should be shown for each variation after selection.
    $show_variation_price = apply_filters( 'woocommerce_show_variation_price', $variation->get_price() === '' || $this->get_variation_sale_price( 'min' ) !== $this->get_variation_sale_price( 'max' ) || $this->get_variation_regular_price( 'min' ) !== $this->get_variation_regular_price( 'max' ), $this, $variation );

    return apply_filters(
        'woocommerce_available_variation',
        array(
            'attributes'            => $variation->get_variation_attributes(),
            'availability_html'     => wc_get_stock_html( $variation ),
            'backorders_allowed'    => $variation->backorders_allowed(),
            'dimensions'            => $variation->get_dimensions( false ),
            'dimensions_html'       => wc_format_dimensions( $variation->get_dimensions( false ) ),
            'display_price'         => wc_get_price_to_display( $variation ),
            'display_regular_price' => wc_get_price_to_display( $variation, array( 'price' => $variation->get_regular_price() ) ),
            'image'                 => wc_get_product_attachment_props( $variation->get_image_id() ),
            'image_id'              => $variation->get_image_id(),
            'is_downloadable'       => $variation->is_downloadable(),
            'is_in_stock'           => $variation->is_in_stock(),
            'is_purchasable'        => $variation->is_purchasable(),
            'is_sold_individually'  => $variation->is_sold_individually() ? 'yes' : 'no',
            'is_virtual'            => $variation->is_virtual(),
            'max_qty'               => 0 < $variation->get_max_purchase_quantity() ? $variation->get_max_purchase_quantity() : '',
            'min_qty'               => $variation->get_min_purchase_quantity(),
            'price_html'            => $show_variation_price ? '<span class="price">' . $variation->get_price_html() . '</span>' : '',
            'sku'                   => $variation->get_sku(),
            'variation_description' => wc_format_content( $variation->get_description() ),
            'variation_id'          => $variation->get_id(),
            'variation_is_active'   => $variation->variation_is_active(),
            'variation_is_visible'  => $variation->variation_is_visible(),
            'weight'                => $variation->get_weight(),
            'weight_html'           => wc_format_weight( $variation->get_weight() ),
        ),
        $this,
        $variation
    );
}

该函数中的 $variation_data 被传递/转换为 variation.php 模板文件,默认为 variation_descriptionprice_html availability_html 用于 variation.php 模板文件。

但是,在上面的函数中,您会看到默认情况下会传递更多数据,例如 attributesbackorders_allowed 等。

例如,如果您将 variation.php 模板文件中的代码(按照适当的方法覆盖模板文件)更改为:

<script type="text/template" id="tmpl-variation-template">
    <div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
    <div class="woocommerce-variation-price">{{{ data.variation.price_html }}}</div>
    <div class="woocommerce-variation-availability">{{{ data.variation.availability_html }}}</div>
    <div class="woocommerce-variation-regular-price">{{{ data.variation.display_regular_price }}}</div>
    <div class="woocommerce-variation-display-price">{{{ data.variation.display_price }}}</div>
</script>

您将看到现在还自动显示 display_pricedisplay_regular_price。这是因为默认情况下它已经可用。


但是如果您想显示默认情况下不可用的数据怎么办?

为此,您可以使用 woocommerce_available_variation 过滤器 Hook ,然后编辑 variation.php 模板文件:

步骤 1) 代码位于事件子主题(或事件主题)的 functions.php 文件中

function filter_woocommerce_available_variation( $variation_data, $product, $variation ) {
    // Add extra data
    $variation_data['my_custom_data'] = __( 'My custom data', 'woocommerce' );

    return $variation_data;
}
add_filter( 'woocommerce_available_variation', 'filter_woocommerce_available_variation', 10, 3 );

步骤 2)variation.php 模板文件中添加以下行:

<div class="woocommerce-variation-my-custom-data">{{{ data.variation.my_custom_data }}}</div>

结果是现在显示我们的自定义数据,只是每个变体都是相同的。为了避免这种情况,我们可以使用传递给 woocommerce_available_variation 过滤器 Hook 的额外参数,即 $product$variation


假设我们要为每个变体使用 date_on_sale_fromdate_on_sale_to(如果已设置)。然后你得到:

步骤 1) 代码位于事件子主题(或事件主题)的 functions.php 文件中

function filter_woocommerce_available_variation( $variation_data, $product, $variation ) {
    // Getters: when NOT empty, get data in the desired format
    $date_on_sale_from = ! empty( $variation->get_date_on_sale_from() ) ? $variation->get_date_on_sale_from()->format( 'j F Y' ) : '';
    $date_on_sale_to = ! empty( $variation->get_date_on_sale_to() ) ? $variation->get_date_on_sale_to()->format( 'j F Y' ) : '';

    // Push
    $variation_data['woocommerce_available_variation'] = array(
        'is_on_sale' => $variation->is_on_sale(),
        'from'       => $date_on_sale_from,
        'to'         => $date_on_sale_to
    );

    return $variation_data;
}
add_filter( 'woocommerce_available_variation', 'filter_woocommerce_available_variation', 10, 3 );

结果会将以下内容添加到 $variation_data 中:

[woocommerce_available_variation] => Array
    (
        [is_on_sale] => 1
        [from] => 12 August 2022
        [to] => 31 March 2024
    )

步骤 2)variation.php 模板文件中添加/更改以下行:

<script type="text/template" id="tmpl-variation-template">
    <div class="woocommerce-variation-description">{{{ data.variation.variation_description }}}</div>
    <div class="woocommerce-variation-price">{{{ data.variation.price_html }}}</div>
    <div class="woocommerce-variation-availability">{{{ data.variation.availability_html }}}</div>
    <div class="woocommerce-variation-date-on-sale-from">{{{ data.variation.woocommerce_available_variation.from }}}</div>
    <div class="woocommerce-variation-date-on-sale-to">{{{ data.variation.woocommerce_available_variation.to }}}</div>
</script>

简而言之,过滤器钩子(Hook)中使用的命名方式,扩展$variation_data也应该在模板文件中使用。

关于php - 如何使用 WooCommerce 中的可用或自定义数据扩展 "variation.php"模板文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73317071/

相关文章:

c++ - 模板参数名称作为基类

php - Laravel 在嵌套中间件组中排除路由

javascript - php中文件上传的文件路径

javascript - 无符号右移函数不适用于负输入

php - 如何从 woocommerce 的购物车页面获取特定产品数量

C++ 模板函数,可以采用 Eigen::vector 或 std::vector

php - 创建新菜单项 - Wordpress

php - 使用 WordPress 插件编码标准和 Php Codesniffer 验证我的插件时出现 "posts_per_page"= -1 错误

css - Angular 6 ngb-bootstrap 模态没有显示,因为 div 包含引导 css

c++ - 在模板类的复制构造函数中使用默认值时出错