+ public function __isset( $key ) {
+ if ( 'ancestors' == $key )
+ return true;
+
+ if ( 'page_template' == $key )
+ return ( 'page' == $this->post_type );
+
+ if ( 'post_category' == $key )
+ return true;
+
+ if ( 'tags_input' == $key )
+ return true;
+
+ return metadata_exists( 'post', $this->ID, $key );
+ }
+
+ public function __get( $key ) {
+ if ( 'page_template' == $key && $this->__isset( $key ) ) {
+ return get_post_meta( $this->ID, '_wp_page_template', true );
+ }
+
+ if ( 'post_category' == $key ) {
+ if ( is_object_in_taxonomy( $this->post_type, 'category' ) )
+ $terms = get_the_terms( $this, 'category' );
+
+ if ( empty( $terms ) )
+ return array();
+
+ return wp_list_pluck( $terms, 'term_id' );
+ }
+
+ if ( 'tags_input' == $key ) {
+ if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) )
+ $terms = get_the_terms( $this, 'post_tag' );
+
+ if ( empty( $terms ) )
+ return array();
+
+ return wp_list_pluck( $terms, 'name' );
+ }
+
+ // Rest of the values need filtering
+
+ if ( 'ancestors' == $key )
+ $value = get_post_ancestors( $this );
+ else
+ $value = get_post_meta( $this->ID, $key, true );
+
+ if ( $this->filter )
+ $value = sanitize_post_field( $key, $value, $this->ID, $this->filter );
+
+ return $value;
+ }
+
+ public function filter( $filter ) {
+ if ( $this->filter == $filter )
+ return $this;
+
+ if ( $filter == 'raw' )
+ return self::get_instance( $this->ID );
+
+ return sanitize_post( $this, $filter );
+ }
+
+ public function to_array() {
+ $post = get_object_vars( $this );
+
+ foreach ( array( 'ancestors', 'page_template', 'post_category', 'tags_input' ) as $key ) {
+ if ( $this->__isset( $key ) )
+ $post[ $key ] = $this->__get( $key );
+ }
+
+ return $post;