6

我是 WordPress 和 WooCommerce 的新手,我相信我已经确定了产生我想要更改的输出的代码行。

我正在使用 WooCommerce 的免费artificer主题,并且 index.php 有一行:

<h3>
    <?php the_title(); ?>
    <span class="price">
        <?php echo $_product->get_price_html(); ?>
    </span>
</h3>

这会产生类似“Black Stone - $43”的东西(即产品标题 - 价格

我想要“Black Stone
$43”之类的东西
(即产品标题<br/>价格

看起来 ``get_price_html()` 函数有一些过滤器,但文档不是很好,或者我只是不明白如何浏览它。

任何方向将不胜感激。
谢谢。

4

4 回答 4

13

所有的$product->get_price_html(); 产品都是这样的:

<del><span class="amount">£8.00</span>–&lt;span class="amount">£9.00</span></del>
<ins><span class="amount">£7.00</span>–&lt;span class="amount">£8.00</span></ins>

要操作此数据,您必须从该字符串中提取它

如果您使用 WP 过滤器 - 您将get_price_html()在任何地方更改输出,如果您get_price_html()只需要在一个地方更改输出,您应该执行以下操作:

global $product;

$price_html = $product->get_price_html();

$price_html_array = price_array($price_html);

function price_array($price){
    $del = array('<span class="amount">', '</span>','<del>','<ins>');
    $price = str_replace($del, '', $price);
    $price = str_replace('</del>', '|', $price);
    $price = str_replace('</ins>', '|', $price);
    $price_arr = explode('|', $price);
    $price_arr = array_filter($price_arr);
    return $price_arr;
}

现在你在数组中有相同的数据

Array ( [0] => £8.00–£9.00 [1] => £7.00–£8.00 )

你可以用它做任何你想做的事

要应用全局过滤器,您必须添加

add_filter( 'woocommerce_get_price_html', 'price_array', 100, 2 );
于 2014-05-05T16:36:15.537 回答
4

这可能是您正在寻找的过滤器:

add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
function custom_variation_price( $price, $product ) {
    $price = '';
    $price .= woocommerce_price($product->min_variation_price);
    return $price;
}

这只是对其进行更改,以便显示最低价格(仅此而已),因为不清楚您要如何格式化/设置它的样式。您可以通过 $product 对象访问各种其他详细信息以自定义输出。在您的 functions.php 文件中使用它。

于 2013-11-29T19:02:16.227 回答
2

您可以通过修改上述行并在主题custom.css文件中添加一个小的 css 代码来实现这一点。

用这个替换给定的代码:

<h3>
    <?php the_title(); ?>
    <br/>
    <span class="price">
        <?php echo $_product->get_price_html(); ?>
    </span>
</h3>

custom.css并在(推荐)文件或主题文件的最后一行添加以下 css 代码style.css

ul.featured-products li h3 .price::before{
    content : '' !important;
}

请注意:上面的代码已经过测试,可以在 Artificer 1.3.16 版(2016 年 5 月 5 日发布)上正常运行。

希望这可以帮助!

于 2016-12-31T19:05:58.410 回答
0

我根据源代码制作了这个函数。

function extractPrices($product, $currency = "BRL") 
  {
    if($product->is_type( 'simple' )) {
      return (object) ["regular_price" => $product->regular_price, "sale_price" => $product->sale_price];
    }

    $prices = $product->get_variation_prices( true );

    if (!empty( $prices['price'])) {
      $min_price     = current( $prices['price'] );
      $max_price     = end( $prices['price'] );
      $min_reg_price = current( $prices['regular_price'] );
      $max_reg_price = end( $prices['regular_price'] );

      if ( $min_price !== $max_price ) {

          return (object) ["regular_price" => $max_price, "sale_price" => $min_price];

      } elseif ( $product->is_on_sale() && $min_reg_price === $max_reg_price ) {

          return (object) ["regular_price" => $max_reg_price, "sale_price" => $min_price];
     
      } else {

          return (object) ["regular_price" => $max_price, "sale_price" => $min_price];
    
      }
    }
    
    return (object) ["regular_price" => null, "sale_price" => null];

  }

还有一个下车折扣的功能

 function calculeOff($prices): ?int 
  {
    if(!empty($prices->sale_price) && !empty($prices->regular_price)) {
      return round(100 - ($prices->sale_price / $prices->regular_price * 100));
    }
    return null;
  }
  
于 2021-11-19T10:53:13.813 回答