v2.0.0
Compatibility release for current Elementor and Elementor Pro (tested up to 4.2.2),
plus a hardening pass on the lazy-load endpoint. Read the breaking changes before
updating — the widget's DOM changed.
Breaking
-
The widget's DOM gained a wrapper and can now lose one. All of its styling moved
onto a new.e-taxonomy-loopelement that sits between Elementor's widget wrapper
and the term sections, and the widget now honours Elementor's Optimized Markup
setting the way core widgets do. Two things follow for custom CSS:- On sites with Optimized Markup enabled,
.elementor-widget-containeris no longer
rendered for this widget. CSS naming it must move to.e-taxonomy-loop. - CSS using a direct-child combinator through the old structure (for example
.elementor-widget-container > .taxonomy-posts) no longer matches, because
.e-taxonomy-loopnow sits in between.
Every class the widget itself emits —
.taxonomy-posts,.term-content,
.term-title,.posts-list,.divider,.not-found— is unchanged. - On sites with Optimized Markup enabled,
-
The widget now lives under its own Beenacle category in the editor panel
instead of General. Existing widgets keep working; only the panel section moved. -
Configuration errors ("Invalid taxonomy selected", "Please select a valid loop
template") render in the editor only. Visitors see nothing instead of a red error box. -
The lazy-load AJAX request now sends
post_id/element_id/term_idand no
nonce. Anything that hooked or proxied the old payload needs updating.
Fixed
.posts-list { margin-top: 10px }shipped unscoped and applied to any element on
the site with that class, not just this widget's.- Lazy loading broke on cached pages. The nonce was baked into the cached HTML, went
stale, and every deferred term failed with "Unable to load posts for this term".
Since the endpoint only returns already-public markup and now derives every setting
server-side, the nonce is gone and the failure mode with it. - Lazy-rendered terms silently capped at 100 posts while eagerly-rendered terms did
not, so Posts Per Term = -1 produced inconsistent output within one widget. Both
paths now honour the setting identically. - A crafted AJAX request could render any
elementor_librarypost as the loop
template, including drafts and private templates. The endpoint no longer accepts a
template ID — it reads the one saved on the widget. - Only
\Exceptionwas caught around the Loop Grid render, so a PHP\Errorfrom
Elementor Pro took down the whole page.\Throwableis caught now, and a failed
render can no longer leave an output buffer open. - Lazily-injected Loop Grids could arrive unstyled when every eagerly-rendered term
happened to be empty, because Elementor Pro's grid stylesheet had never been
enqueued. The widget now preloads it when lazy loading is on.
Added
- Max Terms control, to cap how many terms a widget renders. The term query was
previously unbounded, which is rough on taxonomies with hundreds of terms. - Title HTML Tag control (
h1–h6,div,p,span). The term title was
hard-coded to<h2>, which forced a heading level on every layout. - Post Count ordering for terms and Last Modified ordering for posts.
- Requirement checks for Elementor, Elementor Pro and PHP, each with a single
actionable admin notice shown only to users who can act on it. - Three filters for extending the widget without forking it:
elementor_taxonomy_loop_terms_args,elementor_taxonomy_loop_posts_argsand
elementor_taxonomy_loop_lazy_style_handles. - Plugin icons, so the update screen shows the plugin's own icon, and a
Tested up toheader so WordPress stops flagging it as untested. languages/elementor-taxonomy-loop.pottranslation template, regenerated with
php bin/make-pot.php.CHANGELOG.md, which the release workflow now uses for release notes.
Changed
- Ready for Elementor's optimized DOM. Elementor's developer documentation tells
add-ons to stop relying on.elementor-widget-container, and core's
common-optimizedcontrol stack is marked to become the only one. The 1.x widget
hung its stylesheet and eight style controls off that element, which worked only
because Elementor still defaults third-party widgets to rendering it. The widget now
implementshas_widget_inner_wrapper()exactly as core widgets do — tracking the
site's Optimized Markup setting — and styles itself through.e-taxonomy-loop, which
is present either way. Nothing looks different today; it just stops depending on an
element Elementor is retiring. - Rewritten as namespaced classes (
Beenacle\ElementorTaxonomyLoop\…) behind a
small autoloader, and the whole plugin now passes theWordPressPHP_CodeSniffer
standard plusPHPCompatibilityfor PHP 7.4–8.4. CI enforces both. - The lazy-loader script is only enqueued when Lazy Load Terms is on.
- Editor panel search now matches many more terms (category, tag, grid, archive,
WooCommerce, product category, …). - The Loop Skin control falls back to a plain template-ID field if Elementor Pro
ever renames its template query control, instead of fatalling the editor.
Full Changelog: v1.2.2...v2.0.0