これは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 = '…';
array_pop($words);
$text = implode(' ', $words).$dots.'<p class="moarplz"><a href="'. get_permalink($post->ID) . '">Read More »</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(']]>', ']]>', $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
とオプションでテキスト自体に関するブール値を含む配列を返しますが、それでもまだ不格好です。
あなたがどうにかしてこれらすべてを読むことに成功したならば、助けてください!
関数の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倍遅くなります。