This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * Post revision functions. |
||
4 | * |
||
5 | * @package WordPress |
||
6 | * @subpackage Post_Revisions |
||
7 | */ |
||
8 | |||
9 | /** |
||
10 | * Determines which fields of posts are to be saved in revisions. |
||
11 | * |
||
12 | * @since 2.6.0 |
||
13 | * @since 4.5.0 A `WP_Post` object can now be passed to the `$post` parameter. |
||
14 | * @since 4.5.0 The optional `$autosave` parameter was deprecated and renamed to `$deprecated`. |
||
15 | * @access private |
||
16 | * |
||
17 | * @staticvar array $fields |
||
18 | * |
||
19 | * @param array|WP_Post $post Optional. A post array or a WP_Post object being processed |
||
20 | * for insertion as a post revision. Default empty array. |
||
21 | * @param bool $deprecated Not used. |
||
22 | * @return array Array of fields that can be versioned. |
||
23 | */ |
||
24 | function _wp_post_revision_fields( $post = array(), $deprecated = false ) { |
||
0 ignored issues
–
show
|
|||
25 | static $fields = null; |
||
26 | |||
27 | if ( ! is_array( $post ) ) { |
||
28 | $post = get_post( $post, ARRAY_A ); |
||
29 | } |
||
30 | |||
31 | if ( is_null( $fields ) ) { |
||
32 | // Allow these to be versioned |
||
33 | $fields = array( |
||
34 | 'post_title' => __( 'Title' ), |
||
35 | 'post_content' => __( 'Content' ), |
||
36 | 'post_excerpt' => __( 'Excerpt' ), |
||
37 | ); |
||
38 | } |
||
39 | |||
40 | /** |
||
41 | * Filters the list of fields saved in post revisions. |
||
42 | * |
||
43 | * Included by default: 'post_title', 'post_content' and 'post_excerpt'. |
||
44 | * |
||
45 | * Disallowed fields: 'ID', 'post_name', 'post_parent', 'post_date', |
||
46 | * 'post_date_gmt', 'post_status', 'post_type', 'comment_count', |
||
47 | * and 'post_author'. |
||
48 | * |
||
49 | * @since 2.6.0 |
||
50 | * @since 4.5.0 The `$post` parameter was added. |
||
51 | * |
||
52 | * @param array $fields List of fields to revision. Contains 'post_title', |
||
53 | * 'post_content', and 'post_excerpt' by default. |
||
54 | * @param array $post A post array being processed for insertion as a post revision. |
||
55 | */ |
||
56 | $fields = apply_filters( '_wp_post_revision_fields', $fields, $post ); |
||
57 | |||
58 | // WP uses these internally either in versioning or elsewhere - they cannot be versioned |
||
59 | foreach ( array( 'ID', 'post_name', 'post_parent', 'post_date', 'post_date_gmt', 'post_status', 'post_type', 'comment_count', 'post_author' ) as $protect ) { |
||
60 | unset( $fields[ $protect ] ); |
||
61 | } |
||
62 | |||
63 | |||
64 | return $fields; |
||
65 | } |
||
66 | |||
67 | /** |
||
68 | * Returns a post array ready to be inserted into the posts table as a post revision. |
||
69 | * |
||
70 | * @since 4.5.0 |
||
71 | * @access private |
||
72 | * |
||
73 | * @param array|WP_Post $post Optional. A post array or a WP_Post object to be processed |
||
74 | * for insertion as a post revision. Default empty array. |
||
75 | * @param bool $autosave Optional. Is the revision an autosave? Default false. |
||
76 | * @return array Post array ready to be inserted as a post revision. |
||
77 | */ |
||
78 | function _wp_post_revision_data( $post = array(), $autosave = false ) { |
||
79 | if ( ! is_array( $post ) ) { |
||
80 | $post = get_post( $post, ARRAY_A ); |
||
81 | } |
||
82 | |||
83 | $fields = _wp_post_revision_fields( $post ); |
||
84 | |||
85 | $revision_data = array(); |
||
86 | |||
87 | foreach ( array_intersect( array_keys( $post ), array_keys( $fields ) ) as $field ) { |
||
88 | $revision_data[ $field ] = $post[ $field ]; |
||
89 | } |
||
90 | |||
91 | $revision_data['post_parent'] = $post['ID']; |
||
92 | $revision_data['post_status'] = 'inherit'; |
||
93 | $revision_data['post_type'] = 'revision'; |
||
94 | $revision_data['post_name'] = $autosave ? "$post[ID]-autosave-v1" : "$post[ID]-revision-v1"; // "1" is the revisioning system version |
||
95 | $revision_data['post_date'] = isset( $post['post_modified'] ) ? $post['post_modified'] : ''; |
||
96 | $revision_data['post_date_gmt'] = isset( $post['post_modified_gmt'] ) ? $post['post_modified_gmt'] : ''; |
||
97 | |||
98 | return $revision_data; |
||
99 | } |
||
100 | |||
101 | /** |
||
102 | * Creates a revision for the current version of a post. |
||
103 | * |
||
104 | * Typically used immediately after a post update, as every update is a revision, |
||
105 | * and the most recent revision always matches the current post. |
||
106 | * |
||
107 | * @since 2.6.0 |
||
108 | * |
||
109 | * @param int $post_id The ID of the post to save as a revision. |
||
110 | * @return int|WP_Error|void Void or 0 if error, new revision ID, if success. |
||
111 | */ |
||
112 | function wp_save_post_revision( $post_id ) { |
||
113 | if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) |
||
114 | return; |
||
115 | |||
116 | if ( ! $post = get_post( $post_id ) ) |
||
117 | return; |
||
118 | |||
119 | if ( ! post_type_supports( $post->post_type, 'revisions' ) ) |
||
120 | return; |
||
121 | |||
122 | if ( 'auto-draft' == $post->post_status ) |
||
123 | return; |
||
124 | |||
125 | if ( ! wp_revisions_enabled( $post ) ) |
||
126 | return; |
||
127 | |||
128 | // Compare the proposed update with the last stored revision verifying that |
||
129 | // they are different, unless a plugin tells us to always save regardless. |
||
130 | // If no previous revisions, save one |
||
131 | if ( $revisions = wp_get_post_revisions( $post_id ) ) { |
||
132 | // grab the last revision, but not an autosave |
||
133 | foreach ( $revisions as $revision ) { |
||
134 | if ( false !== strpos( $revision->post_name, "{$revision->post_parent}-revision" ) ) { |
||
135 | $last_revision = $revision; |
||
136 | break; |
||
137 | } |
||
138 | } |
||
139 | |||
140 | /** |
||
141 | * Filters whether the post has changed since the last revision. |
||
142 | * |
||
143 | * By default a revision is saved only if one of the revisioned fields has changed. |
||
144 | * This filter can override that so a revision is saved even if nothing has changed. |
||
145 | * |
||
146 | * @since 3.6.0 |
||
147 | * |
||
148 | * @param bool $check_for_changes Whether to check for changes before saving a new revision. |
||
149 | * Default true. |
||
150 | * @param WP_Post $last_revision The last revision post object. |
||
151 | * @param WP_Post $post The post object. |
||
152 | * |
||
153 | */ |
||
154 | if ( isset( $last_revision ) && apply_filters( 'wp_save_post_revision_check_for_changes', $check_for_changes = true, $last_revision, $post ) ) { |
||
155 | $post_has_changed = false; |
||
156 | |||
157 | foreach ( array_keys( _wp_post_revision_fields( $post ) ) as $field ) { |
||
158 | if ( normalize_whitespace( $post->$field ) != normalize_whitespace( $last_revision->$field ) ) { |
||
159 | $post_has_changed = true; |
||
160 | break; |
||
161 | } |
||
162 | } |
||
163 | |||
164 | /** |
||
165 | * Filters whether a post has changed. |
||
166 | * |
||
167 | * By default a revision is saved only if one of the revisioned fields has changed. |
||
168 | * This filter allows for additional checks to determine if there were changes. |
||
169 | * |
||
170 | * @since 4.1.0 |
||
171 | * |
||
172 | * @param bool $post_has_changed Whether the post has changed. |
||
173 | * @param WP_Post $last_revision The last revision post object. |
||
174 | * @param WP_Post $post The post object. |
||
175 | * |
||
176 | */ |
||
177 | $post_has_changed = (bool) apply_filters( 'wp_save_post_revision_post_has_changed', $post_has_changed, $last_revision, $post ); |
||
178 | |||
179 | //don't save revision if post unchanged |
||
180 | if ( ! $post_has_changed ) { |
||
181 | return; |
||
182 | } |
||
183 | } |
||
184 | } |
||
185 | |||
186 | $return = _wp_put_post_revision( $post ); |
||
187 | |||
188 | // If a limit for the number of revisions to keep has been set, |
||
189 | // delete the oldest ones. |
||
190 | $revisions_to_keep = wp_revisions_to_keep( $post ); |
||
191 | |||
192 | if ( $revisions_to_keep < 0 ) |
||
193 | return $return; |
||
194 | |||
195 | $revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) ); |
||
196 | |||
197 | $delete = count($revisions) - $revisions_to_keep; |
||
198 | |||
199 | if ( $delete < 1 ) |
||
200 | return $return; |
||
201 | |||
202 | $revisions = array_slice( $revisions, 0, $delete ); |
||
203 | |||
204 | for ( $i = 0; isset( $revisions[$i] ); $i++ ) { |
||
205 | if ( false !== strpos( $revisions[ $i ]->post_name, 'autosave' ) ) |
||
206 | continue; |
||
207 | |||
208 | wp_delete_post_revision( $revisions[ $i ]->ID ); |
||
209 | } |
||
210 | |||
211 | return $return; |
||
212 | } |
||
213 | |||
214 | /** |
||
215 | * Retrieve the autosaved data of the specified post. |
||
216 | * |
||
217 | * Returns a post object containing the information that was autosaved for the |
||
218 | * specified post. If the optional $user_id is passed, returns the autosave for that user |
||
219 | * otherwise returns the latest autosave. |
||
220 | * |
||
221 | * @since 2.6.0 |
||
222 | * |
||
223 | * @param int $post_id The post ID. |
||
224 | * @param int $user_id Optional The post author ID. |
||
225 | * @return WP_Post|false The autosaved data or false on failure or when no autosave exists. |
||
226 | */ |
||
227 | function wp_get_post_autosave( $post_id, $user_id = 0 ) { |
||
228 | $revisions = wp_get_post_revisions( $post_id, array( 'check_enabled' => false ) ); |
||
229 | |||
230 | foreach ( $revisions as $revision ) { |
||
231 | if ( false !== strpos( $revision->post_name, "{$post_id}-autosave" ) ) { |
||
232 | if ( $user_id && $user_id != $revision->post_author ) |
||
233 | continue; |
||
234 | |||
235 | return $revision; |
||
236 | } |
||
237 | } |
||
238 | |||
239 | return false; |
||
240 | } |
||
241 | |||
242 | /** |
||
243 | * Determines if the specified post is a revision. |
||
244 | * |
||
245 | * @since 2.6.0 |
||
246 | * |
||
247 | * @param int|WP_Post $post Post ID or post object. |
||
248 | * @return false|int False if not a revision, ID of revision's parent otherwise. |
||
249 | */ |
||
250 | function wp_is_post_revision( $post ) { |
||
251 | if ( !$post = wp_get_post_revision( $post ) ) |
||
252 | return false; |
||
253 | |||
254 | return (int) $post->post_parent; |
||
255 | } |
||
256 | |||
257 | /** |
||
258 | * Determines if the specified post is an autosave. |
||
259 | * |
||
260 | * @since 2.6.0 |
||
261 | * |
||
262 | * @param int|WP_Post $post Post ID or post object. |
||
263 | * @return false|int False if not a revision, ID of autosave's parent otherwise |
||
264 | */ |
||
265 | function wp_is_post_autosave( $post ) { |
||
266 | if ( !$post = wp_get_post_revision( $post ) ) |
||
267 | return false; |
||
268 | |||
269 | if ( false !== strpos( $post->post_name, "{$post->post_parent}-autosave" ) ) |
||
270 | return (int) $post->post_parent; |
||
271 | |||
272 | return false; |
||
273 | } |
||
274 | |||
275 | /** |
||
276 | * Inserts post data into the posts table as a post revision. |
||
277 | * |
||
278 | * @since 2.6.0 |
||
279 | * @access private |
||
280 | * |
||
281 | * @param int|WP_Post|array|null $post Post ID, post object OR post array. |
||
282 | * @param bool $autosave Optional. Is the revision an autosave? |
||
283 | * @return int|WP_Error WP_Error or 0 if error, new revision ID if success. |
||
284 | */ |
||
285 | function _wp_put_post_revision( $post = null, $autosave = false ) { |
||
286 | if ( is_object($post) ) |
||
287 | $post = get_object_vars( $post ); |
||
288 | elseif ( !is_array($post) ) |
||
289 | $post = get_post($post, ARRAY_A); |
||
290 | |||
291 | if ( ! $post || empty($post['ID']) ) |
||
292 | return new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) ); |
||
293 | |||
294 | if ( isset($post['post_type']) && 'revision' == $post['post_type'] ) |
||
295 | return new WP_Error( 'post_type', __( 'Cannot create a revision of a revision' ) ); |
||
296 | |||
297 | $post = _wp_post_revision_data( $post, $autosave ); |
||
298 | $post = wp_slash($post); //since data is from db |
||
299 | |||
300 | $revision_id = wp_insert_post( $post ); |
||
301 | if ( is_wp_error($revision_id) ) |
||
302 | return $revision_id; |
||
303 | |||
304 | if ( $revision_id ) { |
||
305 | /** |
||
306 | * Fires once a revision has been saved. |
||
307 | * |
||
308 | * @since 2.6.0 |
||
309 | * |
||
310 | * @param int $revision_id Post revision ID. |
||
311 | */ |
||
312 | do_action( '_wp_put_post_revision', $revision_id ); |
||
313 | } |
||
314 | |||
315 | return $revision_id; |
||
316 | } |
||
317 | |||
318 | /** |
||
319 | * Gets a post revision. |
||
320 | * |
||
321 | * @since 2.6.0 |
||
322 | * |
||
323 | * @param int|WP_Post $post The post ID or object. |
||
324 | * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to |
||
325 | * a WP_Post object, an associative array, or a numeric array, respectively. Default OBJECT. |
||
326 | * @param string $filter Optional sanitation filter. See sanitize_post(). |
||
327 | * @return WP_Post|array|null WP_Post (or array) on success, or null on failure. |
||
328 | */ |
||
329 | function wp_get_post_revision(&$post, $output = OBJECT, $filter = 'raw') { |
||
330 | if ( !$revision = get_post( $post, OBJECT, $filter ) ) |
||
331 | return $revision; |
||
332 | if ( 'revision' !== $revision->post_type ) |
||
333 | return null; |
||
334 | |||
335 | if ( $output == OBJECT ) { |
||
336 | return $revision; |
||
337 | } elseif ( $output == ARRAY_A ) { |
||
338 | $_revision = get_object_vars($revision); |
||
339 | return $_revision; |
||
340 | } elseif ( $output == ARRAY_N ) { |
||
341 | $_revision = array_values(get_object_vars($revision)); |
||
342 | return $_revision; |
||
343 | } |
||
344 | |||
345 | return $revision; |
||
346 | } |
||
347 | |||
348 | /** |
||
349 | * Restores a post to the specified revision. |
||
350 | * |
||
351 | * Can restore a past revision using all fields of the post revision, or only selected fields. |
||
352 | * |
||
353 | * @since 2.6.0 |
||
354 | * |
||
355 | * @param int|WP_Post $revision_id Revision ID or revision object. |
||
356 | * @param array $fields Optional. What fields to restore from. Defaults to all. |
||
0 ignored issues
–
show
Should the type for parameter
$fields not be array|null ? Also, consider making the array more specific, something like array<String> , or String[] .
This check looks for It makes a suggestion as to what type it considers more descriptive. In addition it
looks for parameters that have the generic type Most often this is a case of a parameter that can be null in addition to its declared types. ![]() |
|||
357 | * @return int|false|null Null if error, false if no fields to restore, (int) post ID if success. |
||
0 ignored issues
–
show
Should the return type not be
array|null|false|WP_Error|integer ? Also, consider making the array more specific, something like array<String> , or String[] .
This check compares the return type specified in the If the return type contains the type array, this check recommends the use of
a more specific type like ![]() |
|||
358 | */ |
||
359 | function wp_restore_post_revision( $revision_id, $fields = null ) { |
||
360 | if ( !$revision = wp_get_post_revision( $revision_id, ARRAY_A ) ) |
||
361 | return $revision; |
||
362 | |||
363 | if ( !is_array( $fields ) ) |
||
364 | $fields = array_keys( _wp_post_revision_fields( $revision ) ); |
||
365 | |||
366 | $update = array(); |
||
367 | foreach ( array_intersect( array_keys( $revision ), $fields ) as $field ) { |
||
368 | $update[$field] = $revision[$field]; |
||
369 | } |
||
370 | |||
371 | if ( !$update ) |
||
0 ignored issues
–
show
The expression
$update of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent. Consider making the comparison explicit by using ![]() |
|||
372 | return false; |
||
373 | |||
374 | $update['ID'] = $revision['post_parent']; |
||
375 | |||
376 | $update = wp_slash( $update ); //since data is from db |
||
377 | |||
378 | $post_id = wp_update_post( $update ); |
||
379 | if ( ! $post_id || is_wp_error( $post_id ) ) |
||
380 | return $post_id; |
||
381 | |||
382 | // Update last edit user |
||
383 | update_post_meta( $post_id, '_edit_last', get_current_user_id() ); |
||
384 | |||
385 | /** |
||
386 | * Fires after a post revision has been restored. |
||
387 | * |
||
388 | * @since 2.6.0 |
||
389 | * |
||
390 | * @param int $post_id Post ID. |
||
391 | * @param int $revision_id Post revision ID. |
||
392 | */ |
||
393 | do_action( 'wp_restore_post_revision', $post_id, $revision['ID'] ); |
||
394 | |||
395 | return $post_id; |
||
396 | } |
||
397 | |||
398 | /** |
||
399 | * Deletes a revision. |
||
400 | * |
||
401 | * Deletes the row from the posts table corresponding to the specified revision. |
||
402 | * |
||
403 | * @since 2.6.0 |
||
404 | * |
||
405 | * @param int|WP_Post $revision_id Revision ID or revision object. |
||
406 | * @return array|false|WP_Post|WP_Error|null Null or WP_Error if error, deleted post if success. |
||
0 ignored issues
–
show
|
|||
407 | */ |
||
408 | function wp_delete_post_revision( $revision_id ) { |
||
409 | if ( ! $revision = wp_get_post_revision( $revision_id ) ) { |
||
410 | return $revision; |
||
411 | } |
||
412 | |||
413 | $delete = wp_delete_post( $revision->ID ); |
||
414 | if ( $delete ) { |
||
415 | /** |
||
416 | * Fires once a post revision has been deleted. |
||
417 | * |
||
418 | * @since 2.6.0 |
||
419 | * |
||
420 | * @param int $revision_id Post revision ID. |
||
421 | * @param object|array $revision Post revision object or array. |
||
422 | */ |
||
423 | do_action( 'wp_delete_post_revision', $revision->ID, $revision ); |
||
424 | } |
||
425 | |||
426 | return $delete; |
||
427 | } |
||
428 | |||
429 | /** |
||
430 | * Returns all revisions of specified post. |
||
431 | * |
||
432 | * @since 2.6.0 |
||
433 | * |
||
434 | * @see get_children() |
||
435 | * |
||
436 | * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global `$post`. |
||
0 ignored issues
–
show
|
|||
437 | * @param array|null $args Optional. Arguments for retrieving post revisions. Default null. |
||
438 | * @return array An array of revisions, or an empty array if none. |
||
439 | */ |
||
440 | function wp_get_post_revisions( $post_id = 0, $args = null ) { |
||
441 | $post = get_post( $post_id ); |
||
442 | if ( ! $post || empty( $post->ID ) ) |
||
443 | return array(); |
||
444 | |||
445 | $defaults = array( 'order' => 'DESC', 'orderby' => 'date ID', 'check_enabled' => true ); |
||
446 | $args = wp_parse_args( $args, $defaults ); |
||
0 ignored issues
–
show
It seems like
$args can also be of type null ; however, wp_parse_args() does only seem to accept string|array|object , maybe add an additional type check?
If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check: /**
* @return array|string
*/
function returnsDifferentValues($x) {
if ($x) {
return 'foo';
}
return array();
}
$x = returnsDifferentValues($y);
if (is_array($x)) {
// $x is an array.
}
If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue. ![]() |
|||
447 | |||
448 | if ( $args['check_enabled'] && ! wp_revisions_enabled( $post ) ) |
||
449 | return array(); |
||
450 | |||
451 | $args = array_merge( $args, array( 'post_parent' => $post->ID, 'post_type' => 'revision', 'post_status' => 'inherit' ) ); |
||
452 | |||
453 | if ( ! $revisions = get_children( $args ) ) |
||
454 | return array(); |
||
455 | |||
456 | return $revisions; |
||
457 | } |
||
458 | |||
459 | /** |
||
460 | * Determine if revisions are enabled for a given post. |
||
461 | * |
||
462 | * @since 3.6.0 |
||
463 | * |
||
464 | * @param WP_Post $post The post object. |
||
465 | * @return bool True if number of revisions to keep isn't zero, false otherwise. |
||
466 | */ |
||
467 | function wp_revisions_enabled( $post ) { |
||
468 | return wp_revisions_to_keep( $post ) !== 0; |
||
469 | } |
||
470 | |||
471 | /** |
||
472 | * Determine how many revisions to retain for a given post. |
||
473 | * |
||
474 | * By default, an infinite number of revisions are kept. |
||
475 | * |
||
476 | * The constant WP_POST_REVISIONS can be set in wp-config to specify the limit |
||
477 | * of revisions to keep. |
||
478 | * |
||
479 | * @since 3.6.0 |
||
480 | * |
||
481 | * @param WP_Post $post The post object. |
||
482 | * @return int The number of revisions to keep. |
||
483 | */ |
||
484 | function wp_revisions_to_keep( $post ) { |
||
485 | $num = WP_POST_REVISIONS; |
||
486 | |||
487 | if ( true === $num ) |
||
488 | $num = -1; |
||
489 | else |
||
490 | $num = intval( $num ); |
||
491 | |||
492 | if ( ! post_type_supports( $post->post_type, 'revisions' ) ) |
||
493 | $num = 0; |
||
494 | |||
495 | /** |
||
496 | * Filters the number of revisions to save for the given post. |
||
497 | * |
||
498 | * Overrides the value of WP_POST_REVISIONS. |
||
499 | * |
||
500 | * @since 3.6.0 |
||
501 | * |
||
502 | * @param int $num Number of revisions to store. |
||
503 | * @param WP_Post $post Post object. |
||
504 | */ |
||
505 | return (int) apply_filters( 'wp_revisions_to_keep', $num, $post ); |
||
506 | } |
||
507 | |||
508 | /** |
||
509 | * Sets up the post object for preview based on the post autosave. |
||
510 | * |
||
511 | * @since 2.7.0 |
||
512 | * @access private |
||
513 | * |
||
514 | * @param WP_Post $post |
||
515 | * @return WP_Post|false |
||
516 | */ |
||
517 | function _set_preview( $post ) { |
||
518 | if ( ! is_object( $post ) ) { |
||
519 | return $post; |
||
520 | } |
||
521 | |||
522 | $preview = wp_get_post_autosave( $post->ID ); |
||
523 | if ( ! is_object( $preview ) ) { |
||
524 | return $post; |
||
525 | } |
||
526 | |||
527 | $preview = sanitize_post( $preview ); |
||
528 | |||
529 | $post->post_content = $preview->post_content; |
||
530 | $post->post_title = $preview->post_title; |
||
531 | $post->post_excerpt = $preview->post_excerpt; |
||
532 | |||
533 | add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 ); |
||
534 | add_filter( 'get_post_metadata', '_wp_preview_post_thumbnail_filter', 10, 3 ); |
||
535 | |||
536 | return $post; |
||
537 | } |
||
538 | |||
539 | /** |
||
540 | * Filters the latest content for preview from the post autosave. |
||
541 | * |
||
542 | * @since 2.7.0 |
||
543 | * @access private |
||
544 | */ |
||
545 | function _show_post_preview() { |
||
546 | if ( isset($_GET['preview_id']) && isset($_GET['preview_nonce']) ) { |
||
547 | $id = (int) $_GET['preview_id']; |
||
548 | |||
549 | if ( false === wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . $id ) ) |
||
550 | wp_die( __('Sorry, you are not allowed to preview drafts.') ); |
||
551 | |||
552 | add_filter('the_preview', '_set_preview'); |
||
553 | } |
||
554 | } |
||
555 | |||
556 | /** |
||
557 | * Filters terms lookup to set the post format. |
||
558 | * |
||
559 | * @since 3.6.0 |
||
560 | * @access private |
||
561 | * |
||
562 | * @param array $terms |
||
563 | * @param int $post_id |
||
564 | * @param string $taxonomy |
||
565 | * @return array |
||
566 | */ |
||
567 | function _wp_preview_terms_filter( $terms, $post_id, $taxonomy ) { |
||
568 | if ( ! $post = get_post() ) |
||
569 | return $terms; |
||
570 | |||
571 | if ( empty( $_REQUEST['post_format'] ) || $post->ID != $post_id || 'post_format' != $taxonomy || 'revision' == $post->post_type ) |
||
572 | return $terms; |
||
573 | |||
574 | if ( 'standard' == $_REQUEST['post_format'] ) |
||
575 | $terms = array(); |
||
576 | elseif ( $term = get_term_by( 'slug', 'post-format-' . sanitize_key( $_REQUEST['post_format'] ), 'post_format' ) ) |
||
577 | $terms = array( $term ); // Can only have one post format |
||
578 | |||
579 | return $terms; |
||
580 | } |
||
581 | |||
582 | /** |
||
583 | * Filters post thumbnail lookup to set the post thumbnail. |
||
584 | * |
||
585 | * @since 4.6.0 |
||
586 | * @access private |
||
587 | * |
||
588 | * @param null|array|string $value The value to return - a single metadata value, or an array of values. |
||
589 | * @param int $post_id Post ID. |
||
590 | * @param string $meta_key Meta key. |
||
591 | * @return null|array The default return value or the post thumbnail meta array. |
||
0 ignored issues
–
show
Should the return type not be
null|array|string ? Also, consider making the array more specific, something like array<String> , or String[] .
This check compares the return type specified in the If the return type contains the type array, this check recommends the use of
a more specific type like ![]() |
|||
592 | */ |
||
593 | function _wp_preview_post_thumbnail_filter( $value, $post_id, $meta_key ) { |
||
594 | if ( ! $post = get_post() ) { |
||
595 | return $value; |
||
596 | } |
||
597 | |||
598 | if ( empty( $_REQUEST['_thumbnail_id'] ) || |
||
599 | empty( $_REQUEST['preview_id'] ) || |
||
600 | $post->ID != $post_id || |
||
601 | '_thumbnail_id' != $meta_key || |
||
602 | 'revision' == $post->post_type || |
||
603 | $post_id != $_REQUEST['preview_id'] |
||
604 | ) { |
||
605 | return $value; |
||
606 | } |
||
607 | |||
608 | $thumbnail_id = intval( $_REQUEST['_thumbnail_id'] ); |
||
609 | if ( $thumbnail_id <= 0 ) { |
||
610 | return ''; |
||
611 | } |
||
612 | |||
613 | return strval( $thumbnail_id ); |
||
614 | } |
||
615 | |||
616 | /** |
||
617 | * Gets the post revision version. |
||
618 | * |
||
619 | * @since 3.6.0 |
||
620 | * @access private |
||
621 | * |
||
622 | * @param WP_Post $revision |
||
623 | * @return int|false |
||
624 | */ |
||
625 | function _wp_get_post_revision_version( $revision ) { |
||
626 | if ( is_object( $revision ) ) |
||
627 | $revision = get_object_vars( $revision ); |
||
628 | elseif ( !is_array( $revision ) ) |
||
629 | return false; |
||
630 | |||
631 | if ( preg_match( '/^\d+-(?:autosave|revision)-v(\d+)$/', $revision['post_name'], $matches ) ) |
||
632 | return (int) $matches[1]; |
||
633 | |||
634 | return 0; |
||
635 | } |
||
636 | |||
637 | /** |
||
638 | * Upgrade the revisions author, add the current post as a revision and set the revisions version to 1 |
||
639 | * |
||
640 | * @since 3.6.0 |
||
641 | * @access private |
||
642 | * |
||
643 | * @global wpdb $wpdb WordPress database abstraction object. |
||
644 | * |
||
645 | * @param WP_Post $post Post object |
||
646 | * @param array $revisions Current revisions of the post |
||
647 | * @return bool true if the revisions were upgraded, false if problems |
||
648 | */ |
||
649 | function _wp_upgrade_revisions_of_post( $post, $revisions ) { |
||
650 | global $wpdb; |
||
651 | |||
652 | // Add post option exclusively |
||
653 | $lock = "revision-upgrade-{$post->ID}"; |
||
654 | $now = time(); |
||
655 | $result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, 'no') /* LOCK */", $lock, $now ) ); |
||
656 | if ( ! $result ) { |
||
657 | // If we couldn't get a lock, see how old the previous lock is |
||
658 | $locked = get_option( $lock ); |
||
659 | if ( ! $locked ) { |
||
660 | // Can't write to the lock, and can't read the lock. |
||
661 | // Something broken has happened |
||
662 | return false; |
||
663 | } |
||
664 | |||
665 | if ( $locked > $now - 3600 ) { |
||
666 | // Lock is not too old: some other process may be upgrading this post. Bail. |
||
667 | return false; |
||
668 | } |
||
669 | |||
670 | // Lock is too old - update it (below) and continue |
||
671 | } |
||
672 | |||
673 | // If we could get a lock, re-"add" the option to fire all the correct filters. |
||
674 | update_option( $lock, $now ); |
||
675 | |||
676 | reset( $revisions ); |
||
677 | $add_last = true; |
||
678 | |||
679 | do { |
||
680 | $this_revision = current( $revisions ); |
||
681 | $prev_revision = next( $revisions ); |
||
682 | |||
683 | $this_revision_version = _wp_get_post_revision_version( $this_revision ); |
||
684 | |||
685 | // Something terrible happened |
||
686 | if ( false === $this_revision_version ) |
||
687 | continue; |
||
688 | |||
689 | // 1 is the latest revision version, so we're already up to date. |
||
690 | // No need to add a copy of the post as latest revision. |
||
691 | if ( 0 < $this_revision_version ) { |
||
692 | $add_last = false; |
||
693 | continue; |
||
694 | } |
||
695 | |||
696 | // Always update the revision version |
||
697 | $update = array( |
||
698 | 'post_name' => preg_replace( '/^(\d+-(?:autosave|revision))[\d-]*$/', '$1-v1', $this_revision->post_name ), |
||
699 | ); |
||
700 | |||
701 | // If this revision is the oldest revision of the post, i.e. no $prev_revision, |
||
702 | // the correct post_author is probably $post->post_author, but that's only a good guess. |
||
703 | // Update the revision version only and Leave the author as-is. |
||
704 | if ( $prev_revision ) { |
||
705 | $prev_revision_version = _wp_get_post_revision_version( $prev_revision ); |
||
706 | |||
707 | // If the previous revision is already up to date, it no longer has the information we need :( |
||
708 | if ( $prev_revision_version < 1 ) |
||
709 | $update['post_author'] = $prev_revision->post_author; |
||
710 | } |
||
711 | |||
712 | // Upgrade this revision |
||
713 | $result = $wpdb->update( $wpdb->posts, $update, array( 'ID' => $this_revision->ID ) ); |
||
714 | |||
715 | if ( $result ) |
||
716 | wp_cache_delete( $this_revision->ID, 'posts' ); |
||
717 | |||
718 | } while ( $prev_revision ); |
||
719 | |||
720 | delete_option( $lock ); |
||
721 | |||
722 | // Add a copy of the post as latest revision. |
||
723 | if ( $add_last ) |
||
724 | wp_save_post_revision( $post->ID ); |
||
725 | |||
726 | return true; |
||
727 | } |
||
728 |
This check looks from parameters that have been defined for a function or method, but which are not used in the method body.