WP Manifestindependent plugin directory
manifest / editor / bws-gb-dynamic-tags-extensions

GenerateBlocks Dynamic Tag Extensions by BWS WP Registry grade A. No security issues foundWP RegistryNo security issues foundOpen the reportA

Extends GenerateBlocks Pro with advanced dynamic tags for both standard post/term fields and custom field data.

★ 1stars
58release downloads
v1.20.0latest · 1mo ago

Install

Download bws-gb-dynamic-tags-extensions-1.20.0.zip From the v1.20.0 release on GitHub, Sep 15, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/davidofchatham/bws-gb-dynamic-tags-extensions/releases/download/v1.20.0/bws-gb-dynamic-tags-extensions-1.20.0.zip
Updates itself. It ships its own updater (Plugin Update Checker), so new versions appear under Dashboard → Updates.

BWS GenerateBlocks Dynamic Tags Extensions

A GenerateBlocks Pro extension with advanced dynamic tags for both standard post/term fields and custom field data.

What's different?

Fewer tags, more sources

Rather than being prefixed and locked to particular contexts, our tags work across multiple contexts: a post template, a query loop item (post, term, user, or repeater row), a taxonomy term archive, or an author archive. {{text key:some_field}} returns the local field of that name in each case!

  • Where GenerateBlocks requires using {{post_title}} or {{archive_title}} depending on context, our {{title}} tag returns post titles, term names, author names, archive labels, date spans, search and 404 headings, or the site name (for a blog homepage). One {{title}} in a site-wide header covers every page type WordPress can render.

  • Where GeneratePress's Post Content block is the only native way to output full post content, and GenerateBlocks' {{archive_description}} spans term, post type, and author descriptions but empty outside an archive and has no 404 branch, our {{content}} tag returns all of that, plus full post content and GeneratePress's own "not found" text on a 404, from one portable tag.

Note: On a blog homepage, search results, date and post-type archives, or 404 page, tags with no sensible value there (permalink, image, datetime_) output nothing (not wrong, just empty). On author archives, only text, title, content and their try_ variants, plus join, output anything.

Access fields via relationships

Not only can you start from post, loop, term, and author contexts without changing tags, you can also pull from a source related to the current context via a reference/relational field (e.g. ACF Relationship fields), or from site-wide data (option fields, logo, and name), or from a post's taxonomy terms. And you can use more than one step, so it's possible to output data via a path of two or more relationships.

Each step that can return several results carries its own optional limit, meaning at most that many from each incoming result. For example, limiting a taxonomy step to 1 gives you one term from the current post or each previous step's posts, not one term overall. Pick an ACF Relationship or Post Object field for a source step and you get a short note about its current configuration, including bidirectionality and entry limits, to help you decide whether and how to configure that step's limit. Leave it blank for all results.

Extendable

Another plugin can add its own starting point to the source options. Developers: docs/plugin-integration.md §1a covers both routes, a source class and a filter.

Unlocked field selector

GB's field selector is post-type-based, so when you're building GP Elements or WP Patterns, you usually can't see the fields that are actually available for what you're working on. Using our tags, every meta/option field key input shows all registered fields (including ACF fields and sub-fields, options-page fields, term fields, and post meta fields), and can be filtered by context, field group, and field type, or searched by label, name, and type.

Special handling

Zero values

When "Required to render" is checked for a tag (the default), real values of 0 are treated as an empty result, and the whole block is suppressed. When this extension is enabled, zeroes are padded with a space, returning '0 '. GB doesn't treat that as an empty result, so the block renders and you see 0.

The zero padding isn't limited to our own tags: It applies to GenerateBlocks and GenerateBlocks Pro tags, as well as any other extension's tags. For example, GB Pro's loop_index returns a bare 0 on the first row of a zero-based loop; without this extension, it's suppressed unless you uncheck "Required to render." However, even with this installed, GB's post_meta returns empty for a field holding 0, so neither unchecking "Required" nor our zero padding has any effect; use our text tag instead.

