2

我想在 WooCommerce 类别页面中用“...”结尾的短标题截断长产品标题。如果我是对的,类别页面中的产品由“content-product.php”的循环显示。

代码是:

<li<?php echo $class ?>>
<?php do_action( 'woocommerce_before_shop_loop_item' ); ?>

<a href="<?php the_permalink(); ?>">

    <div class="thumbnail">     
        <?php do_action( 'woocommerce_before_shop_loop_item_title' ); ?>

        <?php if ( yiw_get_option( 'shop_show_name' ) ) : ?>
            <strong class="<?php echo $title_position; ?>">
                <?php the_title(); ?>
            </strong>
        <?php endif ?>
    </div>

    <?php do_action( 'woocommerce_after_shop_loop_item_title' ); ?>
</a>

<?php do_action( 'woocommerce_after_shop_loop_item' ); ?>
</li>

我发现很多 PHP 函数可以缩短一个长字符串(这个看起来很简单http://shrtnr.us/r0yfwg),但我无法将该函数应用于the_title()...

如果有人能让我走上正确的道路,我将不胜感激。提前致谢 :)

4

6 回答 6

2

请按照此处给出的使用以下代码,它工作正常 -缩短-woocommerce-product-titles

只需将以下代码放入主题的 functions.php 中即可。

    // Automatically shortens WooCommerce product titles on the main shop, category, and tag pages 
// to a specific number of words
function short_woocommerce_product_titles_words( $title, $id ) {
  if ( ( is_shop() || is_product_tag() || is_product_category() ) && get_post_type( $id ) === 'product' ) {
    $title_words = explode(" ", $title);
    if ( count($title_words) > 5 ) { // Kicks in if the product title is longer than 5 words
      // Shortens the title to 5 words and adds ellipsis at the end
      return implode(" ", array_slice($title_words, 0, 5)) . '...';
    } else {
      return $title; // If the title isn't longer than 5 words, it will be returned in its full length without the ellipsis
    }
  } else {
    return $title;
  }
}
add_filter( 'the_title', 'short_woocommerce_product_titles_words', 10, 2 );
于 2016-12-09T15:15:02.243 回答
2

一个非常常见的问题:有时,WooCommerce 产品标题太长了。最重要的是,您可能还希望保持商店体验一致,并使所有 WooCommerce 产品标题的长度相同。这就是你的做法。

您可以使用简单的 CSS 而不是冗长的 php 代码。这将 100% 用于最新的 woocommerce。

  .shop-products.products .product .product-wrapper .product-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
于 2017-10-11T06:02:31.897 回答
1

这是一个棘手的问题,因为您必须弄清楚您正在调用的 the_title() 函数实际上是什么。最好的猜测是这样做: $title = the_title(); 然后检查 $title 里面的内容,如果它只是纯文本,那么你可以使用你提到的截断函数。如果它不仅仅是纯文本,则必须先过滤掉要截断的实际部分。

于 2012-12-11T21:21:28.240 回答
1

正如 Flobbo 所建议的,我通过 jQuery 找到了一个解决方案。

首先我改变了:<strong class="<?php echo $title_position; ?>"><?php the_title(); ?></strong>

到 :<span class="productname"><strong class="<?php echo $title_position; ?>"><?php the_title(); ?></strong></span>

我的 jQuery 代码(放在前面</body>的是:

$(document).ready(function() {
    $('span.productname').each(function() {
        var title = $.trim($(this).text());
        var max = 31;

        if (title.length > max) {
            var shortText = jQuery.trim(title).substring(0, max).split(" ").slice(0, -1).join(" ") + "...";
            $(this).html('<strong class="below-thumb">' + shortText + '</strong>');
        }
    });
});

仅此而已。这有点 DIY,但它的工作原理:)

编辑 :

上面的 jQuery 函数会根据单词和空格截断字符串(不截断单词)。但是如果你不关心单词,你可以修改函数,如:

$(document).ready(function() {
    $('span.productname').each(function() {
        var title = $.trim($(this).text());
        var max = 30;

        if (title.length > max) {
            var shortText = jQuery.trim(title).substring(0, max - 3) + '...';
            $(this).html('<strong class="below-thumb">' + shortText + '</strong>');
        }
    });
});
于 2012-12-11T22:57:19.397 回答
1
function truncate($text, $limit) {
if (str_word_count($text, 0) > $limit) {
    $words = str_word_count($text, 2);
    $pos = array_keys($words);
    $text = substr($text, 0, $pos[$limit]) . '...';
}
return $text;
}

然后你可以这样做:

  $title = get_the_title();

  <?php echo truncate($title, <w/e number>); ?>

将函数放入functions.php,这样你就可以在任何你想要的地方使用它。

于 2013-08-20T00:56:52.750 回答
0

为此目的有一个插件:Woo Title Limit

于 2016-06-03T06:59:26.363 回答