WordPress.org

Make WordPress Core

Ticket #43740: 43740.diff

File 43740.diff, 5.0 KB (added by MikeSchinkel, 3 years ago)

Patch that would all method filters to WP_Post

  • .php

    old new  
    219219         */
    220220        public $filter;
    221221
     222
     223        /**
     224         * Array of instances associated with support keys
     225         *
     226         * Used by hooks to delegate to
     227         *
     228         * @var object[]
     229         */
     230        private $supports = array();
     231
    222232        /**
    223233         * Retrieve WP_Post instance.
    224234         *
    225235         * @since 3.5.0
    226236         * @static
     237         * @access public
    227238         *
    228239         * @global wpdb $wpdb WordPress database abstraction object.
    229240         *
     
    263274         * @param WP_Post|object $post Post object.
    264275         */
    265276        public function __construct( $post ) {
    266                 foreach ( get_object_vars( $post ) as $key => $value )
     277                foreach ( get_object_vars( $post ) as $key => $value ) {
    267278                        $this->$key = $value;
     279                }
     280                foreach( get_all_post_type_supports( $this->post_type ) as $supports ) {
     281                        if ( ! $instance = apply_filters( 'wp_post_supports_instance', false, $supports, $this ) ) {
     282                                continue;
     283                        }
     284                        /**
     285                         * Allow plugins to add contained instances they
     286                         * can delegate to in the `wp_post__*` hooks.
     287                         */
     288                        $this->supports[ $supports ] = $instance;
     289                };
     290                do_action( 'wp_post__construct', $this, $post );
    268291        }
    269292
    270293        /**
     
    276299         * @return bool
    277300         */
    278301        public function __isset( $key ) {
    279                 if ( 'ancestors' == $key )
    280                         return true;
     302                do {
     303
     304                        if ( $isset = apply_filters( 'pre_wp_post__isset', false, $key, $this ) ) {
     305                                break;
     306                        }
    281307
    282                 if ( 'page_template' == $key )
    283                         return true;
     308                        $isset = true;
    284309
    285                 if ( 'post_category' == $key )
    286                    return true;
     310                        if ( preg_match( '#^(ancestors|page_template|post_category|tags_input)$#', $key ) ) {
     311                                break;
     312                        }
     313
     314                        $isset = metadata_exists( 'post', $this->ID, $key );
     315
     316                } while ( false );
     317
     318                return apply_filters( 'wp_post__isset', $isset, $key, $this );
     319        }
     320
     321        /**
     322         * Caller.
     323         *
     324         * @param string $method Method to call
     325         * @param array $args Parameters
     326         * @return mixed
     327         */
     328        public function __call( $method, $args = array() ) {
     329                return apply_filters( 'wp_post__call', $method, $args, $this );
     330        }
    287331
    288                 if ( 'tags_input' == $key )
    289                    return true;
    290332
    291                 return metadata_exists( 'post', $this->ID, $key );
     333        /**
     334         * Setter.
     335         *
     336         * @param string $key Key to set.
     337         * @param mixed $value Value to set to
     338         */
     339        public function __set( $key, $value ) {
     340                do_action( 'wp_post__set', $key, $value, $this );
    292341        }
    293342
    294343        /**
     
    300349         * @return mixed
    301350         */
    302351        public function __get( $key ) {
    303                 if ( 'page_template' == $key && $this->__isset( $key ) ) {
    304                         return get_post_meta( $this->ID, '_wp_page_template', true );
    305                 }
    306 
    307                 if ( 'post_category' == $key ) {
    308                         if ( is_object_in_taxonomy( $this->post_type, 'category' ) )
    309                                 $terms = get_the_terms( $this, 'category' );
    310 
    311                         if ( empty( $terms ) )
    312                                 return array();
    313 
    314                         return wp_list_pluck( $terms, 'term_id' );
    315                 }
    316 
    317                 if ( 'tags_input' == $key ) {
    318                         if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) )
    319                                 $terms = get_the_terms( $this, 'post_tag' );
    320 
    321                         if ( empty( $terms ) )
    322                                 return array();
    323 
    324                         return wp_list_pluck( $terms, 'name' );
    325                 }
     352                do {
    326353
    327                 // Rest of the values need filtering.
    328                 if ( 'ancestors' == $key )
    329                         $value = get_post_ancestors( $this );
    330                 else
    331                         $value = get_post_meta( $this->ID, $key, true );
     354                        if ( ! is_null( $value = apply_filters( 'pre_wp_post__get', null, $key, $this ) ) ) {
     355                                break;
     356                        }
     357
     358                        if ( 'page_template' == $key && $this->__isset( $key ) ) {
     359                                $value = get_post_meta( $this->ID, '_wp_page_template', true );
     360                                break;
     361                        }
     362
     363                        if ( 'post_category' == $key ) {
     364                                if ( is_object_in_taxonomy( $this->post_type, 'category' ) ) {
     365                                        $terms = get_the_terms( $this, 'category' );
     366                                }
     367
     368                                if ( empty( $terms ) ) {
     369                                        $value = array();
     370                                        break;
     371                                }
     372
     373                                $value = wp_list_pluck( $terms, 'term_id' );
     374                                break;
     375                        }
     376
     377                        if ( 'tags_input' == $key ) {
     378                                if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) ) {
     379                                        $terms = get_the_terms( $this, 'post_tag' );
     380                                }
     381
     382                                if ( empty( $terms ) ) {
     383                                        $value = array();
     384                                        break;
     385                                }
     386
     387                                $value = wp_list_pluck( $terms, 'name' );
     388                                break;
     389                        }
     390
     391                        // Rest of the values need filtering.
     392                        if ( 'ancestors' == $key ) {
     393                                $value = get_post_ancestors( $this );
     394                        } else {
     395                                $value = get_post_meta( $this->ID, $key, true );
     396                        }
     397
     398                        if ( $this->filter ) {
     399                                $value = sanitize_post_field( $key, $value, $this->ID, $this->filter );
     400                        }
    332401
    333                 if ( $this->filter )
    334                         $value = sanitize_post_field( $key, $value, $this->ID, $this->filter );
     402                } while ( false );
    335403
    336                 return $value;
     404                return apply_filters( 'wp_post__get', $value, $key, $this );
    337405        }
    338406
    339407        /**
     
    351419                if ( $filter == 'raw' )
    352420                        return self::get_instance( $this->ID );
    353421
    354                 return sanitize_post( $this, $filter );
     422                return apply_filters( 'wp_post_filter', sanitize_post( $this, $filter ), $filter, $this );
    355423        }
    356424
    357425        /**
     
    369437                                $post[ $key ] = $this->__get( $key );
    370438                }
    371439
    372                 return $post;
     440                return apply_filters( 'wp_post_to_array', $post, $this );
    373441        }
    374442}