WordPress/wp-includes/class-wp-post.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;
}
}