Shortcode Enhancements — at Initial Version
|Reported by:||deadowl||Owned by:|
Somewhat of a copy of a post to wp-hackers: I wrote my own implementation of shortcodes. It does things a bit
differently, has nested evaluation, and allows self-nesting. Since
there are some significant differences to the existing implementation,
A lot of the changes are borrowed
from definitions in the HTML specification (particularly name and
attribute matching). The following are the comments at the top of my
shortcode file. I tried to keep track of all the differences (and
From Test Cases
Shortcode Statuses (to implement, or not to implement?)
enabled = the shortcode works as normal (default)
strip = the shortcode will be parsed and removed. e.g.
'[shortcode foo="bar"]' produces . '[shortcode]fooshortcode'
faux = the shortcode will be abbreviated. e.g. '[shortcode
foo="bar"]' products '[shortcode]'. '[shortocde]fooshortcode'
disabled = the shortcode is not parsed at all. e.g.
'[shortcode foo="bar"]' products '[shortcode foo="bar"]'
- You can nest any tag at any depth regardless of ancestors
- Tag and attribute names may match
/[A-Za-z][-A-Za-z0-9_:.]** (trialing /* because that comment ends),
with case-insensitive interpretation
- Interpretation doesn't get tripped up by things like hyphens
- Addressing Ticket #12760,
- Changed from fix in #6518 Reasoning: balancing double-square-brackets can have
misleading results with nesting
- Shortcodes escapable by using , ?
- ']]' is escaped "right to left", so '[shortcode]]]' would
evaluate to 'result]'
- '' is escaped left to right '[[[shortcode?]' => '[result]'
- Only matches valid shortcode for registered hooks,
everything else will appear as text
- Can register multiple hooks to single shortcode, uses
priority (default: 10)
- Conflicting Design Changes
- Quoted literals are escaped by entities rather than cslashes
- Inline (self-closing) shortcodes get passed content to
accomodate multiple callbacks
- No equivalent to shortcode_parse_atts function (Not marked private in function reference, but not
documented in shortcode API page)
- Boolean attributes take the place of positional attributes [foo bar] gets attributes array('bar' => 'bar') instead of
array('0' => 'bar')
- Disallows attribute and tag names that don't match
- Disallows unquoted attribute values (also boolean
attributes), unless they match /[-A-Za-z0-9_:.]+/
Basic Interpretation Method:
- If an open tag is encountered, it is added to the stack
- If a close tag is encountered and there is no matching open tag on the stack the close tag is ignored
- If a close tag is encountered and there is a matching open tag on the stack all opened tags on the stack before the matched tag will be
- If text or an inline tag is encountered, it will be evaluated to its parent's content immediately
- If tags are not closed by the end of the interpretation, they will
- Haven't written new unit tests to reflect new functionality added,
- Documentation is not as good (though I hope most of the code is
- Not 100% backwards compatible