Make WordPress Core

Changeset 38041


Ignore:
Timestamp:
07/13/2016 04:45:50 AM (8 years ago)
Author:
jeremyfelt
Message:

Meta: Ensure filters are backwards compatible for pre-4.6 style meta registration.

When using register_meta() with the function signature from 4.5 and earlier, the auth_{$type}_meta_{$key} and sanitize_{$type}_meta_{$key} filters are used. Any calls to register_meta() expecting this behavior should continue to work. The new filters, which take advantage of object subtypes, should not be added unless the proper $args array is passed.

See #35658.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/meta.php

    r38040 r38041  
    10331033    // There used to be individual args for sanitize and auth callbacks
    10341034    $has_old_sanitize_cb = false;
     1035    $has_old_auth_cb = false;
    10351036
    10361037    if ( is_callable( $args ) ) {
     
    10461047    if ( is_callable( $deprecated ) ) {
    10471048        $args['auth_callback'] = $deprecated;
     1049        $has_old_auth_cb = true;
    10481050    }
    10491051
     
    10631065
    10641066    // Object subtype is required if using the args style of registration
    1065     if ( ! $has_old_sanitize_cb && empty( $args['object_subtype'] ) ) {
     1067    if ( ! $has_old_sanitize_cb && ! $has_old_auth_cb && empty( $args['object_subtype'] ) ) {
    10661068        return new WP_Error( 'register_meta_failed', __( 'Meta must be registered against an object subtype.' ) );
    10671069    }
     
    10821084    }
    10831085
    1084     // Back-compat: old sanitize and auth callbacks applied to all of an object type
    1085     if ( $has_old_sanitize_cb ) {
     1086    // Back-compat: old sanitize and auth callbacks are applied to all of an object type.
     1087    if ( $has_old_sanitize_cb && is_callable( $args['sanitize_callback'] ) ) {
    10861088        add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
     1089    }
     1090
     1091    if ( $has_old_auth_cb && is_callable( $args['auth_callback'] ) ) {
    10871092        add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
    1088     } else {
     1093    }
     1094
     1095    if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb) {
    10891096        if ( is_callable( $args['sanitize_callback'] ) ) {
    10901097            add_filter( "sanitize_{$object_type}_{$object_subtype}_meta_{$meta_key}", $args['sanitize_callback'], 10, 4 );
  • trunk/tests/phpunit/tests/meta/registerMeta.php

    r38040 r38041  
    3333    }
    3434
     35    public function _old_auth_meta_cb( $allowed, $meta_key, $post_id, $user_id, $cap, $caps ) {
     36        return $allowed;
     37    }
     38
    3539    public function _new_auth_meta_cb( $allowed, $meta_key, $post_id, $user_id, $cap, $caps ) {
    3640        return $allowed;
     41    }
     42
     43    public function test_register_meta_back_compat_with_auth_callback_and_no_sanitize_callback_has_old_style_auth_filter() {
     44        register_meta( 'post', 'flight_number', null, array( $this, '_old_auth_meta_cb' ) );
     45        $has_filter = has_filter( 'auth_post_meta_flight_number', array( $this, '_old_auth_meta_cb' ) );
     46        remove_filter( 'auth_post_meta_flight_number', array( $this, '_old_auth_meta_cb' ) );
     47
     48        // The filter should have been added with a priority of 10.
     49        $this->assertEquals( 10, $has_filter );
     50    }
     51
     52    public function test_register_meta_back_compat_with_sanitize_callback_and_no_auth_callback_has_old_style_sanitize_filter() {
     53        register_meta( 'post', 'flight_number', array( $this, '_old_sanitize_meta_cb' ) );
     54        $has_filter = has_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb' ) );
     55        remove_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb' ) );
     56
     57        $this->assertEquals( 10, $has_filter );
     58    }
     59
     60    public function test_register_meta_back_compat_with_auth_and_sanitize_callback_has_old_style_filters() {
     61        register_meta( 'post', 'flight_number', array( $this, '_old_sanitize_meta_cb' ), array( $this, '_old_auth_meta_cb' ) );
     62        $has_filters = array();
     63        $has_filters['auth'] = has_filter( 'auth_post_meta_flight_number', array( $this, '_old_auth_meta_cb' ) );
     64        $has_filters['sanitize'] = has_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb' ) );
     65        remove_filter( 'auth_post_meta_flight_number', array( $this, '_old_auth_meta_cb' ) );
     66        remove_filter( 'sanitize_post_meta_flight_number', array( $this, '_old_sanitize_meta_cb' ) );
     67
     68        $this->assertEquals( array( 'auth' => 10, 'sanitize' => 10 ), $has_filters );
    3769    }
    3870
Note: See TracChangeset for help on using the changeset viewer.