WordPress plugin intelligence profile

Alphabetical Pagination

Alphabetical (A–Z, #, 0–9) index for any post type. Shortcode, Gutenberg block, REST API, WooCommerce auto-mount, multilingual, WCAG AA.

WP PlugIndex snapshot

Current directory snapshot

Tested up to WordPress 7.0
Current version2.4.2
WordPress coverageTested up to WordPress 7.0
Minimum stackWP 5.0 · PHP 8.1
Directory statusactive
Last directory update9 Jun 20264mo ago
Active installations30Adoption metric — not a quality score
WordPress.org rating2.3 / 5 from 3 ratings
Official packageDirect from WordPress.org

Repository metrics are context, not quality scores. Active installations measure adoption and can strongly reflect a plugin’s age and historical popularity. Ratings, recent updates and “Tested up to” metadata also do not guarantee modern code, error-free operation, security, feature completeness or suitability for a particular site. Why active installs don’t tell the whole story →

WP PlugIndex currently records Alphabetical Pagination version 2.4.2 as active, updated 4mo ago and tested up to WordPress 7.0.

Overview

About this plugin

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.

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.
  • 15 bundled alphabet packs — English, Arabic, Chinese (Pinyin), German, Spanish, French, Greek, Hebrew, Hindi, Hungarian, Korean (Hangul Jamo), Russian, Thai, Turkish, Urdu.
  • WPML + Polylang aware — the letter cache keys on current language, so translated post sets render and cache per-language automatically.
  • REST API — GET /wp-json/wp-snap-ext/v1/letters and /posts for headless / React / app integrations.
  • Documented developer hook API — do_action / apply_filters at every render path so agencies can customise without forking.
  • Transient letter-availability cache — letter counts cached as transients, busted on save_post. Configurable TTL.
  • ACF excerpt fallback — supports top-level, sub-field, and deep flexible-content / repeater / group lookups via recursive get_fields() walk.
  • WCAG 2.1 AA — <nav aria-label>, aria-current="page", aria-disabled on empty letters, explicit role="list" / role="listitem" (Safari + VoiceOver list-stripping fix), descriptive per-letter aria-label, visible focus outlines.
  • Zero front-end JS dependency by default — no jQuery, no Bootstrap, no FontAwesome. Stylesheet is ~1 KB.

2.3.0 feature surface

  • Gutenberg block — server-rendered wp-snap-ext/index block (no JS build pipeline required). Renders identically to the shortcode + template tag.
  • WooCommerce auto-mount — toggle in Settings → Alphabetical Pagination → WooCommerce. Mount hook selectable: woocommerce_before_shop_loop (default), woocommerce_archive_description, or woocommerce_before_main_content.
  • REST API endpoints — /wp-json/wp-snap-ext/v1/letters returns [{ letter, count, href }]; /wp-json/wp-snap-ext/v1/posts returns paginated post payloads.
  • Developer hooks:
  • do_action( 'wp_snap_ext/before_render', $context )
  • apply_filters( 'wp_snap_ext/pre_render', $html, $post_type, $display, $args ) — short-circuit
  • apply_filters( 'wp_snap_ext/query_args', $args, $context )
  • apply_filters( 'wp_snap_ext/letter_href', $href, $letter, $base )
  • apply_filters( 'wp_snap_ext/excerpt', $excerpt, $post_id )
  • apply_filters( 'wp_snap_ext/render', $html, $post_type, $display, $args )
  • do_action( 'wp_snap_ext/after_render', $html, $context )
  • 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:

[alphabetical_pagination cat="15" child="true" menu="2" firstload="recent" post_type="post" display="true"]

Attribute reference:

  • cat — category ID, or all.
  • 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.

>

Passing arguments works the same as the original wp_snap() API:

>

Render an alphabetical index over a custom post type:

>

Render only the letter navigation (without the post list):

>

URL query parameters

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). 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.

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.

Response (200 OK):

alpha_order=A" }, … ]

GET /posts

Query params: post_type, taxonomy, term, letter (single character or # ), page (default 1), per_page (default 10, max 100).

Response (200 OK):

" } ], "total": 75, "total_pages": 8, "page": 1, "per_page": 10 }

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 WooCommerce shop archive,
  • product taxonomy archives (e.g. /product-category/food ).

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

0):

