自定义摘录函数重构

时间:2011-06-13 作者:two7s_clash

这可能更像是一个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个单词会生成一个“伪造”的摘录,并带有“阅读更多”链接。少于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 也可以选择文本本身,但这看起来仍然很笨拙。

如果你不知何故读到了这一切,请帮帮我!

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

我只需设置一个标志作为函数的第二个输入参数:

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倍

结束

相关推荐

将归档页面2、3等设置为不同于filve.php的样式的最佳实践是什么?

我有一个自定义的帖子类型“视频”,在第一页上,我的第一个视频样式与页面上的下一个视频不同。基本上,我以大格式显示第一个视频,而页面上的其余视频都很小。问题:在视频帖子类型的第2页、第3页等,我不想在页面顶部有一个大视频,而是想遵循我的标准样式。最好的方法是什么?目前,我正在使用重写规则为帖子类型的“paged”提供第二个模板页。我宁愿不再使用这种方法,因为它更需要维护。如果我使用If\\u paged之类的支票。。然后我发现我必须在模板上复制大量代码。希望有一个简单的方法来确定循环中的第一篇帖子,并设置样