Skip to main content
Login Join
Snippet · PHP

WordPress Excerpt with Show More / Show Less Toggle

Shared by Naman Chauhan · June 10, 2026 · @get_the_excerpt

31 views
Back to Snippets

Limit the excerpt to a specific number of words and automatically add Show More / Show Less functionality without requiring additional JavaScript files or jQuery.

/**
 * Display an excerpt with Show More / Show Less functionality.
 *
 * Usage:
 * echo wpfolks_excerpt_toggle( get_the_excerpt(), 20 );
 */

function wpfolks_excerpt_toggle( $text, $word_limit = 20 ) {

	$text = wp_strip_all_tags( $text );
	$words = preg_split( '/s+/', trim( $text ) );

	if ( count( $words ) <= $word_limit ) {
		return esc_html( $text );
	}

	$short_text = implode(
		' ',
		array_slice( $words, 0, $word_limit )
	);

	$unique_id = wp_unique_id( 'wpfolks-excerpt-' );

	return sprintf(
		'<span class="wpfolks-excerpt-wrapper">
			<span class="wpfolks-excerpt-short">%1$s...</span>
			<span id="%2$s" class="wpfolks-excerpt-full" hidden>%3$s</span>
			<a href="#" onclick="
				event.preventDefault();
				const wrapper = this.parentNode;
				wrapper.querySelector('.wpfolks-excerpt-short').hidden = true;
				wrapper.querySelector('.wpfolks-excerpt-full').hidden = false;
				this.hidden = true;
				wrapper.querySelector('.wpfolks-show-less').hidden = false;
			">%4$s</a>
			<a href="#" class="wpfolks-show-less" hidden onclick="
				event.preventDefault();
				const wrapper = this.parentNode;
				wrapper.querySelector('.wpfolks-excerpt-short').hidden = false;
				wrapper.querySelector('.wpfolks-excerpt-full').hidden = true;
				this.hidden = true;
				wrapper.querySelector('.wpfolks-show-more').hidden = false;
			">%5$s</a>
		</span>',
		esc_html( $short_text ),
		esc_attr( $unique_id ),
		esc_html( $text ),
		sprintf(
			'<span class="wpfolks-show-more">%s</span>',
			esc_html__( 'Show More', 'textdomain' )
		),
		esc_html__( 'Show Less', 'textdomain' )
	);
}
Know a different way to do this? Add your approach as a variation so folks can compare them side by side.
Submit a variation

0 comments