Repository navigation
Comments: Allow comment types to register a display callback - #53
adamsilverstein wants to merge 17 commits into
Conversation
Add a `render_callback` argument to `register_comment_type()`, stored on `WP_Comment_Type`. When a comment's registered type defines one, `Walker_Comment` uses it to render that comment, receiving the same arguments as the `callback` argument of wp_list_comments() (the comment, the arguments, and the depth). This gives custom comment types control over their own display, as raised in the tracking ticket, without each type having to filter the walker. An explicit `callback` passed to wp_list_comments() still takes precedence, and built-in types set no callback, so there is no change to existing output. See #35214.
Cover the `render_callback` argument: that a registered type's callback renders its comments through `Walker_Comment`, that an explicit wp_list_comments() `callback` takes precedence, that a type without a callback renders normally, and that the property defaults to null and stores a provided callable. See #35214.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the
|
|
The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. Core Committers: Use this line as a base for the props when committing in SVN: To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. Props Bot commandsYou can trigger Props Bot actions by commenting on this PR:
|
…ard. Add a test asserting the render_callback receives the comment, the arguments array, and the depth (the documented wp_list_comments() callback contract, previously only the comment was exercised), and a test that a non-callable render_callback is ignored via is_callable() and the comment renders normally. See #35214.
Walker_Comment prints the render_callback output verbatim, matching the existing wp_list_comments() `callback` contract. Note in both the WP_Comment_Type::$render_callback property and the register_comment_type() parameter docs that the callback is responsible for escaping its output.
…e-render-callback # Conflicts: # src/wp-includes/class-wp-comment-type.php # src/wp-includes/comment.php
…th tests. - State the full precedence chain (explicit wp_list_comments() 'callback', then 'render_callback', then default markup), the open-tag contract (output only the element opening; end_el() or 'end-callback' closes it after children), and the classic-theme-only scope (block themes never invoke Walker_Comment) in both the property and args docblocks. - Add the missing @SInCE 7.1.0 changelog entry to Walker_Comment::start_el(). - Fix the test callbacks, which echoed closed <li> elements: end_el() appends its own close, so the previous assertions passed while the markup contained stray closing tags. Assert the full element shape, pin end_el()'s close, and cover a threaded child rendering inside its parent's callback-opened element plus legacy empty-string types. - Document the render_comments() helper's $args parameter and drop cleanup-only unregister calls now handled by the test framework.
…e-render-callback # Conflicts: # src/wp-includes/comment.php
…tract. Three parts of the contract were left for a developer to infer: The callback opens the element that `Walker_Comment::end_el()` closes, and `end_el()` emits `</div>` or `</li>` depending on the `style` argument. The docs said "an unclosed `<li>` by default", which is true but reads as the whole story - a callback that always opens an `<li>` produces mismatched markup under `style => 'div'`. Say that the callback has to branch on `$args['style']`, the way the built-in `comment()` does. The name deliberately echoes `register_block_type()`, whose `render_callback` returns a string. This one is captured with an output buffer, so a return value is silently discarded. Say "must echo" rather than "output". Built-in types cannot be re-registered, but `set_props()` applies the registration args filters to them too, so `register_comment_type_args` can set a callback on 'comment', 'pingback', or 'trackback'. That is worth keeping - it grants no more than the `callback` argument of wp_list_comments() always has - so document it as the intended override path, along with the one consequence that is easy to miss: a callback on the 'comment' type replaces the walker's link stripping for pending comments.
…aths. The suite covered the default `<li>` style only, so nothing would catch a change that broke the pairing between a callback's opening tag and `end_el()`'s closing one under `style => 'div'`. Also pin the filter-based override of a built-in type. That path falls out of where `set_props()` applies the registration args filters, and is now documented as intended, so it needs a test to keep it from being tightened away as an oversight.
…e-render-callback # Conflicts: # src/wp-includes/comment.php
The branch was written while trunk was 7.1-alpha; trunk is now 7.2-alpha, so the render_callback property and the Walker_Comment behavior-change note carried @SInCE tags for a release that never contained them - the only two stragglers after the base branch re-stamped itself. Also pin the one documented clause of the callback contract that had no test: a returned string is discarded, output must be echoed. A refactor of the ob_start()/call_user_func() dispatch could otherwise start honoring return values with the suite staying green. See #35214.
…e-render-callback
…e-render-callback
The property, argument, and walker comments repeated the same contract several times and read as design notes. Trimming them to what a caller needs (arguments, precedence, open-tag and echo rules, escaping, the 'comment' type caveat) keeps the docs scannable and accurate. See #35214.
New tests should declare return types, and the render_comments() helper casts wp_list_comments() output so its string return type holds. Test docblocks are trimmed to state what each test asserts. See #35214.
…e-render-callback
Trunk is in the 7.2 beta, so these additions can no longer ship in 7.2.0.
Stack: Custom Comment Types (#35214)
register_comment_type()registration API/wp/v2/comment-typesendpointmap_meta_cap()render_callbackdisplay callback (this PR)is_pingping groupingdefault_excluded_comment_typesfilterwp_update_comment_counts()recount helperWordPress#12311 and WordPress#12310 are on WordPress/wordpress-develop; the rest are fork PRs targeting their parent branch and will retarget to trunk as their base lands.
Claude took another pass at explaining this one:
Trac ticket: https://core.trac.wordpress.org/ticket/35214
AI Use
This code and description came out of a conversation with 🤖 Claude Code. I will review and test.