web-dev-qa-db-ja.com

カスタム抜粋関数のリファクタリング

これは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を2か所で変更しなければならないので、$excerpt_length関数の多くをsniffに再利用するのは悪いようです。しかし、私は本当にリファクタリングするための優雅な方法を理解することはできません。両方の部分が呼び出すことができる別の関数を追加することを検討していました。それはcount($words) > $excerpt_lengthとオプションでテキスト自体に関するブール値を含む配列を返しますが、それでもまだ不格好です。

あなたがどうにかしてこれらすべてを読むことに成功したならば、助けてください!

1
two7s_clash

関数の2番目の入力引数としてフラグを設定するだけです。

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"のような名前は避けてください。一年のうちに他人のために読むのは難しいし、あなた自身のためには難しい。
  • if/for/while/foreach/else/elseifステートメントの中では決してcountを使わないでください - 前の行で数えるよりも最大5倍遅くなります。
3
kaiser