web-dev-qa-db-fra.com

Appel d'une fonction d'extrait personnalisé dans une boucle locale

J'ai une fonction qui définit la longueur de l'extrait du premier message différemment des messages suivants, mais je ne parviens pas à le faire fonctionner. Toute entrée serait appréciée.

functions.php (la fonction)

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 (la boucle)

<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 (appelant la fonction depuis la boucle)

<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: On n'a pas encore répondu à ma question et je viens de comprendre pourquoi. Pour clarifier les extraits ne sont pas ajoutés manuellement, il s'agit de the_excerpt of the_post. Un autre aspect intrinsèque de ma question, mais inexplicablement oublié, est que j'ai plusieurs boucles et que chacune peut nécessiter une longueur d'extrait différente, par exemple la première boucle, seul le premier extrait est différent. Deuxième boucle, le troisième extrait est différent. Mes excuses pour le manque de clarification.

1
JPB

Notez que le filtre excerpt_length ne fonctionne pas comme ça. Il faut un paramètre, $length, qui est la longueur de mot de l'extrait.

Solution mise à jour

Nous connectons d’abord la fonction de rappel wpse_default_excerpt_length() au filtre excerpt_length. Ceci est notre gestionnaire de longueur d’extrait par défaut.

Ensuite, certaines fonctions excerpt_lengthcallback supplémentaires sont déclarées, mais nous ne les câblons pas ici. Au lieu de cela, cela sera géré dans les requêtes personnalisées elles-mêmes (voir la section home.php plus bas).

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

Le contrôle de la longueur de l'extrait est effectué via les filtres excerpt_length ajoutés précédemment. Utilisez the_excerpt() pour sortir l'extrait.

<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