Make WordPress Core


Ignore:
Timestamp:
08/08/2024 11:28:30 AM (3 months ago)
Author:
luisherranz
Message:

Interactivity API: Allow server derived state to appear in non-final position

In some cases, derived state returns an associative array. Directives may wish to continue to access properties of the associative array, when using the syntax state.arrayReturnedByClosure.property. This patch continues evaluating the path after the associative array has been returned by the Closure.

Reviewed by adamsilverstein and gziolo.
Merges [58825] to the 6.6 branch.

Props jonsurrell, luisherranz, adamsilverstein, gziolo.

Fixes #61741.

Location:
branches/6.6
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/6.6

  • branches/6.6/src/wp-includes/interactivity-api/class-wp-interactivity-api.php

    r58327 r58869  
    522522     * @since 6.6.0 The function now adds a warning when the namespace is null, falsy, or the directive value is empty.
    523523     * @since 6.6.0 Removed `default_namespace` and `context` arguments.
     524     * @since 6.6.0 Add support for derived state.
    524525     *
    525526     * @param string|true $directive_value The directive attribute value string or `true` when it's a boolean attribute.
     
    558559                return null;
    559560            }
    560         }
    561 
    562         if ( $current instanceof Closure ) {
    563             /*
    564              * This state getter's namespace is added to the stack so that
    565              * `state()` or `get_config()` read that namespace when called
    566              * without specifying one.
    567              */
    568             array_push( $this->namespace_stack, $ns );
    569             try {
    570                 $current = $current();
    571             } catch ( Throwable $e ) {
    572                 _doing_it_wrong(
    573                     __METHOD__,
    574                     sprintf(
    575                         /* translators: 1: Path pointing to an Interactivity API state property, 2: Namespace for an Interactivity API store. */
    576                         __( 'Uncaught error executing a derived state callback with path "%1$s" and namespace "%2$s".' ),
    577                         $path,
    578                         $ns
    579                     ),
    580                     '6.6.0'
    581                 );
    582                 return null;
    583             } finally {
    584                 // Remove the property's namespace from the stack.
    585                 array_pop( $this->namespace_stack );
     561
     562            if ( $current instanceof Closure ) {
     563                /*
     564                 * This state getter's namespace is added to the stack so that
     565                 * `state()` or `get_config()` read that namespace when called
     566                 * without specifying one.
     567                 */
     568                array_push( $this->namespace_stack, $ns );
     569                try {
     570                    $current = $current();
     571                } catch ( Throwable $e ) {
     572                    _doing_it_wrong(
     573                        __METHOD__,
     574                        sprintf(
     575                            /* translators: 1: Path pointing to an Interactivity API state property, 2: Namespace for an Interactivity API store. */
     576                            __( 'Uncaught error executing a derived state callback with path "%1$s" and namespace "%2$s".' ),
     577                            $path,
     578                            $ns
     579                        ),
     580                        '6.6.0'
     581                    );
     582                    return null;
     583                } finally {
     584                    // Remove the property's namespace from the stack.
     585                    array_pop( $this->namespace_stack );
     586                }
    586587            }
    587588        }
Note: See TracChangeset for help on using the changeset viewer.