add_filter( 'wp_snap_ext/query_args', function( $args, $context ) { $args['meta_query'] = [ [ 'key' => 'featured', 'value' => '1' ] ]; return $args; }, 10, 2 );

alpha_order=', '#letter/', $href ); }, 10, 3 );

add_filter( 'wp_snap_ext/excerpt', function( $excerpt, $post_id ) { return wp_trim_words( $excerpt, 25, '…' ); }, 10, 2 );

Full list:

  • do_action( 'wp_snap_ext/before_render', $context ) — fires before the index renders.
  • apply_filters( 'wp_snap_ext/pre_render', $html, $post_type, $display, $args ) — short-circuit; return a string to replace the HTML.
  • apply_filters( 'wp_snap_ext/query_args', $args, $context ) — mutate WP_Query arguments.
  • apply_filters( 'wp_snap_ext/letter_href', $href, $letter, $base ) — rewrite letter link hrefs (router compatibility).
  • apply_filters( 'wp_snap_ext/excerpt', $excerpt, $post_id ) — post-process the resolved excerpt.
  • apply_filters( 'wp_snap_ext/render', $html, $post_type, $display, $args ) — final filter on rendered HTML.
  • do_action( 'wp_snap_ext/after_render', $html, $context ) — fires after the index has rendered.

Backend settings

Under Settings → Alphabetical Pagination you’ll find:

  • Navigational Menu Options — Local Alphabet, Menu Style, Group Posts, Recent Posts, CSS class names, Ignore When Alphabetizing.
  • Presentational Options — Fancy URLs, Fancy URL Name, Tabs.
  • Pagination → Items Per Page — integer, defaults to 10. Registered through the WordPress Settings API and sanitised with absint().
  • Content Fallback → ACF Excerpt Fallback — checkbox. When on, posts without a native WordPress excerpt fall back to the value of an ACF field instead of the trimmed post content. ACF lookup chain: get_field() → get_sub_field() → recursive get_fields() walk for deeply nested flexible-content / repeater / group sub-fields.
  • Content Fallback → ACF Field Name — the field name (or key) read by get_field() when the toggle is enabled. The plugin gracefully no-ops if ACF (or ACF Pro) is not installed.
  • Appearance → Layout — Horizontal or Vertical letter strip.
  • Appearance → Letter Case — Uppercase or Lowercase.
  • Appearance → Disable Empty Letters — renders empty buckets as muted + aria-disabled, with the anchor stripped.
  • Appearance → Hide Pagination If One Page — skips the Previous/Next strip when the filtered set fits on one page.
  • Language → Alphabet Pack — pick from 15 bundled scripts. Selecting a pack overwrites the freeform Local Alphabet field on save.
  • Sorting → Meta Key — post meta key used for intra-bucket ordering instead of post_title.
  • Sorting → Meta Order — ASC / DESC.
  • Taxonomy Filter → Taxonomy + Term ID — restrict the index to a single term of any registered taxonomy.
  • WooCommerce → Auto-mount on Shop + Mount Hook — see the WooCommerce section above.
  • DOM Injection → Enable DOM Injection + Target Selector — print the index in the footer and move it into a CSS selector via vanilla JS.
  • REST API & Cache → Enable REST Endpoints + Cache TTL — see the REST API section above.
WordPress.org metadata

Plugin tags

Topics listed for this plugin in the WordPress.org directory.

  • alphabetical
  • glossary
  • index
  • navigation
  • pagination
Compatibility & maintenance

Compatibility & maintenance

Tested up to WordPress 7.0

Not yet marked as tested with WordPress 7.1. WordPress.org currently lists Tested up to 7.0.

Current WordPress releaseWordPress 7.1
WordPress.org Tested up to7.0
Minimum requirementsWordPress 5.0 · PHP 8.1
Update activity9 Jun 20264mo ago

“Tested up to” is directory metadata supplied by the plugin author. WP PlugIndex does not turn an older declaration into a claim that the plugin is incompatible.

Changes recorded by WP PlugIndex

Recent tracked changes

No tracked version or compatibility changes have been recorded by WP PlugIndex yet.

Tracking & source

WP PlugIndex tracks public WordPress.org directory metadata and records selected version, compatibility and availability changes as they are detected.

Plugin watchlist

Watch this plugin

Sign in to your WP PlugIndex account or create a free account. Free accounts can watch up to 5 plugins and see what changed.

Watch limit

Watchlist limit reached

You have reached your current active watch limit.