Make WordPress Core


Ignore:
Timestamp:
09/08/2016 03:54:13 AM (9 years ago)
Author:
pento
Message:

Hooks: Add the new class WP_Hook, and modify hook handling to make use of it.

Filters and actions have been the basis of WordPress' plugin functionality since time immemorial, they've always been a reliable method for acting upon the current state of WordPress, and will continue to be so.

Over the years, however, edge cases have cropped up. Particularly when it comes to recursively executing hooks, or a hook adding and removing itself, the existing implementation struggled to keep up with more complex use cases.

And so, we introduce WP_Hook. By changing $wp_filter from an array of arrays, to an array of objects, we reduce the complexity of the hook handling code, as the processing code (see ::apply_filters()) only needs to be aware of itself, rather than the state of all hooks. At the same time, we're able te handle more complex use cases, as the object can more easily keep track of its own state than an array ever could.

Props jbrinley for the original architecture and design of this patch.
Props SergeyBiryukov, cheeserolls, Denis-de-Bernardy, leewillis77, wonderboymusic, nacin, jorbin, DrewAPicture, ocean90, dougwollison, khag7, pento, noplanman and aaroncampbell for their testing, suggestions, contributions, patch maintenance, cajoling and patience as we got through this.
Fixes #17817.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/filters.php

    r37911 r38571  
    297297
    298298    /**
    299      * @ticket 29070
    300      */
    301      function test_has_filter_doesnt_reset_wp_filter() {
    302         add_action( 'action_test_has_filter_doesnt_reset_wp_filter', '__return_null', 1 );
    303         add_action( 'action_test_has_filter_doesnt_reset_wp_filter', '__return_null', 2 );
    304         add_action( 'action_test_has_filter_doesnt_reset_wp_filter', '__return_null', 3 );
    305         add_action( 'action_test_has_filter_doesnt_reset_wp_filter', array( $this, '_action_test_has_filter_doesnt_reset_wp_filter' ), 4 );
    306 
    307         do_action( 'action_test_has_filter_doesnt_reset_wp_filter' );
    308      }
    309      function _action_test_has_filter_doesnt_reset_wp_filter() {
    310         global $wp_filter;
    311 
    312         has_action( 'action_test_has_filter_doesnt_reset_wp_filter', '_function_that_doesnt_exist' );
    313 
    314         $filters = current( $wp_filter['action_test_has_filter_doesnt_reset_wp_filter'] );
    315         $the_ = current( $filters );
    316         $this->assertEquals( $the_['function'], array( $this, '_action_test_has_filter_doesnt_reset_wp_filter' ) );
    317      }
    318 
    319     /**
    320299     * @ticket 10441
    321300     * @expectedDeprecated tests_apply_filters_deprecated
Note: See TracChangeset for help on using the changeset viewer.