[wp-trac] [WordPress Trac] #43621: Introduce `add_action_once` and `add_filter_once` sugar.

WordPress Trac noreply at wordpress.org
Fri Mar 23 17:54:17 UTC 2018


#43621: Introduce `add_action_once` and `add_filter_once` sugar.
-----------------------------+------------------------------
 Reporter:  soulseekah       |       Owner:
     Type:  feature request  |      Status:  new
 Priority:  normal           |   Milestone:  Awaiting Review
Component:  Plugins          |     Version:
 Severity:  normal           |  Resolution:
 Keywords:                   |     Focuses:
-----------------------------+------------------------------
Description changed by SergeyBiryukov:

Old description:

> It is often useful (especially when writing tests for filters, actions)
> to run a callback only once, regardless of how many times the
> filter/action is actually applied/done.
>
> {{{
> add_filter_once( 'test_action_once', '__return_true' );
>
> $this->assertTrue( apply_filters( 'test_action_once', false ) );
> $this->assertFalse( apply_filters( 'test_action_once', false ) );
> }}}
>
> This would allow developers to run anonymous callbacks that remove
> themselves from the filter after running once. This can currently be done
> with the following ugly workarounds:
>
> {{{
> add_action( 'run_many_times', function() {
>     // do stuff once and self-destruct
>     remove_filter( 'the_title', current( $GLOBALS['wp_filter'][
> current_filter() ]->callbacks[ 10 ] )['function'] );
> } );
> }}}
>
> or
>
> {{{
> $once = null;
> add_action( 'run_many_times', $null = function() use ( &$once ) {
>     // do stuff once and self-destruct
>     remove_filter( 'the_title', $once );
> } );
> }}}
>
> This is '''not''' a duplicate of #38743, the concept is different, the
> naming is the same, yes.
>
> Non-clashing names here?
>
> - `​add_self_destructing_filter()`
> - `add_ephemaral_filter()`
> open to other suggestions :)

New description:

 It is often useful (especially when writing tests for filters, actions) to
 run a callback only once, regardless of how many times the filter/action
 is actually applied/done.

 {{{
 add_filter_once( 'test_action_once', '__return_true' );

 $this->assertTrue( apply_filters( 'test_action_once', false ) );
 $this->assertFalse( apply_filters( 'test_action_once', false ) );
 }}}

 This would allow developers to run anonymous callbacks that remove
 themselves from the filter after running once. This can currently be done
 with the following ugly workarounds:

 {{{
 add_action( 'run_many_times', function() {
     // do stuff once and self-destruct
     remove_action( 'run_many_times', current( $GLOBALS['wp_filter'][
 current_filter() ]->callbacks[ 10 ] )['function'] );
 } );
 }}}

 or

 {{{
 $once = null;
 add_action( 'run_many_times', $null = function() use ( &$once ) {
     // do stuff once and self-destruct
     remove_action( 'run_many_times', $once );
 } );
 }}}

 This is '''not''' a duplicate of #38743, the concept is different, the
 naming is the same, yes.

 Non-clashing names here?

 - `​add_self_destructing_filter()`
 - `add_ephemeral_filter()`
 open to other suggestions :)

--

--
Ticket URL: <https://core.trac.wordpress.org/ticket/43621#comment:1>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list