web-dev-qa-db-fra.com

Recomposition personnalisée de la fonction de l'extrait

C'est peut-être plus une question de bonnes pratiques php, mais voilà ...

J'utilise une fonction de découpe d'extrait personnalisée:

function new_wp_trim_excerpt($text) { // Fakes an excerpt if needed
    global $post;
    if ( '' == $text ) {
        $text = get_the_content('');
        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text, '<p>');
        $text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);
        $excerpt_length = 100;
        $words = explode(' ', $text, $excerpt_length + 1);
        if (count($words)> $excerpt_length) {
            $dots = '&hellip;';
            array_pop($words);
            $text = implode(' ', $words).$dots.'<p class="moarplz"><a href="'. get_permalink($post->ID) . '">Read More &raquo;</a></p';
        }
        else
        {
            $text = get_the_content();
        }
    }
    return $text;
}

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'new_wp_trim_excerpt');

Fondamentalement, pour les messages de plus de cent mots, un extrait "falsifié" est produit des 100 premiers mots, avec un lien "Lire la suite". Les messages de moins de 100 mots sont affichés dans leur intégralité. Vous pouvez voir cela au travail ici: http://www.mbird.com/

Pour compliquer cette affaire, c’est 1) qu’un auteur peut choisir de remplacer l’extrait par publication. En outre, 2) , une fonction essaie de trouver une image pouvant servir de miniature de publication à partir des pièces jointes si aucune n'est spécifiée.

Toutes ces choses agissent comme des drapeaux, déterminant la mise en page du message sur la page d'index. Par exemple, si une publication complète est en sortie, elle doit être complétée par un rembourrage supplémentaire pour éviter le CSS d'encapsulation d'image que j'ai mis en place, et il ne devrait pas y avoir de vignette teaser. Si aucune vignette ne peut être trouvée pour un extrait, il faut éviter de la même chose. Etc.

Quoi qu'il en soit, afin de déterminer ce que devrait être l'encapsuleur, je finis par réutiliser une grande partie de la fonction new_wp_trim_excerpt dans mon modèle de page pour détecter si un extrait ou un message complet se produira. Ainsi:

<?php
    while (have_posts ()) : the_post();
        global $excerpt_checkbox_mb; 
        $exmeta = $excerpt_checkbox_mb->the_meta(); //override excerpt?
        $text = get_the_content('');
        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]&gt;', $text);
        $text = strip_tags($text, '<p>');
        $text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);
        $excerpt_length = 100;
        $words = explode(' ', $text, $excerpt_length + 1);
        if (count($words) > $excerpt_length) {
            $Word_count = true;
        } else {
            $Word_count = false;
        }
    ?>

Ensuite, je l'utilise pour déterminer si une image doit être recherchée:

<?php
        if (($exmeta['cb_single'] != "yes") && $Word_count) { // we're printing an excerpt, get a teaser image!
            get_the_image(array(
                'meta_key' => null,
                'image_class' => 'thumb',
                'callback' => 'find_image'
            ));
        }
        ?>

Et enfin, ce que l'emballage devrait être:

<?php $image = find_image(); ?>
        <!--if full post, add left padding to avoid image wrap-->
                    <?php if (($exmeta['cb_single'] == "yes") || !$Word_count) : ?>
            <div class="post-content">    
<?php the_content();
                    elseif ($image) : ?> // we found an image, apply css psuedo-col
                <div class="post-content post-psuedo-col">     
<?php the_excerpt();
                    else : ?> // no image, reduce padding
                            <div class="post-content">             
<?php the_excerpt();
                    endif; ?>
                        </div> 

Quoi qu'il en soit, il semble mauvais de réutiliser autant de fonctions new_wp_trim_excerpt pour renifler, d'autant plus que je dois changer $excerpt_length à deux endroits! Mais je ne peux pas vraiment trouver un moyen élégant de re-factoriser. J'envisageais d'ajouter une autre fonction à laquelle les deux parties pourraient faire appel, ce qui renverrait un tableau contenant un bool concernant count($words) > $excerpt_length et éventuellement le texte lui-même, mais cela semble toujours maladroit.

Si vous avez réussi à lire tout cela, aidez-moi!

1
two7s_clash

Je définirais simplement un drapeau comme second argument d'entrée pour la fonction:

function new_wp_trim_excerpt( $text, $case = 'plain' ) 
{
    switch ( $case ) 
    {
        default :
        case 'plain' :
            // do stuff - your function so far
            break;

        case 'image' :
            break;
    }
}

Notes:

  • Évitez les noms comme class="moarplz". Il est difficile de lire pour les autres et difficile pour vous-même en un an.
  • Jamais count dans une instruction if/for/while/foreach/else/elseif - il est jusqu'à 5 fois plus lent que de le compter dans la ligne précédente.
3
kaiser