Блогът на Гонзо

Как да подобрим the_excerpt() тага на WordPress

Когато подобрявах темата на този блог, едно от първите неща, които промених беше във всички страници със повече от един пост да показвам само част от постовете вместо целите постове. Това спестява непрекъснатото поставяне на <!–more–> тага във всеки пост, а и RSS емисията съдържа пълните публикации, а страниците от архива – не. Това става лесно, като в съответния шаблон замените

the_content()

със

the_excerpt()

Тагът the_excerpt() връща само първите 55 думи от поста, като премахва форматирането. Когато е попълнено полето за кратко резюме („Откъс“), връща него.

По-късно реших, че искам на първа страница най-новата публикация да се откроява от останалите. Да, ама някак си не се получи добре, защото и следващите публикации заемаха доста място и се различаваха само по по-ситните заглавия. Поразтърсих из Мрежата и попаднах на статия на Aaron Russell, обясняваща как да се подобри the_excerpt(). И така, в кода на WordPress функцията, която „вади“ резюмето на публикацията е:

function 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);
		$excerpt_length = 55;
		$words = explode(' ', $text, $excerpt_length + 1);
		if (count($words) > $excerpt_length) {
			array_pop($words);
			array_push($words, '[...]');
			$text = implode(' ', $words);
		}
	}
	return $text;
}

Копираме я във файла functions.php на нашата тема и и сменяме името:

function bn_short_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);
		$excerpt_length = 30;
		$words = explode(' ', $text, $excerpt_length + 1);
		if (count($words)> $excerpt_length) {
			array_pop($words);
			array_push($words, '[…]');
			$text = implode(' ', $words);
		}
	}
	return $text;
}

В статията си Aaron Russell предлага подобрения като запазване на параграфите, удължаване на резюмето и почистване на javascript, добавен от различни плъгини. На мен това не ми беше необходимо, просто исках да намаля резюмето:

         $excerpt_length = 30;

Следващата стъпка е да кажем на WordPress да използва новата функция за извличане на резюмето на публикацията. За целта отново в functions.php на нашата тема добавяме това:

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

Да, ама аз искам да намаля дължината на резюмето са всички без първята публикация. За това не слагам тези два реда във functions.php, а във index.php след първия пост:

     <?php if (have_posts()) : ?>
        <?php rewind_posts(); the_post(); ?>

        ...

	<?php
	remove_filter('get_the_excerpt', 'wp_trim_excerpt');
	add_filter('get_the_excerpt', 'bn_short_excerpt');
        ?>
        <?php while (have_posts()) : the_post();?> 

               ...

        <?php endwhile; ?>

	...

     <?php endif; ?>

В останалите страници съм поставил горните два реда в началото, за да е еднакво резюмето навсякъде.

Сега като се замисля, вместо да дублирам функционалността на филтъра на WordPress, за моите нужди бих могъл просто да добавя филтър, който само да ограничи още дължината на резюмето.

Етикети: , ,

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *