[wp-trac] [WordPress Trac] #63854: Handle a non-string passed to WP_HTML_Tag_Processor gracefully

WordPress Trac noreply at wordpress.org
Wed Aug 20 21:09:51 UTC 2025


#63854: Handle a non-string passed to WP_HTML_Tag_Processor gracefully
--------------------------+--------------------
 Reporter:  kraftbj       |      Owner:  (none)
     Type:  defect (bug)  |     Status:  new
 Priority:  normal        |  Milestone:  6.9
Component:  HTML API      |    Version:  6.2
 Severity:  normal        |   Keywords:
  Focuses:                |
--------------------------+--------------------
 The WP_HTML_Tag_Processor constructor assigns the passed value directly to
 `$this->html`. The method `get_updated_html()` is typed only to return a
 string, resulting in a runtime fatal if `null` is passed to the
 constructor.

 I proposed adding a doing_it_wrong and setting the value to an empty
 string when a non-string is passed to it.

 Discovered by a filter hooked onto `the_content` that passed the value to
 the processor. Earlier code must have nulled out the value or something
 similar.

 {{{
 wp> $html = new WP_HTML_Tag_Processor(null);
 => object(WP_HTML_Tag_Processor)#3418 (26) {
   ["html":protected]=>
   NULL
   ["last_query":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["sought_tag_name":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["sought_class_name":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["sought_match_offset":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["stop_on_tag_closers":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["parser_state":protected]=>
   string(11) "STATE_READY"
   ["compat_mode":protected]=>
   string(14) "no-quirks-mode"
   ["parsing_namespace":"WP_HTML_Tag_Processor":private]=>
   string(4) "html"
   ["comment_type":protected]=>
   NULL
   ["text_node_classification":protected]=>
   string(15) "TEXT_IS_GENERIC"
   ["bytes_already_parsed":"WP_HTML_Tag_Processor":private]=>
   int(0)
   ["token_starts_at":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["token_length":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["tag_name_starts_at":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["tag_name_length":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["text_starts_at":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["text_length":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["is_closing_tag":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["attributes":"WP_HTML_Tag_Processor":private]=>
   array(0) {
   }
   ["duplicate_attributes":"WP_HTML_Tag_Processor":private]=>
   NULL
   ["classname_updates":"WP_HTML_Tag_Processor":private]=>
   array(0) {
   }
   ["bookmarks":protected]=>
   array(0) {
   }
   ["lexical_updates":protected]=>
   array(0) {
   }
   ["seek_count":protected]=>
   int(0)
   ["skip_newline_at":"WP_HTML_Tag_Processor":private]=>
   NULL
 }
 wp> $html->get_updated_html();
 Fatal error: Uncaught TypeError:
 WP_HTML_Tag_Processor::get_updated_html(): Return value must be of type
 string, null returned in /srv/htdocs/__wp__/wp-includes/html-api/class-wp-
 html-tag-processor.php:4146
 Stack trace:
 #0 phar:///usr/local/bin/wp-cli/vendor/wp-cli/shell-
 command/src/WP_CLI/Shell/REPL.php(46) : eval()'d code(1):
 WP_HTML_Tag_Processor->get_updated_html()
 #1 phar:///usr/local/bin/wp-cli/vendor/wp-cli/shell-
 command/src/WP_CLI/Shell/REPL.php(46): eval()
 #2 phar:///usr/local/bin/wp-cli/vendor/wp-cli/shell-
 command/src/Shell_Command.php(52): WP_CLI\Shell\REPL->start()
 #3 [internal function]: Shell_Command->__invoke(Array, Array)
 #4 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/WP_CLI/Dispatcher/CommandFactory.php(100): call_user_func(Array,
 Array, Array)
 #5 [internal function]:
 WP_CLI\Dispatcher\CommandFactory::WP_CLI\Dispatcher\{closure}(Array,
 Array)
 #6 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/WP_CLI/Dispatcher/Subcommand.php(497):
 call_user_func(Object(Closure), Array, Array)
 #7 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/WP_CLI/Runner.php(470):
 WP_CLI\Dispatcher\Subcommand->invoke(Array, Array, Array)
 #8 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/WP_CLI/Runner.php(493): WP_CLI\Runner->run_command(Array, Array)
 #9 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/WP_CLI/Runner.php(1295): WP_CLI\Runner->run_command_and_exit()
 #10 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/WP_CLI/Bootstrap/LaunchRunner.php(28): WP_CLI\Runner->start()
 #11 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-
 cli/php/bootstrap.php(84):
 WP_CLI\Bootstrap\LaunchRunner->process(Object(WP_CLI\Bootstrap\BootstrapState))
 #12 phar:///usr/local/bin/wp-cli/vendor/wp-cli/wp-cli/php/wp-cli.php(35):
 WP_CLI\bootstrap()
 #13 phar:///usr/local/bin/wp-cli/php/boot-phar.php(20):
 include('phar:///usr/loc...')
 #14 /usr/local/bin/wp-cli(4): include('phar:///usr/loc...')
 #15 {main}
   thrown in /srv/htdocs/__wp__/wp-includes/html-api/class-wp-html-tag-
 processor.php on line 4146
 }}}

-- 
Ticket URL: <https://core.trac.wordpress.org/ticket/63854>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list