Перефакторизация пользовательской функции извлечения


Возможно, это скорее вопрос о лучших практиках php, но вот что...

Я использую пользовательскую функцию обрезки отрывка:

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');

В основном, для сообщений объемом более ста слов создается "поддельный" отрывок из первых 100 слов со ссылкой "Подробнее". Сообщения, содержащие менее 100 слов, выводятся полностью. Вы можете увидеть это на работе здесь: http://www.mbird.com/

Усложнение этого вопроса заключается в 1) что автор может выберите, чтобы переопределить выдержку для каждой публикации. Также, 2) существует функция, которая пытается найти изображение, которое может служить миниатюрой публикации из вложений публикации, если оно не указано.

Все эти вещи действуют как флаги, определяющие расположение публикации на странице индекса. Например, если выводится полный пост, он должен иметь дополнительное заполнение, чтобы избежать CSS-обертывания изображений, который у меня есть, и у него не должно быть миниатюры тизера. Если миниатюра тизера не может быть найдена для отрывка ему нужно избегать того же самого. И т. д. и т. Д.

В любом случае, чтобы определить, какой должна быть оболочка макета, я в конечном итоге повторно использую большую часть функции new_wp_trim_excerpt в своем шаблоне страницы, чтобы узнать, произойдет ли отрывок или полный пост. Вот так:

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

Затем я использую это, чтобы определить, следует ли искать изображение:

<?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'
            ));
        }
        ?>

И, наконец, какой должна быть обертка:

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

В любом случае, кажется плохим повторно использовать так много функции new_wp_trim_excerpt для обнюхивания, тем более что у меня есть чтобы изменить $excerpt_length в двух местах! Но я действительно не могу придумать элегантный способ переосмысления. Я подумывал о добавлении еще одной функции, которую могут вызывать обе части, которая возвращала бы массив, содержащий bool относительно count($words) > $excerpt_length и, возможно, сам текст, но это все еще кажется неуклюжим.

Если вам каким-то образом удалось прочитать все это, помогите!

Author: two7s_clash, 2011-06-13

1 answers

Я бы просто установил флаг в качестве второго входного аргумента для функции:

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

        case 'image' :
            break;
    }
}

Примечания:

  • Избегайте таких имен, как class="moarplz". Трудно читать для других и трудно для себя через год.
  • Никогда count внутри оператора if/for/while/foreach/else/elseif - это в 5 раз медленнее, чем считать его в предыдущей строке.
 3
Author: kaiser, 2011-06-13 23:53:15