c966934899b110507819c9818d102e9dddece9da
[autoinstalls/wordpress.git] / wp-includes / class-wp-post.php
1 <?php
2 /**
3  * Post API: WP_Post class
4  *
5  * @package WordPress
6  * @subpackage Post
7  * @since 4.4.0
8  */
9
10 /**
11  * Core class used to implement the WP_Post object.
12  *
13  * @since 3.5.0
14  *
15  * @property string $page_template
16  *
17  * @property-read array  $ancestors
18  * @property-read int    $post_category
19  * @property-read string $tag_input
20  *
21  */
22 final class WP_Post {
23
24         /**
25          * Post ID.
26          *
27          * @var int
28          */
29         public $ID;
30
31         /**
32          * ID of post author.
33          *
34          * A numeric string, for compatibility reasons.
35          *
36          * @var string
37          */
38         public $post_author = 0;
39
40         /**
41          * The post's local publication time.
42          *
43          * @var string
44          */
45         public $post_date = '0000-00-00 00:00:00';
46
47         /**
48          * The post's GMT publication time.
49          *
50          * @var string
51          */
52         public $post_date_gmt = '0000-00-00 00:00:00';
53
54         /**
55          * The post's content.
56          *
57          * @var string
58          */
59         public $post_content = '';
60
61         /**
62          * The post's title.
63          *
64          * @var string
65          */
66         public $post_title = '';
67
68         /**
69          * The post's excerpt.
70          *
71          * @var string
72          */
73         public $post_excerpt = '';
74
75         /**
76          * The post's status.
77          *
78          * @var string
79          */
80         public $post_status = 'publish';
81
82         /**
83          * Whether comments are allowed.
84          *
85          * @var string
86          */
87         public $comment_status = 'open';
88
89         /**
90          * Whether pings are allowed.
91          *
92          * @var string
93          */
94         public $ping_status = 'open';
95
96         /**
97          * The post's password in plain text.
98          *
99          * @var string
100          */
101         public $post_password = '';
102
103         /**
104          * The post's slug.
105          *
106          * @var string
107          */
108         public $post_name = '';
109
110         /**
111          * URLs queued to be pinged.
112          *
113          * @var string
114          */
115         public $to_ping = '';
116
117         /**
118          * URLs that have been pinged.
119          *
120          * @var string
121          */
122         public $pinged = '';
123
124         /**
125          * The post's local modified time.
126          *
127          * @var string
128          */
129         public $post_modified = '0000-00-00 00:00:00';
130
131         /**
132          * The post's GMT modified time.
133          *
134          * @var string
135          */
136         public $post_modified_gmt = '0000-00-00 00:00:00';
137
138         /**
139          * A utility DB field for post content.
140          *
141          *
142          * @var string
143          */
144         public $post_content_filtered = '';
145
146         /**
147          * ID of a post's parent post.
148          *
149          * @var int
150          */
151         public $post_parent = 0;
152
153         /**
154          * The unique identifier for a post, not necessarily a URL, used as the feed GUID.
155          *
156          * @var string
157          */
158         public $guid = '';
159
160         /**
161          * A field used for ordering posts.
162          *
163          * @var int
164          */
165         public $menu_order = 0;
166
167         /**
168          * The post's type, like post or page.
169          *
170          * @var string
171          */
172         public $post_type = 'post';
173
174         /**
175          * An attachment's mime type.
176          *
177          * @var string
178          */
179         public $post_mime_type = '';
180
181         /**
182          * Cached comment count.
183          *
184          * A numeric string, for compatibility reasons.
185          *
186          * @var string
187          */
188         public $comment_count = 0;
189
190         /**
191          * Stores the post object's sanitization level.
192          *
193          * Does not correspond to a DB field.
194          *
195          * @var string
196          */
197         public $filter;
198
199         /**
200          * Retrieve WP_Post instance.
201          *
202          * @static
203          * @access public
204          *
205          * @global wpdb $wpdb WordPress database abstraction object.
206          *
207          * @param int $post_id Post ID.
208          * @return WP_Post|false Post object, false otherwise.
209          */
210         public static function get_instance( $post_id ) {
211                 global $wpdb;
212
213                 if ( ! is_numeric( $post_id ) || $post_id != floor( $post_id ) || ! $post_id ) {
214                         return false;
215                 }
216
217                 $post_id = (int) $post_id;
218
219                 $_post = wp_cache_get( $post_id, 'posts' );
220
221                 if ( ! $_post ) {
222                         $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) );
223
224                         if ( ! $_post )
225                                 return false;
226
227                         $_post = sanitize_post( $_post, 'raw' );
228                         wp_cache_add( $_post->ID, $_post, 'posts' );
229                 } elseif ( empty( $_post->filter ) ) {
230                         $_post = sanitize_post( $_post, 'raw' );
231                 }
232
233                 return new WP_Post( $_post );
234         }
235
236         /**
237          * Constructor.
238          *
239          * @param WP_Post|object $post Post object.
240          */
241         public function __construct( $post ) {
242                 foreach ( get_object_vars( $post ) as $key => $value )
243                         $this->$key = $value;
244         }
245
246         /**
247          * Isset-er.
248          *
249          * @param string $key Property to check if set.
250          * @return bool
251          */
252         public function __isset( $key ) {
253                 if ( 'ancestors' == $key )
254                         return true;
255
256                 if ( 'page_template' == $key )
257                         return true;
258
259                 if ( 'post_category' == $key )
260                    return true;
261
262                 if ( 'tags_input' == $key )
263                    return true;
264
265                 return metadata_exists( 'post', $this->ID, $key );
266         }
267
268         /**
269          * Getter.
270          *
271          * @param string $key Key to get.
272          * @return mixed
273          */
274         public function __get( $key ) {
275                 if ( 'page_template' == $key && $this->__isset( $key ) ) {
276                         return get_post_meta( $this->ID, '_wp_page_template', true );
277                 }
278
279                 if ( 'post_category' == $key ) {
280                         if ( is_object_in_taxonomy( $this->post_type, 'category' ) )
281                                 $terms = get_the_terms( $this, 'category' );
282
283                         if ( empty( $terms ) )
284                                 return array();
285
286                         return wp_list_pluck( $terms, 'term_id' );
287                 }
288
289                 if ( 'tags_input' == $key ) {
290                         if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) )
291                                 $terms = get_the_terms( $this, 'post_tag' );
292
293                         if ( empty( $terms ) )
294                                 return array();
295
296                         return wp_list_pluck( $terms, 'name' );
297                 }
298
299                 // Rest of the values need filtering.
300                 if ( 'ancestors' == $key )
301                         $value = get_post_ancestors( $this );
302                 else
303                         $value = get_post_meta( $this->ID, $key, true );
304
305                 if ( $this->filter )
306                         $value = sanitize_post_field( $key, $value, $this->ID, $this->filter );
307
308                 return $value;
309         }
310
311         /**
312          * {@Missing Summary}
313          *
314          * @param string $filter Filter.
315          * @return self|array|bool|object|WP_Post
316          */
317         public function filter( $filter ) {
318                 if ( $this->filter == $filter )
319                         return $this;
320
321                 if ( $filter == 'raw' )
322                         return self::get_instance( $this->ID );
323
324                 return sanitize_post( $this, $filter );
325         }
326
327         /**
328          * Convert object to array.
329          *
330          * @return array Object as array.
331          */
332         public function to_array() {
333                 $post = get_object_vars( $this );
334
335                 foreach ( array( 'ancestors', 'page_template', 'post_category', 'tags_input' ) as $key ) {
336                         if ( $this->__isset( $key ) )
337                                 $post[ $key ] = $this->__get( $key );
338                 }
339
340                 return $post;
341         }
342 }