web-dev-qa-db-ja.com

ループ内の最初の抜粋の長さを制限する

至る所で検索しましたが、これが登場するようには思われませんでした。ループ内の抜粋の長さをfunctions.phpに設定することを検討していますが、最初の投稿に必要なのは、残りの2倍の文字数だけです。

例:最初の投稿を60文字に設定し、その後の投稿を30に設定します。

私はこれを試しましたが、うまくいきません。

function custom_excerpt_length( $length ) 
{
    static $instance = 0;
    return ( in_the_loop() && 0 == $instance++ ) ? 60 : 30;
}
add_filter( 'excerpt_length', 'custom_excerpt_length' );

何か案は?

1
JPB

このフィルタのループ内のどこにいるのかを判断するには、 グローバルメインクエリ にアクセスする必要があります。このような:

add_filter ('excerpt_length', 'wpse268679_custom_excerpt_length');

function wpse268679_custom_excerpt_length ($length) {
  // access main query
  global $wp_query;
  // do this only for the main loop and the first post in the query
  if (is_main_query() && ($wp_query->current_post == 0))
    $length = 60;
  else
    $length = 30;
  return $length;
  }

上記はメインループでのみ機能します。ローカルループがある場合、クエリにグローバルにアクセスすることはできません。そのため、投稿の代わりにクエリを渡す独自の抜粋関数を構築する必要があります。これはそれほど難しいことではありません。このような:

 wpse268679_custom_excerpt ($query) {
   if ($query->current_post == 0)
     $excerpt = wp_trim_words ($query->post->post_excerpt, 60);
   else
     $excerpt = wp_trim_words ($query->post->post_excerpt, 30);
   return $excerpt;
   }

上記の例では、抜粋が定義されていない場合を考慮に入れるために微調整が必​​要になることに注意してください(その場合、投稿コンテンツを使用してトリムすることができます)。

0
cjbj