web-dev-qa-db-de.com

Aufrufen einer benutzerdefinierten Auszugsfunktion in einer lokalen Schleife

Ich habe eine Funktion, die die Auszugslänge des ersten Beitrags anders festlegt als die folgenden, aber ich kann sie nicht zum Laufen bringen. Jede Eingabe wäre dankbar.

functions.php (die Funktion)

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 (die Schleife)

<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 (Aufrufen der Funktion aus der Schleife)

<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>`

EDIT: Meine Frage wurde nicht ganz beantwortet und ich habe gerade begriffen warum. Um zu verdeutlichen, dass Auszüge nicht manuell hinzugefügt wurden, handelt es sich um den Auszug aus den Beiträgen. Ebenfalls meiner Frage innewohnend, aber unerklärlicherweise ausgelassen, ist, dass ich mehrere Schleifen habe und jede eine andere Auszugslänge benötigen kann, z. B. die erste Schleife, nur der erste Auszug ist anders. Zweite Schleife, dritter Auszug ist anders. Ich entschuldige mich für die mangelnde Klarstellung.

1
JPB

Beachten Sie, dass der excerpt_length Filter nicht so funktioniert. Es benötigt einen Parameter, $length, der die Wortlänge des Ausschnitts angibt.

Aktualisierte Lösung

Zuerst verbinden wir die Rückruffunktion wpse_default_excerpt_length() mit dem Filter excerpt_length. Dies ist unser Standard-Handler für Auszugslängen.

Als nächstes werden einige zusätzliche excerpt_lengthcallback-Funktionen deklariert, aber wir werden sie hier nicht verkabeln. Stattdessen wird dies in den benutzerdefinierten Abfragen selbst behandelt (siehe den Abschnitt home.php weiter unten).

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

Die Länge des Ausschnitts wird über die zuvor hinzugefügten excerpt_length-Filter gesteuert. Verwenden Sie the_excerpt(), um den Auszug auszugeben.

<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