Note that if you're injecting a value which may be 0 into a URL or attribute, or using a value directly followed by punctuation, the added space could cause problems. For the latter case, try our join tag.

Empty alt text

If you use GB's {{featured_image key:alt|…}} for alt text, an image that exists but doesn't have stored alt text will result in the entire img tag being suppressed, unless "Required to render" is unchecked. For our {{image as:alt|…}} dynamic tag, we inject a space so it doesn't fail GB's empty-result check even if you forget to uncheck the "Required" toggle. (It should still parse as empty alt text for screen readers.)

Cross-source base tags

Tag Description Specific Limitations
text Return simple meta/option text fields or post title/term name (useful in try_ tags).
image Return an image from a meta field or the post featured image or site logo field, with return options like GB's (alt text, etc.) and a Media Library fallback image selector. Since terms have no native image fields, a field name must be supplied to retrieve images from a term source.
content Return post content/term description via a processing pipeline that handles block-rendered content safely, including consolidating block CSS for embedded post content into the page footer. Since there's no site-wide body/content field, an option field name must be supplied to use this tag with the "site" source.
datetime_single Format combined datetime fields or separate date and time fields you want to show as a single date and time. By default, also hides midnight times and the current year. Multi-result sources (taxonomy terms or a reference/relationship field) can render a delimited date list, joined by the same Result Separator as text and bounded by each source step's own limit.
datetime_range Like datetime_single, but to format a range from separate start and end date/datetime/time fields. In a range list, the result separator joins whole ranges while the range separator stays between each start and end.
email Return an email address from meta/option field as a mailto link (by default) or as plain text. Validates stored emails (by format) and returns empty if invalid.
phone Return a phone number from meta/option field as a tel link (by default) or as plain text. Normalizes stored numbers and allows global country code configuration.
title Return post title/term name or site name.
permalink Return post/term permalink or site URL.

Combine multiple fields with join tag

Instead of stringing together multiple tags in separate span elements, use one tag to combine up to 10 text fields in either simple separator or advanced template mode:

  • Separator mode joins every non-empty value with a separator string (default ", "), skipping empties so a missing middle value never leaves a doubled separator.
  • Template mode places values by position in a format string, using tokens %A-%J to represent the configured slots (the same letters the slot panels are labelled with). The older %1-%10 tokens still work. Punctuation attached to an empty value drops with it: an empty bracketed part sheds its brackets, an empty middle part its comma, a missing unit value its mark. One format string can return both Dr. Tom M. Smith Jr., PhD, USN (Ret.) and Jane Johnson.

Output is plain text; no link options are currently available.

Note: For height and feet units, use the prime marks ′ and ″ rather than straight quotes (%A′%B″ renders 5′11″, or 5′ with no inches value). WordPress converts a straight '/" to a curly quote in normal page content, but not when the block renders through a GP Element or a hooked layout, so straight marks render inconsistently depending on where the block lives. The prime marks look the same everywhere.

Return first available field with try_ tags

try_* tags (e.g. try_text, try_image, try_content, try_datetime_single, try_email, try_phone) allow using the first available (populated) field from an editor-selected list of up to five sources/fields. Each slot resolves exactly as the standalone tag would (try_email outputs a finished mailto: link per slot, try_phone a tel: link), so a contact chain like "personal email → team email → site-wide address" works without multiple blocks and complicated visibility conditions.

Other than try_datetime_, the try_ tags accept a site source per slot, so a chain can end in a site-wide fallback value.

Return custom function output with call tag

The call tag hands off a post ID to a PHP function and returns its output. I've grouped it with GB's Post tags since it's strictly post-based, unlike the other tags. However, it still allows using a post related to the current context via a reference/relational field, and it can also pass correct post IDs when used within a Post Meta Query Loop on a reference/relational field.

Custom functions must take a post ID as their first argument (or you may get unexpected results), sanitize their own output (HTML is allowed in the return string), and be registered via bws_register_call_function():

add_action( 'init', function () {
    bws_register_call_function( 'my_result' );
} );

