web-dev-qa-db-ja.com

ローカルループ内でカスタムの抜粋関数を呼び出す

最初の投稿の抜粋の長さをそれに続く投稿とは異なる方法で設定する機能がありますが、うまく機能することができません。任意の入力をいただければ幸いです。

functions.php (関数)

function 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;
}

add_filter( 'excerpt_length', 'custom_excerpt' );`

home.php (ループ)

<div class="section-content section-news-content">
<?php

$args = array(
        'posts_per_page' => 5,
        'post_type' => 'post',
        'cat'=>2,
    );

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
         $query->the_post();
            get_template_part( 'template-parts/content', 'news' );
        }
            wp_reset_postdata();
    }
?>
</div>`

content-news.php (ループから関数を呼び出す)

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<div class="excerpts">

<div class="post-text">
<div class="entry-content">
    <span class="entry-text">   
        <?php

        custom_excerpt();

        ?>
    </span>
 </div><!-- .entry-content -->
     </div>

</div>
</article>`

編集:私の質問はあまり答えられていないし、私はその理由に気付いた。抜粋を手動で追加しないことを明確にするために、それらはthe_postの抜粋です。また、私の質問に本質的に内在していますが、私が複数のループを持っていて、それぞれが異なる抜粋長を必要とするかもしれないということです。 2番目のループ、3番目の抜粋は異なります。説明がないことをお詫び申し上げます。

1
JPB

excerpt_length フィルタはそのようには動作しません。 $lengthという1つのパラメータを取ります。これは、抜粋のWordの長さです。

更新された解決策

まず、コールバック関数wpse_default_excerpt_length()excerpt_lengthフィルタに接続します。これがデフォルトの抜粋長ハンドラです。

次に、いくつかの追加のexcerpt_lengthcallback関数が宣言されていますが、ここではそれらを関連付けません。代わりに、それはカスタムクエリ自身の中で処理されます(さらに下のhome.phpセクションを見てください)。

functions.php

/**
 * Set the excerpt lengths for the **main** query.
 *
 * @param int $length Excerpt length.
 * @return int
 */
add_filter( 'excerpt_length', 'wpse_default_excerpt_length', 100 );
function wpse_default_excerpt_length( $length ) {
    global $wp_query;

    // If we're on the first post of the first page of posts:
    if ( $wp_query->current_post == 0 && ! $wp_query->is_paged ) {
        $length = 55;
    } else { // All other posts:
        $length = 20;
    }

    return $length;
}

/**
 * Set the excerpt lengths for a custom query - first post.
 */
function wpse_custom_loop_intro_excerpt_length( $length ) {
    return 60;
}

/**
 * Set the excerpt lengths for a custom query - other posts.
 */
function wpse_custom_loop_excerpt_length( $length ) {
    return 30;
}

home.php

<div class="section-content section-news-content">
<?php
    $args = [
        'posts_per_page' => 5,
        'post_type' => 'post',
        'cat' => 2,
    ];
    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();

            // If we're on the first post of the first page of posts:
            if ( $query->current_post == 0 && ! $query->is_paged ) {
                // Add our particular excerpt_length filter. Note that at priority 200,
                // it will override wpse_default_excerpt_length() at priority 100
                add_filter( 'excerpt_length', 'wpse_custom_loop_intro_excerpt_length', 200 );

                get_template_part( 'template-parts/content', 'news' );

                // Clean up after ourselves.
                remove_filter( 'excerpt_length', 'wpse_custom_loop_intro_excerpt_length', 200 );        

            } else { // All other posts in this custom loop:
                add_filter( 'excerpt_length', 'wpse_custom_loop_excerpt_length', 200 );

                get_template_part( 'template-parts/content', 'news' );

                remove_filter( 'excerpt_length', 'wpse_custom_loop_excerpt_length', 200 );  
            }
        }
        wp_reset_postdata();
    }
?>
</div>

content-news.php

抜粋の長さの制御は、以前に追加されたexcerpt_lengthフィルタを介して行われます。抜粋を出力するにはthe_excerpt()を使用してください。

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <div class="excerpts">
        <div class="post-text">
            <div class="entry-content">
                <span class="entry-text"><?php the_excerpt(); ?></span>
            </div><!-- .entry-content -->
        </div>
    </div>
</article>
1
Dave Romsey