389 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			389 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Post API: WP_Post class
 | |
|  *
 | |
|  * @package WordPress
 | |
|  * @subpackage Post
 | |
|  * @since 4.4.0
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Core class used to implement the WP_Post object.
 | |
|  *
 | |
|  * @since 3.5.0
 | |
|  *
 | |
|  * @property string $page_template
 | |
|  *
 | |
|  * @property-read int[]    $ancestors
 | |
|  * @property-read int[]    $post_category
 | |
|  * @property-read string[] $tags_input
 | |
|  */
 | |
| #[AllowDynamicProperties]
 | |
| final class WP_Post {
 | |
| 
 | |
| 	/**
 | |
| 	 * Post ID.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var int
 | |
| 	 */
 | |
| 	public $ID;
 | |
| 
 | |
| 	/**
 | |
| 	 * ID of post author.
 | |
| 	 *
 | |
| 	 * A numeric string, for compatibility reasons.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_author = 0;
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's local publication time.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_date = '0000-00-00 00:00:00';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's GMT publication time.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_date_gmt = '0000-00-00 00:00:00';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's content.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_content = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's title.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_title = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's excerpt.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_excerpt = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's status.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_status = 'publish';
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether comments are allowed.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $comment_status = 'open';
 | |
| 
 | |
| 	/**
 | |
| 	 * Whether pings are allowed.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $ping_status = 'open';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's password in plain text.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_password = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's slug.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_name = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * URLs queued to be pinged.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $to_ping = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * URLs that have been pinged.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $pinged = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's local modified time.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_modified = '0000-00-00 00:00:00';
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's GMT modified time.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_modified_gmt = '0000-00-00 00:00:00';
 | |
| 
 | |
| 	/**
 | |
| 	 * A utility DB field for post content.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_content_filtered = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * ID of a post's parent post.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var int
 | |
| 	 */
 | |
| 	public $post_parent = 0;
 | |
| 
 | |
| 	/**
 | |
| 	 * The unique identifier for a post, not necessarily a URL, used as the feed GUID.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $guid = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * A field used for ordering posts.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var int
 | |
| 	 */
 | |
| 	public $menu_order = 0;
 | |
| 
 | |
| 	/**
 | |
| 	 * The post's type, like post or page.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_type = 'post';
 | |
| 
 | |
| 	/**
 | |
| 	 * An attachment's mime type.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $post_mime_type = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * Cached comment count.
 | |
| 	 *
 | |
| 	 * A numeric string, for compatibility reasons.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $comment_count = 0;
 | |
| 
 | |
| 	/**
 | |
| 	 * Stores the post object's sanitization level.
 | |
| 	 *
 | |
| 	 * Does not correspond to a DB field.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $filter;
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieve WP_Post instance.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 *
 | |
| 	 * @global wpdb $wpdb WordPress database abstraction object.
 | |
| 	 *
 | |
| 	 * @param int $post_id Post ID.
 | |
| 	 * @return WP_Post|false Post object, false otherwise.
 | |
| 	 */
 | |
| 	public static function get_instance( $post_id ) {
 | |
| 		global $wpdb;
 | |
| 
 | |
| 		$post_id = (int) $post_id;
 | |
| 		if ( ! $post_id ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$_post = wp_cache_get( $post_id, 'posts' );
 | |
| 
 | |
| 		if ( ! $_post ) {
 | |
| 			$_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) );
 | |
| 
 | |
| 			if ( ! $_post ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			$_post = sanitize_post( $_post, 'raw' );
 | |
| 			wp_cache_add( $_post->ID, $_post, 'posts' );
 | |
| 		} elseif ( empty( $_post->filter ) || 'raw' !== $_post->filter ) {
 | |
| 			$_post = sanitize_post( $_post, 'raw' );
 | |
| 		}
 | |
| 
 | |
| 		return new WP_Post( $_post );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 *
 | |
| 	 * @param WP_Post|object $post Post object.
 | |
| 	 */
 | |
| 	public function __construct( $post ) {
 | |
| 		foreach ( get_object_vars( $post ) as $key => $value ) {
 | |
| 			$this->$key = $value;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Isset-er.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 *
 | |
| 	 * @param string $key Property to check if set.
 | |
| 	 * @return bool
 | |
| 	 */
 | |
| 	public function __isset( $key ) {
 | |
| 		if ( 'ancestors' === $key ) {
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		if ( 'page_template' === $key ) {
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		if ( 'post_category' === $key ) {
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		if ( 'tags_input' === $key ) {
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		return metadata_exists( 'post', $this->ID, $key );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Getter.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 *
 | |
| 	 * @param string $key Key to get.
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	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;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * {@Missing Summary}
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 *
 | |
| 	 * @param string $filter Filter.
 | |
| 	 * @return WP_Post
 | |
| 	 */
 | |
| 	public function filter( $filter ) {
 | |
| 		if ( $this->filter === $filter ) {
 | |
| 			return $this;
 | |
| 		}
 | |
| 
 | |
| 		if ( 'raw' === $filter ) {
 | |
| 			return self::get_instance( $this->ID );
 | |
| 		}
 | |
| 
 | |
| 		return sanitize_post( $this, $filter );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Convert object to array.
 | |
| 	 *
 | |
| 	 * @since 3.5.0
 | |
| 	 *
 | |
| 	 * @return array Object as array.
 | |
| 	 */
 | |
| 	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;
 | |
| 	}
 | |
| }
 |