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

ここで指定されているように、次のコードを使用してください。正常に動作します - short-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 に答える
1

呼び出している the_title() 関数から実際に何が出力されているかを把握する必要があるため、これは注意が必要です。最善の推測は、次のようなことです: $title = the_title(); 次に、 $title の内容を確認します。プレーンテキストの場合は、言及したような切り捨て関数を使用できます。プレーンテキスト以上の場合は、最初に切り捨てたい実際の部分を除外する必要があります。

于 2012-12-11T21:21:28.240 に答える
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 に答える
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 に答える
0

この目的のためのプラグインがあります: Woo Title Limit

于 2016-06-03T06:59:26.363 に答える