Alphabetical Pagination (formerly WP-SNAP Extended! ) builds an alphabetical index of post titles across any public post type. Visitors jump straight to a letter (A, B, C …), browse a paginated list of matching posts, and click through to each post’s permalink. Built for modern WordPress: PHP 8.1+ t
PricingFree downloadThe WordPress.org download is free. Pro versions, add-ons or external services may cost extra.
CompatibilityRequires WordPress 5.0 and PHP 8.1.
SourceWordPress plugins · Nov 7, 2026
01 / Source details
Aboutthistool.
Alphabetical Pagination (formerly WP-SNAP Extended! ) builds an alphabetical index of post titles across any public post type. Visitors jump straight to a letter (A, B, C …), browse a paginated list of matching posts, and click through to each post’s permalink.
Built for modern WordPress: PHP 8.1+ typed classes, schema-validated options, prepared SQL throughout, semantic markup, no jQuery dependency, no bundled CSS framework, zero front-end JS by default.
Why use it
Modern PHP 8.1+ architecture — typed final classes under includes/ , every superglobal sanitised, every echoed value escaped, every DB call prepared.
Three embedding surfaces — [alphabetical_pagination] shortcode, alphabetical_pagination() template tag, and a native Gutenberg block ( wp-snap-ext/index ).
WooCommerce auto-mount — one click renders the index above the shop loop or product category archives via the native woocommerce_before_shop_loop action. No DOM hacks, no posts_where SQL filter injection.
Transient letter-availability cache — keyed by post_type, taxonomy, term, current language, alphabet pack, and menumisc setting. Invalidated on save_post , deleted_post , trashed_post , untrashed_post , and switch_blog . Default TTL 1 hour, configurable. WPML + Polylang awareness — cache key includes wpml_current_language or pll_current_language() ; WP_Query runs with suppress_filters => false so translated post sets get filtered. 15 multi-language alphabet packs — pick a script from the dropdown, the freeform Local Alphabet field is overwritten on save. Appearance toggles — Horizontal / Vertical layout, Uppercase / Lowercase letter case, Disable Empty Letters (renders empty buckets as muted + aria-disabled ), Hide Pagination If One Page. Generic taxonomy filter — restrict the index to any registered taxonomy + term (beyond the legacy cat/tag args). Meta-key intra-bucket sorting — set a post meta key + ASC / DESC to override post_title ordering within each letter bucket. Buckets still derive from post_title. Per-page override map — { post_id => items_per_page } so /glossary can render 50 items per page while /products renders 20. DOM auto-injection — for themes that don’t expose a hook: render the index in the footer and move it into a CSS selector via ~300 bytes of vanilla JS. No jQuery.
Backwards compatibility
The legacy wp_snap() template tag is preserved as a thin alias.
Legacy URL parameters ?snap= , ?cp= , and ?snap_paged= continue to be honoured alongside the canonical ?alpha_order= and ?alpha_paged= .
Legacy key_snap_* option keys are migrated to wp_snap_ext_* automatically on activation.
Usage
Gutenberg block
Add the Alphabetical Pagination block from the block inserter (Widgets category) and configure attributes through the block sidebar:
postType — post type to index (default post ).
menu — 1 , 2 , or 3 (see menu styles in the admin panel).
firstload — all , none , or recent .
category — category ID or all .
includeChildren — include category children.
taxonomy + term — restrict the index to a specific term of any registered taxonomy.
display — true (default) renders the post list under the letter nav; false renders only the letter nav.
The block is fully server-rendered — its HTML matches the shortcode and template tag output byte for byte, and there is no JS build pipeline behind it.
Shortcode
Drop the shortcode into any post, page, widget, or Site Editor template part:
[alphabetical_pagination]
All template-tag arguments are exposed as shortcode attributes:
child — true to include category children (default false ).
menu — 1, 2 or 3 (see menu styles in the admin panel).
firstload — all , none or recent .
post_parent — restrict to posts with a given parent ID.
post_type — defaults to post . Whitelisted against registered post types.
display — true (default) renders the post list under the letter nav; false renders only the letter nav.
The shortcode handler buffers its output through ob_start() / ob_get_clean() , so the index renders exactly where you place the shortcode rather than breaking out of the surrounding layout.
Theme template tag
For deeper theme integration, call alphabetical_pagination() directly from a template file. The legacy wp_snap() name is retained as a backwards-compatible alias.
Once embedded, the plugin reads two query parameters on the front end:
?alpha_order=A — the active letter (or bucket, like A-D ). alpha_order=misc selects the # bucket of non-alphanumeric titles.
?alpha_paged=2 — the active pagination page.
These are isolated to the plugin (they do not collide with WordPress’s own paged / tag / cat query vars). The legacy ?snap= / ?cp= parameters from earlier versions are still accepted so existing bookmarks keep working.
Gutenberg block attributes
Attribute Type Default Notes
postType string post Any registered public post type.
menu number 1 1, 2, or 3.
firstload string recent all / none / recent .
category string “ Category ID or all .
includeChildren boolean false Include category children.
taxonomy string “ Any registered taxonomy slug.
term number 0 Term ID for the taxonomy above.
display boolean true Render the post list under the nav.
The block supports wide and full alignment via the supports.align declaration in block.json .
REST API
Two read-only public routes under /wp-json/wp-snap-ext/v1/ :
GET /letters
Query params: post_type (default post ), taxonomy , term .
Toggle the endpoints on / off under Settings → Alphabetical Pagination → REST API & Cache . Lockdown plugins that block public REST surface should leave the toggle off.
WooCommerce auto-mount
Enable Settings → Alphabetical Pagination → WooCommerce → Auto-mount on Shop . The index renders above the shop loop (or after the archive description / before main content — pick the mount hook from the dropdown) on:
The mount uses native WooCommerce actions, never posts_where , so it does not collide with caching plugins, SEO plugins, or multilingual plugins that also filter WP_Query.
Developer hooks
Customise behaviour without forking through the following hooks (added in 2.3.0):
01Upload the wp-snap-extended directory to /wp-content/plugins/ .
02Activate the plugin through the Plugins screen in WordPress.
03Visit Settings → Alphabetical Pagination to configure the menu style, alphabet pack, pagination limit, WooCommerce mount, content fallback, REST API, and other options.
04Embed the index in any post or page with the Gutenberg block, the shortcode, or the template tag from your theme.
03 / Source details
Frequently asked questions.
Does the plugin still work if I’m calling `wp_snap()` from my theme?
Yes. wp_snap() is kept as a thin alias for alphabetical_pagination() with the same parameter list, so existing themes continue to work unchanged.
I need to embed the index inside a Gutenberg page.
Use the native Alphabetical Pagination block (added in 2.3.0) from the block inserter under the Widgets category — it’s fully server-rendered and supports wide / full alignment. The block sidebar exposes post type, menu style, firstload, category, taxonomy + term, and display attributes. The legacy approach (Shortcode block with [alphabetical_pagination] ) still works.
Does it integrate with WooCommerce?
Yes. Enable Settings → Alphabetical Pagination → WooCommerce → Auto-mount on Shop and the index renders above the WooCommerce shop loop and product category archives automatically. The mount uses native WooCommerce action hooks ( woocommerce_before_shop_loop , woocommerce_archive_description , or woocommerce_before_main_content — pick from the dropdown) so it never collides with caching / SEO / multilingual plugins that filter WP_Query.
Is it WPML / Polylang compatible?
Yes. The transient letter-availability cache keys on the current language (via wpml_current_language filter or pll_current_language() function), and WP_Query runs with suppress_filters => false , so translated post sets are filtered and cached per-language automatically. Switching language busts the cache for that language only.
Can I get the data over REST for a headless front end?
Yes. Two read-only public endpoints under /wp-json/wp-snap-ext/v1/ : GET /letters returns [{ letter, count, href }] , GET /posts returns paginated post payloads filtered by letter. Toggle on / off under Settings → Alphabetical Pagination → REST API & Cache .
How do I display the ACF field instead of the trimmed post content?
Go to Settings → Alphabetical Pagination → Content Fallback , enable ACF Excerpt Fallback , and enter the ACF Field Name (e.g. summary ). The plugin tries get_field() first, then get_sub_field() , then walks the entire get_fields() tree recursively to find the field even when it lives inside an ACF flexible-content layout, repeater row, or group. Falls back to a trimmed extract of the post content if ACF returns nothing.
My theme has no obvious hook to drop the index into.
Enable Settings → Alphabetical Pagination → DOM Injection → Enable DOM Injection and provide a CSS selector (e.g. .entry-content , #primary > article:first-child ). The plugin renders the index into a hidden <template> element in the footer and a ~300-byte vanilla-JS snippet moves it into the matched element on DOMContentLoaded . No jQuery, no dependencies.
How do I sort posts by a custom field instead of the title?
Under Settings → Alphabetical Pagination → Sorting , set Meta Key to your post meta key and Meta Order to ASC or DESC. The letter buckets still derive from post_title , but the order of posts within each bucket follows the meta value. Useful for sorting glossary terms by importance, products by SKU, etc.
Can I use a non-Latin alphabet (Arabic, Chinese pinyin, Cyrillic, Greek, Hebrew, Hindi, Korean, Thai, …)?
Yes. Pick the script from Settings → Alphabetical Pagination → Language → Alphabet Pack . 15 packs are bundled: English, Arabic, Chinese (Pinyin A–Z), German (with Umlauts), Spanish (with Ñ), French, Greek, Hebrew, Hindi (Devanagari), Hungarian, Korean (Hangul Jamo), Russian (Cyrillic), Thai, Turkish, Urdu. Selecting a pack overwrites the freeform Local Alphabet field on save. You can also type a fully custom alphabet directly.
Are the letter counts cached?
Yes. Letter availability is stored as a transient keyed by post_type / taxonomy / term / current language / alphabet pack / menumisc setting. Default TTL is 1 hour (configurable under REST API & Cache → Cache TTL ). The cache is invalidated automatically on save_post , deleted_post , trashed_post , untrashed_post , and switch_blog — so editing a post immediately reflects in the index.
Can I customise the output without editing the plugin?
Yes — every render path fires hooks (added in 2.3.0):
wp_snap_ext/pre_render — short-circuit filter (return a string to replace the HTML).
wp_snap_ext/query_args — mutate WP_Query args before the query runs.
wp_snap_ext/letter_href — rewrite letter link hrefs (useful for SPA routers).
wp_snap_ext/excerpt — post-process the resolved excerpt.
wp_snap_ext/render — final filter on the rendered HTML.
See the Developer hooks section above for code samples.
Why are pagination URLs using `?alpha_paged=` instead of `?paged=`?
So they don’t collide with WordPress’s own paged query variable on category, tag, or archive templates. You can paginate the alphabetical list independently of the surrounding archive.
Is the plugin accessible (WCAG)?
Yes — the markup targets WCAG 2.1 AA. The letter navigation is wrapped in a semantic <nav aria-label="Alphabetical Navigation"> , the active letter carries aria-current="page" , empty letters carry aria-disabled="true" , every link has a descriptive aria-label , and the stylesheet provides visible :focus-visible outlines. Explicit role="list" / role="listitem" are emitted because Safari + VoiceOver strip the implicit list role when list-style:none is applied.
FinderPress Media Auditor helps site administrators scan for broken images, missing Media Library files, unreachable media URLs, and other media issues across WordPress content. Use it to audit images, video, audio, PDFs, featured images, and attachment files without sending scan data to an external
The Accepted Payment Methods plugin is a straightforward, lightweight solution that enhances your website by displaying visually appealing icons of the payment methods you accept. This plugin is ideal for a variety of websites, including e-commerce platforms, service-oriented websites, and informati