function my_result( $post_id, $arg = '' ) {
    return '<span>' . esc_html( get_the_title( $post_id ) ) . '</span>';
}

Properly registered functions will appear in the tag's Function dropdown for easy access. The optional Argument field allows passing a second parameter in addition to the post ID.

A security gate blocks adding PHP built-ins (system, unlink, eval, and the like) or anything that isn't a real function. All functions registered via the filter are shown, along with their security-gate status, on the admin settings page. Manually inserting an unregistered or blocked function will cause the tag to return its fallback text or return empty.

term_ tags

The term_* modifier wraps base tags, allowing term-context resolution using GenerateBlock's built-in taxonomy/term selector.

Requirements

  • WordPress 6.5+
  • GenerateBlocks Pro
  • ACF or any plugin hooking generateblocks_get_meta_pre_value for meta/option-field reads (optional)

Documentation

Acknowledgements

Of course, this is completely dependent on the work of Tom Usborne and the GeneratePress/GenerateBlocks team. But I'm also quite indebted to Taylor Drayson, whose SnippetClub tutorial How to Create Custom Dynamic Tags in GenerateBlocks 2.0: A Complete Guide started me down this path. Based on that, I began using Claude to generate my own tag code snippets, and it's grown from there through many, many versions into this plugin!

Libraries

Releases

Newest 25 of 26 recorded releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v1.20.0 latest
Sep 15, 2026 1mo ago
bws-gb-dynamic-tags-extensions-1.20.0.zip
13
Sep 10, 2026 1mo ago
bws-gb-dynamic-tags-extensions-1.19.2.zip
8
Sep 3, 2026 1mo ago
bws-gb-dynamic-tags-extensions-1.19.1.zip
6
Sep 1, 2026 1mo ago
bws-gb-dynamic-tags-extensions-1.19.0.zip
3
Aug 21, 2026 2mo ago
bws-gb-dynamic-tags-extensions-1.18.0.zip
4
Aug 19, 2026 2mo ago
bws-gb-dynamic-tags-extensions-1.17.0.zip
1
Jul 23, 2026 3mo ago
bws-gb-dynamic-tags-extensions-1.16.0.zip
5
Jul 20, 2026 3mo ago
bws-gb-dynamic-tags-extensions-1.15.1.zip
2
Jul 20, 2026 3mo ago
bws-gb-dynamic-tags-extensions-.1.15.0.zip
2
Jul 8, 2026 3mo ago
bws-gb-dynamic-tags-extensions-1.14.0.zip
3
Jul 6, 2026 3mo ago
bws-gb-dynamic-tags-extensions-1.13.0.zip
0
Jun 30, 2026 3mo ago
bws-gb-dynamic-tags-extensions-1.12.0.zip
4
Jun 26, 2026 3mo ago
bws-gb-dynamic-tags-extensions-1.11.0.zip
0
Jun 9, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.10.0.zip
0
Jun 8, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.9.2.zip
0
Jun 8, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.9.1.zip
3
Jun 8, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.9.0.zip
1
Jun 1, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.8.0.zip
0
May 29, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.7.4.zip
0
May 28, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.7.3.zip
0
May 27, 2026 4mo ago
bws-gb-dynamic-tags-extensions-1.7.2.zip
0
May 21, 2026 5mo ago
bws-gb-dynamic-tags-extensions-1.7.1.zip
0
May 20, 2026 5mo ago
bws-gb-dynamic-tags-extensions-1.7.0.zip
0
May 19, 2026 5mo ago
bws-gb-dynamic-tags-extensions-1.6.2.zip
0
May 18, 2026 5mo ago
bws-gb-dynamic-tags-extensions-1.6.1.zip
1
All releases on GitHub →
A grade

Security

GenerateBlocks Dynamic Tag Extensions by BWS 1.20.0 · audited by WP Registry

No security issues found.

Audited release
1.20.0
Findings
none
Worst severity
—
Content hash
1332bd8b8858f8a791070511…

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.