From 83836d1a5fa68c07477a52fab21b55f1b1c6538a Mon Sep 17 00:00:00 2001 From: Brandon Hundt Date: Wed, 1 May 2024 16:49:43 -0500 Subject: [PATCH 1/3] feat(revisionary): install plugin --- .../configs/global/global-plugins.php | 1 + .../plugins/revisionary/activation_rvy.php | 81 + .../admin/RevisionEditSubmitMetabox.php | 200 ++ .../revisionary/admin/admin-dashboard_rvy.php | 31 + .../revisionary/admin/admin-init_rvy.php | 608 ++++ .../revisionary/admin/admin-posts_rvy.php | 254 ++ .../revisionary/admin/admin_lib-mu_rvy.php | 36 + .../plugins/revisionary/admin/admin_rvy.php | 447 +++ .../admin/agents_checklist_rvy.php | 233 ++ .../admin/class-list-table-archive.php | 884 ++++++ .../admin/class-list-table_rvy.php | 1412 ++++++++++ .../admin/edit-revision-block-ui_rvy.php | 28 + .../admin/edit-revision-classic-ui_rvy.php | 117 + .../admin/edit-revision-ui_rvy.php | 84 + .../admin/filters-admin-ui-item_rvy.php | 118 + .../plugins/revisionary/admin/history_rvy.php | 1231 ++++++++ .../plugins/revisionary/admin/options.php | 1157 ++++++++ .../admin/post-edit-block-ui_rvy.php | 184 ++ .../plugins/revisionary/admin/post-edit.js | 29 + .../revisionary/admin/post-edit_rvy.php | 297 ++ .../admin/post-editor-workflow-ui_rvy.php | 248 ++ .../revisionary/admin/revision-action_rvy.php | 1712 +++++++++++ .../admin/revision-archive_rvy.php | 96 + .../revisionary/admin/revision-queue_rvy.php | 201 ++ .../revisionary/admin/revision-ui_rvy.php | 421 +++ .../plugins/revisionary/admin/revisionary.css | 836 ++++++ .../plugins/revisionary/admin/revisionary.js | 168 ++ .../plugins/revisionary/admin/revisions.php | 261 ++ .../revisionary/admin/rvy-revision-edit.css | 56 + .../admin/rvy_post-block-edit.dev.js | 329 +++ .../revisionary/admin/rvy_post-block-edit.js | 47 + .../admin/rvy_post-classic-edit.dev.js | 249 ++ .../admin/rvy_post-classic-edit.js | 33 + .../admin/rvy_revision-block-edit.dev.js | 412 +++ .../admin/rvy_revision-block-edit.js | 72 + .../admin/rvy_revision-classic-edit.dev.js | 189 ++ .../admin/rvy_revision-classic-edit.js | 28 + .../plugins/revisionary/admin/settings.js | 15 + .../classes/PublishPress/Revisionary.php | 96 + .../PublishPress/Revisions/PluginCompat.php | 178 ++ .../PublishPress/Revisions/PostPreview.php | 25 + .../common/css/pressshack-admin.css | 172 ++ .../common/img/publishpress-logo-icon.png | Bin 0 -> 13364 bytes .../common/img/publishpress-logo.png | Bin 0 -> 8898 bytes .../common/img/revisions-wp-logo.jpg | Bin 0 -> 58556 bytes wp-content/plugins/revisionary/compat_rvy.php | 62 + wp-content/plugins/revisionary/composer.json | 46 + wp-content/plugins/revisionary/composer.lock | 20 + .../plugins/revisionary/content-roles_rvy.php | 13 + .../plugins/revisionary/defaults_rvy.php | 133 + wp-content/plugins/revisionary/front_rvy.php | 701 +++++ wp-content/plugins/revisionary/functions.php | 441 +++ .../revisionary/includes/CoreAdmin.php | 134 + .../languages/revisionary-be_BY.mo | Bin 0 -> 18403 bytes .../languages/revisionary-be_BY.po | 2462 ++++++++++++++++ .../languages/revisionary-de_DE.mo | Bin 0 -> 27883 bytes .../languages/revisionary-de_DE.po | 2502 +++++++++++++++++ .../languages/revisionary-en_US.mo | Bin 0 -> 831 bytes .../languages/revisionary-en_US.po | 1917 +++++++++++++ .../languages/revisionary-es_ES.mo | Bin 0 -> 37953 bytes .../languages/revisionary-es_ES.po | 2076 ++++++++++++++ .../languages/revisionary-fr_FR.mo | Bin 0 -> 40220 bytes .../languages/revisionary-fr_FR.po | 2107 ++++++++++++++ .../languages/revisionary-it_IT.mo | Bin 0 -> 37788 bytes .../languages/revisionary-it_IT.po | 2072 ++++++++++++++ .../languages/revisionary-sv_SV.mo | Bin 0 -> 26585 bytes .../languages/revisionary-sv_SV.po | 2430 ++++++++++++++++ .../revisionary/languages/revisionary.pot | 1743 ++++++++++++ .../revisionary/lib/agapetry_wp_admin_lib.php | 13 + .../revisionary/lib/agapetry_wp_core_lib.php | 74 + wp-content/plugins/revisionary/lib/debug.php | 121 + .../plugins/revisionary/lib/debug_shell.php | 39 + .../plugins/revisionary/lib/error_rvy.php | 32 + .../revisionary/lib/vendor/autoload.php | 25 + .../lib/vendor/composer/ClassLoader.php | 579 ++++ .../lib/vendor/composer/InstalledVersions.php | 359 +++ .../revisionary/lib/vendor/composer/LICENSE | 21 + .../lib/vendor/composer/autoload_classmap.php | 10 + .../lib/vendor/composer/autoload_files.php | 13 + .../vendor/composer/autoload_namespaces.php | 9 + .../lib/vendor/composer/autoload_psr4.php | 9 + .../lib/vendor/composer/autoload_real.php | 48 + .../lib/vendor/composer/autoload_static.php | 27 + .../lib/vendor/composer/installed.json | 390 +++ .../lib/vendor/composer/installed.php | 68 + .../publishpress/instance-protection/LICENSE | 674 +++++ .../instance-protection/core/Autoloader.php | 189 ++ .../instance-protection/core/Config.php | 44 + .../core/InstanceChecker.php | 386 +++ .../instance-protection/core/LibState.php | 28 + .../instance-protection/include.php | 11 + .../instance-protection/phpcs.xml.dist | 15 + .../vendor/publishpress/pimple-pimple/LICENSE | 19 + .../pimple-pimple/lib/Versions.php | 85 + .../pimple-pimple/lib/autoload-classmap.php | 27 + .../pimple-pimple/lib/autoload.php | 20 + .../pimple-pimple/lib/include.php | 50 + .../pimple/pimple/src/Pimple/Container.php | 308 ++ .../Exception/ExpectedInvokableException.php | 41 + .../Exception/FrozenServiceException.php | 48 + .../InvalidServiceIdentifierException.php | 48 + .../Exception/UnknownIdentifierException.php | 48 + .../pimple/src/Pimple/Psr11/Container.php | 58 + .../src/Pimple/Psr11/ServiceLocator.php | 78 + .../pimple/src/Pimple/ServiceIterator.php | 92 + .../src/Pimple/ServiceProviderInterface.php | 47 + .../vendor/publishpress/psr-container/LICENSE | 21 + .../psr-container/lib/Versions.php | 85 + .../psr-container/lib/autoload-classmap.php | 12 + .../psr-container/lib/autoload.php | 20 + .../psr-container/lib/include.php | 50 + .../src/ContainerExceptionInterface.php | 16 + .../psr/container/src/ContainerInterface.php | 42 + .../src/NotFoundExceptionInterface.php | 16 + .../publishpress/wordpress-reviews/LICENSE | 674 +++++ .../wordpress-reviews/ReviewsController.php | 710 +++++ .../wordpress-reviews/phpcs.xml.dist | 15 + .../.env.testing.dist | 18 + .../wordpress-version-notices/codeception.yml | 25 + .../wordpress-version-notices/includes.php | 25 + .../wordpress-version-notices/license.txt | 377 +++ .../src/Autoloader.php | 51 + .../src/Module/AdInterface.php | 37 + .../src/Module/MenuLink/Module.php | 230 ++ .../src/Module/TopNotice/Module.php | 228 ++ .../src/ServicesProvider.php | 54 + .../TemplateInvalidArgumentsException.php | 33 + .../src/Template/TemplateLoader.php | 108 + .../src/Template/TemplateLoaderInterface.php | 53 + .../Template/TemplateNotFoundException.php | 33 + .../src/Versions.php | 85 + .../src/autoload.php | 42 + .../src/deprecated.php | 35 + .../wordpress-version-notices/src/include.php | 50 + .../templates/menu-link/menu-link-script.php | 13 + .../templates/menu-link/redirect-page.php | 15 + .../templates/top-notice/notice.php | 6 + .../plugins/revisionary/mail-buffer_rvy.php | 169 ++ .../revisionary/multiple-authors_rvy.php | 61 + wp-content/plugins/revisionary/readme.txt | 1281 +++++++++ wp-content/plugins/revisionary/rest_rvy.php | 116 + .../revisionary/revision-creation_rvy.php | 264 ++ .../revisionary/revision-workflow_rvy.php | 330 +++ .../plugins/revisionary/revisionary-front.css | 198 ++ .../plugins/revisionary/revisionary.php | 287 ++ .../plugins/revisionary/revisionary_main.php | 1212 ++++++++ .../revisionary/rvy_init-functions.php | 1532 ++++++++++ wp-content/plugins/revisionary/rvy_init.php | 156 + .../plugins/revisionary/submittee_rvy.php | 103 + wp-content/plugins/revisionary/utils.php | 223 ++ 150 files changed, 45399 insertions(+) create mode 100644 wp-content/plugins/revisionary/activation_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/RevisionEditSubmitMetabox.php create mode 100644 wp-content/plugins/revisionary/admin/admin-dashboard_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/admin-init_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/admin-posts_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/admin_lib-mu_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/admin_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/agents_checklist_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/class-list-table-archive.php create mode 100644 wp-content/plugins/revisionary/admin/class-list-table_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/edit-revision-block-ui_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/edit-revision-classic-ui_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/edit-revision-ui_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/filters-admin-ui-item_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/history_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/options.php create mode 100644 wp-content/plugins/revisionary/admin/post-edit-block-ui_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/post-edit.js create mode 100644 wp-content/plugins/revisionary/admin/post-edit_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/post-editor-workflow-ui_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/revision-action_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/revision-archive_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/revision-queue_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/revision-ui_rvy.php create mode 100644 wp-content/plugins/revisionary/admin/revisionary.css create mode 100644 wp-content/plugins/revisionary/admin/revisionary.js create mode 100644 wp-content/plugins/revisionary/admin/revisions.php create mode 100644 wp-content/plugins/revisionary/admin/rvy-revision-edit.css create mode 100644 wp-content/plugins/revisionary/admin/rvy_post-block-edit.dev.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_post-block-edit.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_post-classic-edit.dev.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_post-classic-edit.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_revision-block-edit.dev.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_revision-block-edit.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.dev.js create mode 100644 wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.js create mode 100644 wp-content/plugins/revisionary/admin/settings.js create mode 100644 wp-content/plugins/revisionary/classes/PublishPress/Revisionary.php create mode 100644 wp-content/plugins/revisionary/classes/PublishPress/Revisions/PluginCompat.php create mode 100644 wp-content/plugins/revisionary/classes/PublishPress/Revisions/PostPreview.php create mode 100644 wp-content/plugins/revisionary/common/css/pressshack-admin.css create mode 100644 wp-content/plugins/revisionary/common/img/publishpress-logo-icon.png create mode 100644 wp-content/plugins/revisionary/common/img/publishpress-logo.png create mode 100644 wp-content/plugins/revisionary/common/img/revisions-wp-logo.jpg create mode 100644 wp-content/plugins/revisionary/compat_rvy.php create mode 100644 wp-content/plugins/revisionary/composer.json create mode 100644 wp-content/plugins/revisionary/composer.lock create mode 100644 wp-content/plugins/revisionary/content-roles_rvy.php create mode 100644 wp-content/plugins/revisionary/defaults_rvy.php create mode 100644 wp-content/plugins/revisionary/front_rvy.php create mode 100644 wp-content/plugins/revisionary/functions.php create mode 100644 wp-content/plugins/revisionary/includes/CoreAdmin.php create mode 100644 wp-content/plugins/revisionary/languages/revisionary-be_BY.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-be_BY.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary-de_DE.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-de_DE.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary-en_US.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-en_US.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary-es_ES.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-es_ES.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary-fr_FR.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-fr_FR.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary-it_IT.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-it_IT.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary-sv_SV.mo create mode 100644 wp-content/plugins/revisionary/languages/revisionary-sv_SV.po create mode 100644 wp-content/plugins/revisionary/languages/revisionary.pot create mode 100644 wp-content/plugins/revisionary/lib/agapetry_wp_admin_lib.php create mode 100644 wp-content/plugins/revisionary/lib/agapetry_wp_core_lib.php create mode 100644 wp-content/plugins/revisionary/lib/debug.php create mode 100644 wp-content/plugins/revisionary/lib/debug_shell.php create mode 100644 wp-content/plugins/revisionary/lib/error_rvy.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/autoload.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/ClassLoader.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/InstalledVersions.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/LICENSE create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/autoload_classmap.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/autoload_files.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/autoload_namespaces.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/autoload_psr4.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/autoload_real.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/autoload_static.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/installed.json create mode 100644 wp-content/plugins/revisionary/lib/vendor/composer/installed.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/LICENSE create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Autoloader.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Config.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/InstanceChecker.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/LibState.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/include.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/phpcs.xml.dist create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/LICENSE create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/Versions.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload-classmap.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/include.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Container.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/Container.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceIterator.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceProviderInterface.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/LICENSE create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/Versions.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload-classmap.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/include.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/psr/container/src/ContainerExceptionInterface.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/psr/container/src/ContainerInterface.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/psr/container/src/NotFoundExceptionInterface.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/LICENSE create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/ReviewsController.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/phpcs.xml.dist create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/.env.testing.dist create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/codeception.yml create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/includes.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/license.txt create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Autoloader.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/AdInterface.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/TopNotice/Module.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/ServicesProvider.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateInvalidArgumentsException.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoader.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoaderInterface.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateNotFoundException.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Versions.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/autoload.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/deprecated.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/include.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/menu-link-script.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/redirect-page.php create mode 100644 wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/top-notice/notice.php create mode 100644 wp-content/plugins/revisionary/mail-buffer_rvy.php create mode 100644 wp-content/plugins/revisionary/multiple-authors_rvy.php create mode 100644 wp-content/plugins/revisionary/readme.txt create mode 100644 wp-content/plugins/revisionary/rest_rvy.php create mode 100644 wp-content/plugins/revisionary/revision-creation_rvy.php create mode 100644 wp-content/plugins/revisionary/revision-workflow_rvy.php create mode 100644 wp-content/plugins/revisionary/revisionary-front.css create mode 100644 wp-content/plugins/revisionary/revisionary.php create mode 100644 wp-content/plugins/revisionary/revisionary_main.php create mode 100644 wp-content/plugins/revisionary/rvy_init-functions.php create mode 100644 wp-content/plugins/revisionary/rvy_init.php create mode 100644 wp-content/plugins/revisionary/submittee_rvy.php create mode 100644 wp-content/plugins/revisionary/utils.php diff --git a/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php b/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php index 7c865cff7..86cf7473a 100644 --- a/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php +++ b/wp-content/mu-plugins/the-world-site-config/configs/global/global-plugins.php @@ -18,6 +18,7 @@ 'microsoft-start/index.php', 'pwa/pwa.php', 'redirection/redirection.php', + 'revisionary/revisionary.php', 'user-role-editor/user-role-editor.php', 'taxopress-pro/taxopress-pro.php', 'tw-call-to-actions/tw-call-to-actions.php', diff --git a/wp-content/plugins/revisionary/activation_rvy.php b/wp-content/plugins/revisionary/activation_rvy.php new file mode 100644 index 000000000..aab0fadda --- /dev/null +++ b/wp-content/plugins/revisionary/activation_rvy.php @@ -0,0 +1,81 @@ +importLegacyRevisions(); + } + } + + function importLegacyRevisions() { + global $wpdb; + + if (!get_option('revisionary_last_version') && get_site_transient('revisionary_previous_install')) { + // Trigger dismissible migration notice even if no pending or scheduled revisions currently stored + set_site_transient('_revisionary_1x_migration', true, 86400); + } + + if (defined('REVISIONARY_FORCE_REIMPORT') && REVISIONARY_FORCE_REIMPORT) { + $id_csv = ''; + } elseif ($imported_ids = (array) get_option('revisionary_imported_ids')) { + $id_csv = implode("','", array_map('intval', $imported_ids)); + } else { + $imported_ids = []; + $id_csv = ''; + } + + if (!$revisions = $wpdb->get_results( + "SELECT r.post_author AS post_author, r.post_date AS rev_date, r.post_date_gmt AS rev_date_gmt," + . " r.post_content AS post_content, r.post_title AS post_title, r.post_excerpt AS post_excerpt," + . " r.post_status AS post_status, r.post_modified AS post_modified, r.post_modified_gmt AS post_modified_gmt," + . " r.ID AS rev_ID, r.post_parent AS comment_count, p.post_parent AS post_parent," + . " p.post_type AS post_type, p.post_date AS post_date, p.post_date_gmt AS post_date_gmt, p.guid AS guid," + . " p.comment_status AS comment_status, p.ping_status AS ping_status, p.menu_order AS menu_order" + . " FROM $wpdb->posts AS r" + . " INNER JOIN $wpdb->posts AS p" + . " ON r.post_type = 'revision' AND r.post_status IN ('pending', 'future') AND r.post_parent = p.ID" + . " WHERE r.ID NOT IN('$id_csv')" + . " ORDER BY p.ID, r.ID" + ) + ) { + return; + } + + $last_post_id = 0; + + foreach($revisions as $old) { + $new = (array) $old; + unset($new['rev_date']); + unset($new['rev_date_gmt']); + unset($new['rev_ID']); + + if ('future' == $old->post_status) { + $new['post_status'] = 'future-revision'; + $new['post_date'] = $old->rev_date; + $new['post_date_gmt'] = $old->rev_date_gmt; + } else { + $new['post_status'] = 'pending-revision'; + } + + $wpdb->insert($wpdb->posts, $new); + $new_revision_id = (int)$wpdb->insert_id; + + add_post_meta($new_revision_id, '_rvy_base_post_id', $new['comment_count']); + add_post_meta($new_revision_id, '_rvy_imported_revision', $old->rev_ID); + + if ($new['comment_count'] != $last_post_id) { // avoid redundant update for same post + require_once(dirname(__FILE__).'/rvy_init.php'); + rvy_update_post_meta($new['comment_count'], '_rvy_has_revisions', true); + $last_post_id = $new['comment_count']; + } + + if (defined('REVISIONARY_DELETE_LEGACY_REVISIONS')) { + $wpdb->delete($wpdb->posts, ['ID' => $old->rev_ID]); + } + + $imported_ids []= $old->rev_ID; + } + + update_option('revisionary_imported_ids', $imported_ids); + } +} diff --git a/wp-content/plugins/revisionary/admin/RevisionEditSubmitMetabox.php b/wp-content/plugins/revisionary/admin/RevisionEditSubmitMetabox.php new file mode 100644 index 000000000..1b3df3cec --- /dev/null +++ b/wp-content/plugins/revisionary/admin/RevisionEditSubmitMetabox.php @@ -0,0 +1,200 @@ +post_type); + $post_status = $post->post_mime_type; + + $post_status_obj = get_post_status_object($post_status); + + $can_publish = current_user_can($type_obj->cap->publish_posts); + + $_args = compact('type_obj', 'post_status_obj', 'can_publish'); + $_args = array_merge($args, $_args); // in case args passed into metabox are needed within static calls in the future + ?> +
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+ +
+ + +
+ +
+ + + +
+ +
+
+ +
+ + +
+ ID)) { + if (!EMPTY_TRASH_DAYS) + $delete_text = (defined('RVY_DISCARD_CAPTION')) ? esc_html__('Discard Revision', 'revisionary') : esc_html__('Delete Revision', 'revisionary'); + else + $delete_text = esc_html__('Move to Trash'); + ?> + +
+ +
+
+ + +
+ + post_mime_type, 'update')) { + $draft_label = pp_revisions_label('update_revision'); + } + ?> + + + + + ID)); + + $type_obj = get_post_type_object($post->post_type); + + if (empty($type_obj->public)) { + return; + } + + $can_publish = current_user_can('edit_post', rvy_post_id($post->ID)); + + if ($type_obj && empty($type_obj->public)) { + return; + } else { + $preview_button = esc_html__('Preview', 'revisionary'); + $preview_title = esc_html__('Preview revision in progress', 'revisionary'); + } + ?> + + + + false]; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + ?> + + labels->caption)) ? $post_status_obj->labels->caption : $post_status_obj->label; + ?> + + +   + + + + + + true, 'private' => true], 'names', 'or'); + + if ('future-revision' == $post_status_obj->name) { // scheduled for publishing at a future date + printf(esc_html__('Scheduled for: %s'), '' . esc_html(date_i18n($datef, strtotime($post->post_date))) . ''); ?> + post_date_gmt) > agp_time_gmt()) { + printf(esc_html__('Publish on: %s'), '' . esc_html(date_i18n($datef, strtotime($post->post_date))) . ''); ?> + ', ''); ?> + + + +
+ enabled_post_types); + $post_types_csv = implode( "','", array_map('sanitize_key', $types)); + $clauses['where'] = str_replace( "$wpdb->posts.post_type = 'post'", "$wpdb->posts.post_type IN ('$post_types_csv')", $clauses['where'] ); + + $clauses['where'] = str_replace( "$wpdb->posts.post_status = 'future'", "($wpdb->posts.post_status = 'future' OR ($wpdb->posts.post_status = 'pending' AND $wpdb->posts.post_mime_type = 'future-revision'))", $clauses['where'] ); + + $revisionary->is_revisions_query = false; + + remove_filter('posts_clauses_request', [&$this, 'fltDashboardQueryClauses']); + return $clauses; + } + + public static function glancePending($items = []) { + return $items; + + // @todo: modify this function for post_mime_type schema + } +} diff --git a/wp-content/plugins/revisionary/admin/admin-init_rvy.php b/wp-content/plugins/revisionary/admin/admin-init_rvy.php new file mode 100644 index 000000000..b9f3d8711 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/admin-init_rvy.php @@ -0,0 +1,608 @@ +post_edit_ui = new RvyPostEdit(); + } + } + } elseif ('edit.php' == $pagenow) { + require_once( dirname(__FILE__).'/admin-posts_rvy.php' ); + new RevisionaryAdminPosts(); + } +} + +function rvy_load_textdomain() { + if ( defined('RVY_TEXTDOMAIN_LOADED') ) + return; + + load_plugin_textdomain('revisionary', false, dirname(plugin_basename(REVISIONARY_FILE)) . '/languages'); + + define('RVY_TEXTDOMAIN_LOADED', true); +} + +function rvy_admin_init() { + do_action('pp_revisions_admin_init'); + + rvy_load_textdomain(); + + // @todo: clean up "Restore Revision" URL on Diff screen + // Until the integration with WP revisions.php is resolved, limit the scope of this workaround to relevant actions + if (!empty($_GET['amp;revision']) && !empty($_GET['amp;action']) && !empty($_GET['amp;_wpnonce']) && in_array($_GET['amp;action'], ['approve', 'publish'])) { + $_GET['revision'] = (int) $_GET['amp;revision']; + $_GET['action'] = sanitize_key($_GET['amp;action']); + $_GET['_wpnonce'] = sanitize_key($_GET['amp;_wpnonce']); + + if (!empty($_REQUEST['amp;revision'])) { + $_REQUEST['revision'] = (int) $_REQUEST['amp;revision']; + } + + if (!empty($_REQUEST['amp;action'])) { + $_REQUEST['action'] = sanitize_key($_REQUEST['amp;action']); + } + + if (!empty($_REQUEST['amp;_wpnonce'])) { + $_REQUEST['_wpnonce'] = sanitize_key($_REQUEST['amp;_wpnonce']); + } + } + + if ( ! empty($_POST['rvy_submit']) || ! empty($_POST['rvy_defaults']) ) { + require_once( RVY_ABSPATH . '/submittee_rvy.php'); + $handler = new Revisionary_Submittee(); + + if ( isset($_POST['rvy_submit']) ) { + $sitewide = isset($_POST['rvy_options_doing_sitewide']); + $customize_defaults = isset($_POST['rvy_options_customize_defaults']); + $handler->handle_submission( 'update', $sitewide, $customize_defaults ); + + } elseif ( isset($_POST['rvy_defaults']) ) { + $sitewide = isset($_POST['rvy_options_doing_sitewide']); + $customize_defaults = isset($_POST['rvy_options_customize_defaults']); + $handler->handle_submission( 'default', $sitewide, $customize_defaults ); + } + + } elseif (isset($_REQUEST['action2']) && !empty($_REQUEST['page']) && ('revisionary-archive' == $_REQUEST['page']) && !empty($_REQUEST['post']) && rvy_get_option('revision_archive_deletion')) { + $doaction = (!empty($_REQUEST['action']) && !is_numeric($_REQUEST['action'])) ? sanitize_key($_REQUEST['action']) : sanitize_key($_REQUEST['action2']); + + check_admin_referer('bulk-revision-archive'); + + if (!$url = str_replace('#038;', '&', wp_get_referer())) { + $url = admin_url("admin.php?page=revisionary-archive"); + } + + $sendback = remove_query_arg( array('deleted', 'ids', 'posts', '_wp_nonce', '_wp_http_referer'), $url); + + if ( isset( $_REQUEST['ids'] ) ) { + $post_ids = array_map('intval', explode( ',', sanitize_text_field($_REQUEST['ids']) )); + } elseif ( !empty( $_REQUEST['post'] ) ) { + $post_ids = array_map('intval', $_REQUEST['post']); + } + + if ( !isset( $post_ids ) ) { + exit; + } + + switch ( $doaction ) { + case 'delete': + $deleted = 0; + foreach ( (array) $post_ids as $post_id ) { + if ( ! $revision = wp_get_post_revision($post_id)) { + continue; + } + + if ( !current_user_can('administrator') && !current_user_can( 'edit_post', $revision->post_parent) ) { // @todo: review Administrator cap check + wp_die( esc_html__('Sorry, you are not allowed to delete this revision.', 'revisionary') ); + } + + if ( !wp_delete_post_revision($post_id, true) ) + wp_die( esc_html__('Error in deleting.') ); + + $deleted++; + } + $sendback = add_query_arg('deleted', $deleted, $sendback); + break; + + default: + if (!$sendback = apply_filters('revisionary_handle_archive_action', $sendback, $doaction, $post_ids)) { + if (function_exists('get_current_screen')) { + $sendback = apply_filters( 'handle_bulk_actions-' . get_current_screen()->id, $sendback, $doaction, $post_ids ); + } + } + + break; + } + + if ($sendback) { + $sendback = remove_query_arg( array('action', 'action2', '_wp_http_referer', '_wpnonce', 'post', 'bulk_edit', 'post_view'), $sendback ); + $sendback = str_replace('#038;', '&', $sendback); // @todo Proper decode + wp_redirect($sendback); + exit; + } + + } elseif ( + (isset($_REQUEST['action2']) && !empty($_REQUEST['page']) && ('revisionary-q' == $_REQUEST['page']) && !empty($_REQUEST['post'])) + || (isset($_REQUEST['action']) && in_array($_REQUEST['action'], ['decline_revision'])) + ) { + $doaction = (!empty($_REQUEST['action']) && !is_numeric($_REQUEST['action'])) ? sanitize_key($_REQUEST['action']) : sanitize_key($_REQUEST['action2']); + + check_admin_referer('bulk-revision-queue'); + + if (!$url = str_replace('#038;', '&', wp_get_referer())) { + $url = admin_url("admin.php?page=revisionary-q"); + } + + $sendback = remove_query_arg( array('trashed', 'untrashed', 'submitted_count', 'declined_count', 'approved_count', 'published_count', 'scheduled_count', 'unscheduled_count', 'deleted', 'locked', 'ids', 'posts', '_wp_nonce', '_wp_http_referer'), $url); + + if ( 'delete_all' == $doaction ) { + // Prepare for deletion of all posts with a specified post status (i.e. Empty trash). + + if (isset($_REQUEST['post_status'])) { + $post_status = sanitize_key($_REQUEST['post_status']); + } else { + $post_status = ''; + } + + // Verify the post status exists. + if ( get_post_status_object( $post_status ) ) { + $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_mime_type = %s", $post_type, $post_status ) ); + } + $doaction = 'delete'; + } elseif ( isset( $_REQUEST['media'] ) ) { + $post_ids = array_map('intval', (array) $_REQUEST['media']); + } elseif ( isset( $_REQUEST['ids'] ) ) { + $post_ids = array_map('intval', explode( ',', sanitize_text_field($_REQUEST['ids']) )); + } elseif ( !empty( $_REQUEST['post'] ) ) { + $post_ids = array_map('intval', (array) $_REQUEST['post']); + } + + if ( !isset( $post_ids ) ) { + exit; + } + + switch ( $doaction ) { + case 'approve_revision': // If pending revisions has a requested publish date, schedule it, otherwise schedule for near future. Leave currently scheduled revisions alone. + case 'publish_revision': // Schedule all selected revisions for near future publishing. + $approved = 0; + $is_administrator = current_user_can('administrator'); + + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + + foreach ((array) $post_ids as $post_id) { + if (!$revision = get_post($post_id)) { + continue; + } + + if (!rvy_in_revision_workflow($revision)) { + continue; + } + + if (!$is_administrator && !current_user_can('edit_post', rvy_post_id($revision->ID))) { + if (count($post_ids) == 1) { + wp_die( esc_html__('Sorry, you are not allowed to approve this revision.', 'revisionary') ); + } else { + continue; + } + } + + if (('future-revision' == $revision->post_mime_type) && ('publish_revision' == $doaction)) { + if (rvy_revision_publish($revision->ID)) { + $approved++; + } + } else { + if (rvy_revision_approve($revision->ID)) { + $approved++; + } + } + } + + if ($approved) { + $arg = ('publish_revision' == $doaction) ? 'published_count' : 'approved_count'; + $sendback = add_query_arg($arg, $approved, $sendback); + } + + break; + + case 'submit_revision' : + $submitted = 0; + $is_administrator = current_user_can('administrator'); + + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + + foreach ((array) $post_ids as $post_id) { + if (!$revision = get_post($post_id)) { + continue; + } + + if ('draft' != $revision->post_status) { + continue; + } + + if (!$is_administrator && !current_user_can('set_revision_pending-revision', $revision->ID)) { + if (count($post_ids) == 1) { + wp_die( esc_html__('Sorry, you are not allowed to submit this revision.', 'revisionary') ); + } else { + continue; + } + } + + if (rvy_revision_submit($revision->ID)) { + $submitted++; + } + } + + if ($submitted) { + $arg = 'submitted_count'; + $sendback = add_query_arg($arg, $submitted, $sendback); + } + + break; + + case 'decline_revision' : + $declined = 0; + + $is_administrator = current_user_can('administrator'); + + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + + foreach ((array) $post_ids as $post_id) { + if (!$revision = get_post($post_id)) { + continue; + } + + if (defined('REVISIONARY_DECLINE_REVISIONS_SKIP_PENDING')) { + if ('pending' != $revision->post_status) { + continue; + } + } + + if (!$is_administrator && !current_user_can('set_revision_pending-revision', $revision->ID)) { + if (count($post_ids) == 1) { + wp_die( esc_html__('Sorry, you are not allowed to decline this revision.', 'revisionary') ); + } else { + continue; + } + } + + if (rvy_revision_decline($revision->ID)) { + $declined++; + } + } + + if ($declined) { + $arg = 'declined_count'; + $sendback = add_query_arg($arg, $declined, $sendback); + } + + break; + + case 'unschedule_revision' : + $unscheduled = 0; + $is_administrator = current_user_can('administrator'); + + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + + foreach ((array) $post_ids as $post_id) { + if (!$revision = get_post($post_id)) { + continue; + } + + if ('future-revision' != $revision->post_mime_type) { + continue; + } + + if (!$is_administrator && !current_user_can('edit_post', rvy_post_id($revision->ID))) { + if (count($post_ids) == 1) { + wp_die( esc_html__('Sorry, you are not allowed to approve this revision.', 'revisionary') ); + } else { + continue; + } + } + + if (rvy_revision_unschedule($revision->ID)) { + $unscheduled++; + } + } + + if ($unscheduled) { + $arg = 'unscheduled_count'; + $sendback = add_query_arg($arg, $unscheduled, $sendback); + } + + break; + + case 'delete': + $deleted = 0; + foreach ( (array) $post_ids as $post_id ) { + if ( ! $revision = get_post($post_id) ) + continue; + + if ( ! rvy_in_revision_workflow($revision) ) + continue; + + if ( ! current_user_can('administrator') && ! current_user_can( 'delete_post', rvy_post_id($revision->ID) ) ) { // @todo: review Administrator cap check + if (!in_array($revision->post_mime_type, ['draft-revision', 'pending-revision']) || !rvy_is_post_author($revision)) { // allow submitters to delete their own still-pending revisions + wp_die( esc_html__('Sorry, you are not allowed to delete this revision.', 'revisionary') ); + } + } + + // Work around Nested Pages plugin assuming get_current_screen() function declaration + if (class_exists('NestedPages')) { + if (!function_exists('get_current_screen')) { + function get_current_screen() { + return false; + } + } + } + + if ( !wp_delete_post($post_id, true) ) + wp_die( esc_html__('Error in deleting.') ); + + $deleted++; + } + $sendback = add_query_arg('deleted', $deleted, $sendback); + break; + + default: + if (!$sendback = apply_filters('revisionary_handle_admin_action', $sendback, $doaction, $post_ids)) { + if (function_exists('get_current_screen')) { + $sendback = apply_filters( 'handle_bulk_actions-' . get_current_screen()->id, $sendback, $doaction, $post_ids ); + } + } + + break; + } + + if ($sendback) { + $sendback = remove_query_arg( array('action', 'action2', '_wp_http_referer', '_wpnonce', 'deleted', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view'), $sendback ); + $sendback = str_replace('#038;', '&', $sendback); // @todo Proper decode + wp_redirect($sendback); + exit; + } + + // don't bother with the checks in this block unless action arg was passed + } elseif ( ! empty($_GET['action']) || ! empty($_POST['action']) ) { + if (isset($_SERVER['REQUEST_URI']) && false !== strpos(urldecode(esc_url_raw($_SERVER['REQUEST_URI'])), 'admin.php') && !empty($_REQUEST['page']) && ('rvy-revisions' == $_REQUEST['page'])) { + if (!defined('REVISIONARY_ACTIONS_DISABLE_WP_INCLUSION')) { + include_once(ABSPATH . 'wp-admin/includes/post.php'); + } + + if ( ! empty($_GET['action']) && ('restore' == $_GET['action']) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_restore' ); + + } elseif ( ! empty($_GET['action']) && ('delete' == $_GET['action']) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_delete' ); + + } elseif ( ! empty($_GET['action']) && ('revise' == $_GET['action']) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_create' ); + + } elseif ( ! empty($_GET['action']) && ('submit' == $_GET['action']) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_submit' ); + + } elseif ( ! empty($_GET['action']) && ('approve' == $_GET['action']) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_approve' ); + + } elseif ( ! empty($_GET['action']) && ('publish' == $_GET['action']) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_publish' ); + + } elseif ( ! empty($_POST['action']) && ('bulk-delete' == $_POST['action'] ) ) { + require_once( dirname(__FILE__).'/revision-action_rvy.php'); + add_action( 'wp_loaded', 'rvy_revision_bulk_delete' ); + } + } + + } elseif (is_admin() && (false !== strpos(esc_url_raw($_SERVER['REQUEST_URI']), 'revision.php'))) { // endif action arg passed + + if (!empty($_REQUEST['revision'])) { + $revision_id = (int) $_REQUEST['revision']; + } elseif (isset($_REQUEST['to'])) { + $revision_id = (int) $_REQUEST['to']; + } else { + return; + } + + if (('modified' == rvy_get_option('past_revisions_order_by')) && !rvy_in_revision_workflow($revision_id)) { + require_once(dirname(__FILE__).'/history_rvy.php'); + add_filter('query', ['RevisionaryHistory', 'fltOrderRevisionsByModified']); + } + } + + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION') && !empty($_REQUEST['rvy_ajax_settings'])) { + include_once(REVISIONARY_PRO_ABSPATH . '/includes-pro/pro-activation-ajax.php'); + } + + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION') && !empty($_REQUEST['rvy_refresh_updates'])) { + do_action('revisionary_refresh_updates'); + } + + if (!empty($_REQUEST['rvy_refresh_done']) && empty($_POST)) { + if (current_user_can('activate_plugins')) { + $url = admin_url('update-core.php'); + wp_redirect($url); + exit; + } + } +} + +function rvy_dismissable_notice( $msg_id, $message ) { + return; +} + +function rvy_get_post_revisions($post_id, $status = '', $args = '' ) { + global $wpdb; + + $defaults = array( 'order' => 'DESC', 'orderby' => 'post_modified_gmt', 'use_memcache' => true, 'fields' => COLS_ALL_RVY, 'return_flipped' => false ); + $args = wp_parse_args( $args, $defaults ); + + foreach( array_keys( $defaults ) as $var ) { + $$var = ( isset( $args[$var] ) ) ? $args[$var] : $defaults[$var]; + } + + if (!$status) { + $all_rev_statuses_clause = " AND (post_mime_type = 'draft-revision' OR post_mime_type = 'pending-revision' OR post_mime_type = 'future-revision')"; + } else { + if (!in_array( + $status, + array_merge(rvy_revision_statuses(), array('inherit')) + ) ) { + return []; + } + } + + if ( COL_ID_RVY == $fields ) { + // performance opt for repeated calls by user_has_cap filter + if ( $use_memcache ) { + static $last_results; + + if ( ! isset($last_results) ) + $last_results = array(); + + elseif ( isset($last_results[$post_id][$status]) ) + return $last_results[$post_id][$status]; + } + + if ('inherit' == $status) { + $revisions = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_type = 'revision' AND post_parent = %d AND post_status = %s", + $post_id, + $status + ) + ); + } else { + if (!empty($all_rev_statuses_clause)) { + $revisions = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts " + . " INNER JOIN $wpdb->postmeta pm_published ON $wpdb->posts.ID = pm_published.post_id AND pm_published.meta_key = '_rvy_base_post_id'" + . " WHERE pm_published.meta_value = %s $all_rev_statuses_clause", + $post_id + ) + ); + } else { + $revisions = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts " + . " INNER JOIN $wpdb->postmeta pm_published ON $wpdb->posts.ID = pm_published.post_id AND pm_published.meta_key = '_rvy_base_post_id'" + . " WHERE pm_published.meta_value = %s AND post_mime_type = %s", + $post_id, + $status + ) + ); + } + } + + if ( $return_flipped ) + $revisions = array_fill_keys( $revisions, true ); + + if ( $use_memcache ) { + if ( ! isset($last_results[$post_id]) ) + $last_results[$post_id] = array(); + + $last_results[$post_id][$status] = $revisions; + } + + } else { + $order_clause = "ORDER BY $orderby $order"; + + if ('inherit' == $status) { + $revisions = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts WHERE post_type = 'revision' AND post_parent = %d AND post_status = %s $order_clause", + $post_id, + $status + ) + ); + } else { + if (!empty($all_rev_statuses_clause)) { + $revisions = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts " + . " INNER JOIN $wpdb->postmeta pm_published ON $wpdb->posts.ID = pm_published.post_id AND pm_published.meta_key = '_rvy_base_post_id'" + . " WHERE pm_published.meta_value = %d $all_rev_statuses_clause $order_clause", + $post_id + ) + ); + } else { + $revisions = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts " + . " INNER JOIN $wpdb->postmeta pm_published ON $wpdb->posts.ID = pm_published.post_id AND pm_published.meta_key = '_rvy_base_post_id'" + . " WHERE pm_published.meta_value = %d AND post_mime_type = %s $order_clause", + $post_id, + $status + ) + ); + } + } + } + + return $revisions; +} + +function rvy_order_types($types, $args = []) +{ + $defaults = ['order_property' => '', 'item_type' => 'post', 'labels_property' => '']; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + if ('post' == $item_type) { + $post_types = get_post_types([], 'object'); + } elseif ('taxonomy' == $item_type) { + $taxonomies = get_taxonomies([], 'object'); + } + + $ordered_types = []; + foreach (array_keys($types) as $name) { + if ('post' == $item_type) { + $ordered_types[$name] = (isset($post_types[$name]->labels->singular_name)) + ? $post_types[$name]->labels->singular_name + : ''; + } elseif ('taxonomy' == $item_type) { + $ordered_types[$name] = (isset($taxonomies[$name]->labels->singular_name)) + ? $taxonomies[$name]->labels->singular_name + : ''; + } else { + if (!is_object($types[$name])) { + return $types; + } + + if ($order_property) { + $ordered_types[$name] = (isset($types[$name]->$order_property)) + ? $types[$name]->$order_property + : ''; + } else { + $ordered_types[$name] = (isset($types[$name]->labels->$labels_property)) + ? $types[$name]->labels->$labels_property + : ''; + } + } + } + + asort($ordered_types); + + foreach (array_keys($ordered_types) as $name) { + $ordered_types[$name] = $types[$name]; + } + + return $ordered_types; +} + \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/admin-posts_rvy.php b/wp-content/plugins/revisionary/admin/admin-posts_rvy.php new file mode 100644 index 000000000..180fe77c2 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/admin-posts_rvy.php @@ -0,0 +1,254 @@ +post_status) && in_array($_post->post_mime_type, rvy_revision_statuses()))) { + if (apply_filters('revisionary_deletion_redirect_to_queue', true, $deleted_id, $post_type)) { + $url = admin_url("admin.php?page=revisionary-q&pp_revisions_deleted={$deleted_id}"); + + if (!empty($_SERVER['REQUEST_URI']) && false === strpos(esc_url_raw($_SERVER['REQUEST_URI']), $url)) { + wp_redirect($url); + exit; + } + } + } + } + } + } + + add_filter('query', [$this, 'fltPostCountQuery']); + } + + function revision_action_notice() { + if ( ! empty($_GET['restored_post'] ) ) { + ?> +
+
+ +
+
+ +
+
+ posts ) ) { + foreach ($wp_query->posts as $row) { + $listed_ids[] = $row->ID; + } + } + + if ($listed_ids) { + $id_csv = implode("','", array_map('intval', $listed_ids)); + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + $revision_base_statuses = array_map('sanitize_key', rvy_revision_base_statuses()); + $revision_base_status_csv = implode("','", $revision_base_statuses); + + $results = $wpdb->get_results( + "SELECT comment_count AS published_post, COUNT(comment_count) AS num_revisions FROM $wpdb->posts WHERE comment_count IN ('$id_csv') AND post_status IN ('$revision_base_status_csv') AND post_mime_type IN ('$revision_status_csv') AND post_type != '' GROUP BY comment_count" + ); + + foreach($results as $row) { + $this->post_revision_count[$row->published_post] = $row->num_revisions; + } + } + } + + private function logTrashedRevisions() { + global $wpdb, $wp_query; + + if (!empty($wp_query) && !empty($wp_query->posts)) { + $listed_ids = []; + + foreach($wp_query->posts AS $row) { + $listed_ids []= $row->ID; + } + + $listed_post_csv = implode("','", array_map('intval', $listed_ids)); + $this->trashed_revisions = $wpdb->get_col("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_rvy_base_post_id' AND post_id IN ('$listed_post_csv')"); + } else { + $this->trashed_revisions = []; + } + } + + /** + * Adds "Pending Revision" or "Scheduled Revision" to the list of display states for trashed revisions in the Posts list table. + * + * @param array $post_states An array of post display states. + * @param WP_Post $post The current post object. + * @return array Filtered array of post display states. + */ + public function fltTrashedPostState($post_states, $post) { + if (!$post->comment_count) { // revisions buffer base post id to comment_count column for perf + return $post_states; + } + + if (!isset($this->trashed_revisions)) { + $this->logTrashedRevisions(); + } + + if (in_array($post->ID, $this->trashed_revisions)) { + if ($status_obj = get_post_status_object($post->post_mime_type)) { + $post_states['rvy_revision'] = $status_obj->label; + } + + if (!isset($post_states['rvy_revision'])) { + $post_states['rvy_revision'] = esc_html__('Revision', 'revisionary'); + } + } + + return $post_states; + } + + function fltCommentsNumber($comment_count, $post_id) { + if (isset($this->trashed_revisions) && in_array($post_id, $this->trashed_revisions)) { + $comment_count = 0; + } + + return $comment_count; + } + + function flt_display_post_states($post_states, $post) { + if (!empty($this->post_revision_count[$post->ID]) && !defined('REVISIONARY_SUPPRESS_POST_STATE_DISPLAY')) { + $post_states []= esc_html__('Has Revision', 'revisionary'); + } + + return $post_states; + } + + function revisions_row_action_link($actions = array()) { + global $post; + + if (!empty($post) && !rvy_is_supported_post_type($post->post_type)) { + return $actions; + } + + if (!empty($this->post_revision_count[$post->ID])) { + if ( 'trash' != $post->post_status && wp_check_post_lock( $post->ID ) === false ) { + $actions['revision_queue'] = "" . esc_html__('Revision Queue', 'revisionary') . ''; + } + } + + $status_obj = get_post_status_object($post->post_status); + + if (empty($actions['view'])) { + + } + + if (!empty($status_obj->public) || !empty($status_obj->private) || rvy_get_option('pending_revision_unpublished')) { + if (rvy_get_option('pending_revisions') && current_user_can('copy_post', $post->ID) && rvy_post_revision_supported($post)) { + $redirect_arg = ( ! empty($_REQUEST['rvy_redirect']) ) ? "&rvy_redirect=" . esc_url_raw($_REQUEST['rvy_redirect']) : ''; + $url = rvy_admin_url("admin.php?page=rvy-revisions&post={$post->ID}&action=revise$redirect_arg"); + + $caption = (isset($actions['edit']) || !rvy_get_option('caption_copy_as_edit')) ? pp_revisions_status_label('draft-revision', 'submit') : esc_html__('Edit'); + + $caption = str_replace(' ', ' ', $caption); + + $actions['create_revision'] = "" . $caption . ''; + } + } + + return $actions; + } + + public function fltPostCountQuery($query) + { + global $wpdb; + + $posts = $wpdb->posts; + + $matches = []; + + // wp_count_posts() : + // SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s + + /* + SELECT COUNT( 1 ) + FROM $wpdb->posts + WHERE post_type = %s + AND post_status NOT IN ( '" . implode( "','", $exclude_states ) . "' ) + AND post_author = %d + */ + + $pos_from = strpos($query, "FROM $posts"); + $pos_where = strpos($query, "WHERE "); + + // todo: use 'wp_count_posts' filter instead? + + if ((strpos($query, "ELECT post_status, COUNT( * ) AS num_posts ") || (strpos($query, "ELECT COUNT( 1 )") && $pos_from && (!$pos_where || ($pos_from < $pos_where)))) + && preg_match("/FROM\s*{$posts}\s*WHERE post_type\s*=\s*'([^ ]+)'/", $query, $matches) + ) { + $_post_type = (!empty($matches[1])) ? $matches[1] : PWP::findPostType(); + + if ($_post_type) { + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + if (!function_exists('presspermit')) { + // avoid counting posts stored with a status that's no longer registered + $statuses = get_post_stati(); + $statuses_clause = " AND post_status IN ('" + . implode("','", array_map('sanitize_key', $statuses)) + . "')"; + } else { + $statuses_clause = ''; + } + + if (!strpos($query, "AND post_mime_type NOT IN ('$revision_status_csv')")) { + $query = str_replace( + " post_type = '{$matches[1]}'", + "( post_type = '{$matches[1]}' AND post_mime_type NOT IN ('$revision_status_csv'){$statuses_clause} )", + $query + ); + } + } + } + + return $query; + } +} diff --git a/wp-content/plugins/revisionary/admin/admin_lib-mu_rvy.php b/wp-content/plugins/revisionary/admin/admin_lib-mu_rvy.php new file mode 100644 index 000000000..5e5a5ad9f --- /dev/null +++ b/wp-content/plugins/revisionary/admin/admin_lib-mu_rvy.php @@ -0,0 +1,36 @@ + + * @copyright Copyright (c) 2024 PublishPress. All rights reserved. + * @license GPLv2 or later + * @since 1.0.0 + * + * Scripts and filter / action handlers applicable for all wp-admin URLs + * + * Selectively load other classes based on URL + */ + +if( isset($_SERVER['SCRIPT_FILENAME']) && (basename(__FILE__) == basename(esc_url_raw($_SERVER['SCRIPT_FILENAME']))) ) + die(); + +define ('RVY_URLPATH', plugins_url('', REVISIONARY_FILE)); + +class RevisionaryAdmin +{ + function __construct() { + global $pagenow, $post; + + $script_name = (isset($_SERVER['SCRIPT_NAME'])) ? esc_url_raw($_SERVER['SCRIPT_NAME']) : ''; + + add_action('admin_head', [$this, 'admin_head']); + add_action('admin_enqueue_scripts', [$this, 'admin_scripts']); + add_action('revisionary_admin_footer', [$this, 'publishpressFooter']); + + add_action('admin_print_scripts', [$this, 'hideAdminMenuToolbar'], 50); + + if ( ! defined('XMLRPC_REQUEST') && ! strpos($script_name, 'p-admin/async-upload.php' ) ) { + if ( RVY_NETWORK && ( is_main_site() ) ) { + require_once( dirname(__FILE__).'/admin_lib-mu_rvy.php' ); + add_action('admin_menu', 'rvy_mu_site_menu', 15 ); + } + + add_action('admin_menu', [$this, 'build_menu']); + + if ( strpos($script_name, 'p-admin/plugins.php') ) { + add_filter( 'plugin_row_meta', [$this, 'flt_plugin_action_links'], 10, 2 ); + } + } + + // ===== Special early exit if this is a plugin install script + if ( strpos($script_name, 'p-admin/plugins.php') || strpos($script_name, 'p-admin/plugin-install.php') || strpos($script_name, 'p-admin/plugin-editor.php') ) { + if (strpos($script_name, 'p-admin/plugin-install.php') && !empty($_SERVER['HTTP_REFERER']) && strpos(esc_url_raw($_SERVER['HTTP_REFERER']), '=rvy')) { + add_action('admin_print_scripts', function(){ + echo ''; + }); + } + + return; // no further filtering on WP plugin maintenance scripts + } + + if (in_array($pagenow, array('post.php', 'post-new.php'))) { + if (empty($post)) { + $post = get_post(rvy_detect_post_id()); + } + + if ($post && rvy_is_supported_post_type($post->post_type)) { + // only apply revisionary UI for currently published or scheduled posts + if (!rvy_in_revision_workflow($post) && (in_array($post->post_status, rvy_filtered_statuses()) || ('future' == $post->post_status))) { + require_once( dirname(__FILE__).'/filters-admin-ui-item_rvy.php' ); + new RevisionaryPostEditorMetaboxes(); + + } elseif (rvy_in_revision_workflow($post)) { + add_action('the_post', array($this, 'limitRevisionEditorUI')); + + require_once( dirname(__FILE__).'/edit-revision-ui_rvy.php' ); + new RevisionaryEditRevisionUI(); + + if (\PublishPress\Revisions\Utils::isBlockEditorActive($post->post_type)) { + require_once( dirname(__FILE__).'/edit-revision-block-ui_rvy.php' ); + new RevisionaryEditRevisionBlockUI(); + } else { + require_once( dirname(__FILE__).'/edit-revision-classic-ui_rvy.php' ); + new RevisionaryEditRevisionClassicUI(); + } + } + } + } + + if ( ! ( defined( 'SCOPER_VERSION' ) || defined( 'PP_VERSION' ) || defined( 'PPCE_VERSION' ) ) || defined( 'USE_RVY_RIGHTNOW' ) ) { + add_filter('dashboard_glance_items', [$this, 'fltDashboardGlanceItems']); + } + + if ( rvy_get_option( 'pending_revisions' ) || rvy_get_option( 'scheduled_revisions' ) ) { + if ('revision.php' == $pagenow) { + require_once( dirname(__FILE__).'/history_rvy.php' ); + new RevisionaryHistory(); + } + } + + if ( rvy_get_option( 'scheduled_revisions' ) ) { + add_filter('dashboard_recent_posts_query_args', [$this, 'flt_dashboard_recent_posts_query_args']); + } + + if (!empty($_REQUEST['page']) && ('cms-tpv-page-page' == $_REQUEST['page'])) { + add_action('pre_get_posts', [$this, 'cmstpv_compat_get_posts']); + } + + add_filter('presspermit_status_control_scripts', [$this, 'fltDisableStatusControlScripts']); + + add_filter('cme_plugin_capabilities', [$this, 'fltPublishPressCapsSection']); + + add_filter('relevanssi_where', [$this, 'ftlRelevanssiWhere']); + + add_action('init', function() { // late execution avoids clash with autoloaders in other plugins + global $pagenow; + + if (($pagenow == 'admin.php') && isset($_GET['page']) && in_array($_GET['page'], ['revisionary-q', 'revisionary-deletion', 'revisionary-settings']) + ) { + global $wp_version; + + if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON && rvy_get_option('scheduled_revisions', -1, false, ['bypass_condition_check' => true]) + && rvy_get_option('scheduled_publish_cron') && !rvy_get_option('wp_cron_usage_detected') && apply_filters('revisionary_wp_cron_disabled', true) + ) { + rvy_notice( + sprintf( + __('Scheduled Revisions are not available because WP-Cron is disabled on this site. See %sRevisions > Settings > Scheduled Revisions%s.', 'revisionary'), + '', + '' + ) + ); + } + } + + if ((($pagenow == 'admin.php') && isset($_GET['page']) && in_array($_GET['page'], ['revisionary-q', 'revisionary-settings']) + || (defined('DOING_AJAX') && DOING_AJAX && !empty($_REQUEST['action']) && (false !== strpos(sanitize_key($_REQUEST['action']), 'revisionary'))) + ) && !defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + if (!class_exists('\PublishPress\WordPressReviews\ReviewsController')) { + include_once RVY_ABSPATH . '/lib/vendor/publishpress/wordpress-reviews/ReviewsController.php'; + } + + if (class_exists('\PublishPress\WordPressReviews\ReviewsController')) { + $reviews = new \PublishPress\WordPressReviews\ReviewsController( + 'revisionary', + 'PublishPress Revisions', + plugin_dir_url(REVISIONARY_FILE) . 'common/img/revisions-wp-logo.jpg' + ); + + add_filter('publishpress_wp_reviews_display_banner_revisionary', [$this, 'shouldDisplayBanner']); + + $reviews->init(); + } + } + }); + } + + // Prevent Pending, Scheduled Revisions from inclusion in admin search results + function ftlRelevanssiWhere($where) { + global $wpdb; + + if ($revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses()))) { + $where .= " AND relevanssi.doc IN (SELECT ID FROM $wpdb->posts WHERE post_mime_type NOT IN ('" . $revision_status_csv . "'))"; + } + + return $where; + } + + function admin_scripts() { + global $pagenow; + + if (in_array($pagenow, ['post.php', 'post-new.php', 'revision.php']) || (!empty($_REQUEST['page']) && in_array($_REQUEST['page'], ['revisionary-settings', 'rvy-net_options', 'rvy-default_options', 'revisionary-q', 'revisionary-deletion', 'revisionary-archive']))) { + wp_enqueue_style('revisionary', RVY_URLPATH . '/admin/revisionary.css', [], PUBLISHPRESS_REVISIONS_VERSION); + } + + if (in_array($pagenow, ['post.php', 'post-new.php']) || (!empty($_REQUEST['page']) && in_array($_REQUEST['page'], ['revisionary-settings', 'rvy-net_options', 'rvy-default_options', 'revisionary-q', 'revisionary-deletion', 'revisionary-archive']))) { + wp_enqueue_style('revisionary-admin-common', RVY_URLPATH . '/common/css/pressshack-admin.css', [], PUBLISHPRESS_REVISIONS_VERSION); + } + + if ((!empty($_REQUEST['page']) && in_array($_REQUEST['page'], ['revisionary-settings', 'rvy-net_options', 'rvy-default_options']))) { + wp_enqueue_script('revisionary-settings', RVY_URLPATH . '/admin/settings.js', [], PUBLISHPRESS_REVISIONS_VERSION); + } + + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION') && ('admin.php' == $pagenow) && !empty($_REQUEST['page']) && in_array($_REQUEST['page'], ['revisionary-settings', 'rvy-net_options', 'rvy-default_options']) ) { + wp_enqueue_style('revisionary-settings', plugins_url('', REVISIONARY_PRO_FILE) . '/includes-pro/settings-pro.css', [], PUBLISHPRESS_REVISIONS_VERSION); + } + } + + function admin_head() { + global $pagenow; + + if ( isset($_SERVER['REQUEST_URI']) && (false !== strpos( urldecode(esc_url_raw($_SERVER['REQUEST_URI'])), 'admin.php?page=rvy-revisions' ))) { + // legacy revision management UI for past revisions + require_once( dirname(__FILE__).'/revision-ui_rvy.php' ); + } + + if ( ! defined('SCOPER_VERSION') ) { + // old js for notification recipient selection UI + wp_enqueue_script( 'rvy', RVY_URLPATH . "/admin/revisionary.js", array('jquery'), PUBLISHPRESS_REVISIONS_VERSION, true ); + } + + if (($pagenow == 'admin.php') && isset($_GET['page']) && in_array($_GET['page'], ['revisionary-q', 'revisionary-archive'])) { + add_screen_option( + 'per_page', + + ['label' => _x('Revisions', 'groups per page (screen options)', 'revisionary'), + 'default' => 20, + 'option' => ('revisionary-archive' == $_GET['page']) ? 'revision_archive_per_page' : 'revisions_per_page' + ] + ); + } + } + + public function shouldDisplayBanner() { + global $pagenow; + + return ($pagenow == 'admin.php') && isset($_GET['page']) && in_array($_GET['page'], ['revisionary-q', 'revisionary-deletion', 'revisionary-settings']); + } + + function fltDashboardGlanceItems($items) { + require_once(dirname(__FILE__).'/admin-dashboard_rvy.php'); + RevisionaryDashboard::glancePending(); + + return $items; + } + + function moderation_queue() { + require_once( dirname(__FILE__).'/revision-queue_rvy.php'); + } + + function revision_archive() { + require_once( dirname( __FILE__ ).'/revision-archive_rvy.php' ); + } + + function build_menu() { + global $current_user; + + if ( isset($_SERVER['REQUEST_URI']) && (strpos( esc_url_raw($_SERVER['REQUEST_URI']), 'wp-admin/network/' )) ) + return; + + $path = RVY_ABSPATH; + + // For Revisions Manager access, satisfy WordPress' demand that all admin links be properly defined in menu + if (isset($_SERVER['REQUEST_URI']) && (false !== strpos( urldecode(esc_url_raw($_SERVER['REQUEST_URI'])), 'admin.php?page=rvy-revisions' )) ) { + add_submenu_page( 'none', esc_html__('Revisions', 'revisionary'), esc_html__('Revisions', 'revisionary'), 'read', 'rvy-revisions', 'rvy_include_admin_revisions' ); + } + + $types = rvy_get_manageable_types(); + $revision_archive = true; + + $can_edit_any = false; + + if ($types || current_user_can('manage_options')) { + foreach ($types as $_post_type) { + if ($type_obj = get_post_type_object($_post_type)) { + if (!empty($current_user->allcaps[$type_obj->cap->edit_posts]) || (is_multisite() && is_super_admin())) { + $can_edit_any = true; + break; + } + } + } + } + + $can_edit_any = apply_filters('revisionary_add_menu', $can_edit_any); + + $menu_slug = 'revisionary-q'; + + if ($revision_archive || $can_edit_any || current_user_can('manage_options')) { + $_menu_caption = ( defined( 'RVY_MODERATION_MENU_CAPTION' ) ) ? RVY_MODERATION_MENU_CAPTION : esc_html__('Revisions'); + + if ($can_edit_any) { + $menu_func = [$this, 'moderation_queue']; + } else { + $menu_slug = 'revisionary-archive'; + $menu_func = [$this, 'revision_archive']; + } + + add_menu_page( esc_html__($_menu_caption, 'pp'), esc_html__($_menu_caption, 'pp'), 'read', $menu_slug, $menu_func, 'dashicons-backup', 29 ); + + if ($can_edit_any) { + add_submenu_page('revisionary-q', esc_html__('Revision Queue', 'revisionary'), esc_html__('Revision Queue', 'revisionary'), 'read', 'revisionary-q', [$this, 'moderation_queue']); + } + + do_action('revisionary_admin_menu'); + } + + // Revision Archive page + add_submenu_page( + $menu_slug, + esc_html__( 'Revision Archive', 'revisionary' ), + esc_html__( 'Revision Archive', 'revisionary' ), + 'read', + 'revisionary-archive', + [$this, 'revision_archive'] + ); + + if ( ! current_user_can( 'manage_options' ) ) + return; + + global $rvy_default_options, $rvy_options_sitewide; + + if ( empty($rvy_default_options) ) + rvy_refresh_default_options(); + + if ( ! RVY_NETWORK || ( count($rvy_options_sitewide) != count($rvy_default_options) ) ) { + add_submenu_page( $menu_slug, esc_html__('PublishPress Revisions Settings', 'revisionary'), esc_html__('Settings', 'revisionary'), 'read', 'revisionary-settings', 'rvy_omit_site_options'); + add_action('revisionary_page_revisionary-settings', 'rvy_omit_site_options' ); + } + + if (!defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + add_submenu_page( + $menu_slug, + esc_html__('Upgrade to Pro', 'revisionary'), + esc_html__('Upgrade to Pro', 'revisionary'), + 'read', + 'revisionary-pro', + 'rvy_omit_site_options' + ); + } + } + + function limitRevisionEditorUI() { + global $post; + + remove_post_type_support($post->post_type, 'author'); + remove_post_type_support($post->post_type, 'custom-fields'); // todo: filter post_id in query + } + + function flt_dashboard_recent_posts_query_args($query_args) { + if ('future' == $query_args['post_status']) { + global $revisionary; + $revisionary->is_revisions_query = true; + + require_once(dirname(__FILE__).'/admin-dashboard_rvy.php'); + $rvy_dash = new RevisionaryDashboard(); + $query_args = $rvy_dash->recentPostsQueryArgs($query_args); + } + + return $query_args; + } + + // adds a Settings link next to Deactivate, Edit in Plugins listing + function flt_plugin_action_links($links, $file) { + if ($file == plugin_basename(REVISIONARY_FILE)) { + $page = ( defined('RVY_NETWORK') && RVY_NETWORK ) ? 'rvy-net_options' : 'revisionary-settings'; + $links[] = "" . __awp('Settings') . ""; + } + + return $links; + } + + public function fltPublishPressCapsSection($section_caps) { + $section_caps['PublishPress Revisions'] = ['edit_others_drafts', 'edit_others_revisions', 'list_others_revisions', 'manage_unsubmitted_revisions']; + + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION') && rvy_get_option('revision_restore_require_cap')) { + $section_caps['PublishPress Revisions'] []= 'restore_revisions'; + } + + return $section_caps; + } + + public function fltDisableStatusControlScripts($enable_scripts) { + if ($post_id = rvy_detect_post_id()) { + if ($post = get_post($post_id)) { + if (!empty($post) && rvy_in_revision_workflow($post)) { + $enable_scripts = false; + } + } + } + + return $enable_scripts; + } + + // Prevent PublishPress Revisions statuses from confusing the CMS Tree Page View plugin page listing + public function cmstpv_compat_get_posts($wp_query) { + $wp_query->query['post_mime_type'] = ''; + $wp_query->query_vars['post_mime_type'] = ''; + } + + public function publishpressFooter() { + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION') && !rvy_get_option('display_pp_branding')) { + return; + } + + ?> + + id === 'revision' && isset( $_GET['rvy-popup'] ) && $_GET['rvy-popup'] === 'true' ) { + ?> + +  '; + + if ( $key ) { + if ( empty($args['suppress_extra_prefix']) ) + $id_prefix .= "_{$role_basis}"; + } + } + + // stored_assignments[agent_id][inherited_from] = progenitor_assignment_id (note: this function treats progenitor_assignment_id as a boolean) + static function _agents_checklist_display( $agents_subset, $role_basis, $all_agents, $id_prefix, $stored_assignments, $args, &$key) { + $defaults = array( + 'filter_threshold' => 10, 'default_hide_threshold' => 20, 'caption_length_limit' => 20, 'emsize_threshold' => 4 + ); + + $args = (array) $args; + foreach( array_keys( $defaults ) as $var ) { + $$var = ( isset( $args[$var] ) ) ? $args[$var] : $defaults[$var]; + } + + global $is_IE; + $ie_checkbox_style = ( $is_IE ) ? "height:1em" : ''; + + if ( ! is_array($stored_assignments) ) $stored_assignments = array(); + + $id_prefix .= "_{$role_basis}"; + + $agent_count = array(); + + $agent_count[CURRENT_ITEMS_RVY] = count($stored_assignments); + + $agent_count[ELIGIBLE_ITEMS_RVY] = count($all_agents) - count( $stored_assignments ); + + $default_hide_filtered_list = ( $default_hide_threshold && ( $agent_count[$agents_subset] > $default_hide_threshold ) ); + + // determine whether to show caption, show/hide checkbox and filter textbox + $any_display_filtering = ($agent_count[CURRENT_ITEMS_RVY] > $filter_threshold) || ($agent_count[ELIGIBLE_ITEMS_RVY] > $filter_threshold); + + if ( $agent_count[$agents_subset] > $filter_threshold ) { + $flt_checked = ( ! $default_hide_filtered_list ) ? " checked" : ''; + + echo "'; + } + + if ( $any_display_filtering || $agent_count[$agents_subset] > $emsize_threshold ) { + global $wp_locale; + $rtl = ( isset($wp_locale) && ('rtl' == $wp_locale->text_direction) ); + + // -------- determine required list item width ----------- + if ( $caption_length_limit > 40 ) + $caption_length_limit = 40; + + if ( $caption_length_limit < 10 ) + $caption_length_limit = 10; + + $longest_caption_length = 0; + + foreach( $all_agents as $agent ) { + $id = $agent->ID; + + $role_assigned = isset($stored_assignments[$id]); + + switch ( $agents_subset ) { + case CURRENT_ITEMS_RVY: + if ( ! $role_assigned ) continue 2; + break; + default: //ELIGIBLE_ITEMS_RVY + if ( $role_assigned ) continue 2; + } + + $caption = $agent->display_name; + + if ( strlen($caption) > $longest_caption_length ) { + if ( strlen($caption) >= $caption_length_limit ) + $longest_caption_length = $caption_length_limit + 2; + else + $longest_caption_length = strlen($caption); + } + } + + if ( $longest_caption_length < 10 ) + $longest_caption_length = 10; + + if ( defined( 'UI_EMS_PER_CHARACTER') ) + $ems_per_character = UI_EMS_PER_CHARACTER; + else + $ems_per_character = 0.85; + + $list_width_ems = $ems_per_character * $longest_caption_length; + + $ems_integer = intval($list_width_ems); + $ems_half = ( ($list_width_ems - $ems_integer) >= 0.5 ) ? '_5' : ''; + + $ul_class = "rs-agents_list_{$ems_integer}{$ems_half}"; + $hide_class = ( $default_hide_filtered_list && $agent_count[$agents_subset] > $filter_threshold ) ? 'agp_js_hide' : ''; + + echo "\r\n" . "
" + . "
" + . "
    "; + } else { + $ul_class = "rs-agents_list_auto"; + echo "\r\n
      "; + $rtl = false; + } + //-------- end list item width determination -------------- + + $last_agents = array(); + + foreach( $all_agents as $agent ) { + $id = $agent->ID; + $agent_display_name = $agent->display_name; + + $role_assigned = isset($stored_assignments[$id]); + + switch ( $agents_subset ) { + case CURRENT_ITEMS_RVY: + if ( ! $role_assigned ) continue 2; + break; + default: //ELIGIBLE_ITEMS_RVY + if ( $role_assigned ) continue 2; + } + + $li_title = strtolower($agent_display_name); + + $this_checked = ( $role_assigned ) ? ' checked' : ''; + + if ( $this_checked ) + $last_agents[] = $id; + + echo "\r\n
    • " + . ""; + + echo "
    • '; + + } //foreach agent + + echo "\r\n
    "; // prevent invalid markup if no other li's + + if ( CURRENT_ITEMS_RVY == $agents_subset ) { + $last_agents = implode("~", $last_agents); + echo ""; + } + + if ( $any_display_filtering || $agent_count[$agents_subset] > $emsize_threshold ) + echo '
'; + } + +} // end class diff --git a/wp-content/plugins/revisionary/admin/class-list-table-archive.php b/wp-content/plugins/revisionary/admin/class-list-table-archive.php new file mode 100644 index 000000000..388170548 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/class-list-table-archive.php @@ -0,0 +1,884 @@ + 'posts', + 'screen' => 'revisionary-archive', + ] + ); + + parent::__construct( $args ); + + $this->post_types = array_keys( $revisionary->enabled_post_types_archive ); + } + + /** + * Override WP_List_Table::prepare_items() + */ + public function prepare_items() { + global $wpdb, $per_page, $current_user; + + $per_page = $this->get_items_per_page( 'revision_archive_per_page' ); + $paged = isset( $_REQUEST['paged'] ) ? max( 0, intval( $_REQUEST['paged'] ) - 1 ) : 0; + $offset = $paged * $per_page; + $orderby = isset( $_REQUEST['orderby'] ) + && ! empty( $_REQUEST['orderby'] ) + && in_array( + $_REQUEST['orderby'], + [ + 'origin_post_date', + 'post_date', + 'post_count' + ] + ) + ? sanitize_key( $_REQUEST['orderby'] ) + : 'post_date'; + + $order = isset( $_REQUEST['order'] ) && ! empty( $_REQUEST['order'] ) && in_array( $_REQUEST['order'], ['asc', 'desc'] ) + ? sanitize_key( strtoupper( $_REQUEST['order'] ) ) + : 'DESC'; + + // Filters + $args = [ + 'orderby' => $orderby, + 'order' => $order + ]; + if( isset( $_REQUEST['s'] ) && ! empty( trim( $_REQUEST['s'] ) ) ) { + $args['s'] = strtolower( sanitize_text_field( trim( $_REQUEST['s'] ) ) ); + } + if( isset( $_REQUEST['origin_post'] ) && ! empty( $_REQUEST['origin_post'] ) ) { + $args['origin_post'] = (int) $_REQUEST['origin_post']; + } + if( isset( $_REQUEST['origin_post_author'] ) && ! empty( $_REQUEST['origin_post_author'] ) ) { + $args['origin_post_author'] = (int) $_REQUEST['origin_post_author']; + } + if( isset( $_REQUEST['post_author'] ) && ! empty( $_REQUEST['post_author'] ) ) { + $args['post_author'] = (int) $_REQUEST['post_author']; + } + if( isset( $_REQUEST['origin_post_type'] ) && ! empty( $_REQUEST['origin_post_type'] ) ) { + $args['origin_post_type'] = sanitize_text_field( $_REQUEST['origin_post_type'] ); + } + if( isset( $_REQUEST['post_parent'] ) && ! empty( $_REQUEST['post_parent'] ) ) { + $args['post_parent'] = (int) $_REQUEST['post_parent']; + } + + $base_query = $this->do_query( $args ); + + $results = $wpdb->get_results( + $wpdb->prepare( + "{$base_query} LIMIT %d,%d", + $offset, + $per_page + ) + ); + + $total_items = $wpdb->get_var( + $this->count_query( 'total_items', $base_query ) + ); + + $this->set_pagination_args( [ + 'total_items' => $total_items, + 'per_page' => $per_page, + ] ); + + $this->items = $results; + + // @todo: determine if any items have an approved_by postmeta row + $post_id_csv = implode("','", wp_list_pluck($results, 'ID')); + + $this->show_approved_by_col = $wpdb->get_var( + "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_rvy_approved_by' AND meta_value > 0 AND post_id IN ('$post_id_csv') LIMIT 1" + ); + + // 'All Revisions' link with count + $this->all_revisions_count = $wpdb->get_var( + $this->count_query( + 'all_items', + $this->do_query() + ) + ); + + // 'My Revisions' link with count + $this->my_revisions_count = $wpdb->get_var( + $this->count_query( + 'my_items', + $this->do_query( [ + 'post_author' => $current_user->ID + ] ) + ) + ); + } + + /** + * Generate a heading depeding the filters in use + * + * @return string + */ + public function filters_in_heading() { + $heading = ''; + + $count = 0; + + // Post title + if( isset( $_REQUEST['origin_post'] ) && ! empty( $_REQUEST['origin_post'] ) + ) { + if ($post_title = get_post_field('post_title', (int) $_REQUEST['origin_post'])) { + $heading .= $this->heading_spacing( $count ); + $heading .= $post_title; + $count++; + } + } else { + // Post type + if( isset( $_REQUEST['origin_post_type'] ) && ! empty( $_REQUEST['origin_post_type'] ) + && in_array( $_REQUEST['origin_post_type'], $this->post_types ) + ) { + $obj = get_post_type_object( sanitize_key( $_REQUEST['origin_post_type'] ) ); + $heading .= $this->heading_spacing( $count ); + $heading .= $obj->labels->name; + $count++; + } + } + + // Revision post author + if( isset( $_REQUEST['post_author'] ) && ! empty( $_REQUEST['post_author'] ) ) { + $heading .= $this->heading_spacing( $count ); + $heading .= sprintf( + __( 'Revision Author: %s' ,'revisionary' ), + get_the_author_meta( 'display_name', (int) $_REQUEST['post_author'] ) + ); + $count++; + } + + // Revision post parent + if( isset( $_REQUEST['post_parent'] ) && ! empty( $_REQUEST['post_parent'] ) ) { + $heading .= $this->heading_spacing( $count ); + $heading .= '"' . get_the_title( (int) $_REQUEST['post_parent'] ) . '"'; + $count++; + } + + // Origin post author + if( isset( $_REQUEST['origin_post_author'] ) && ! empty( $_REQUEST['origin_post_author'] ) ) { + $heading .= $this->heading_spacing( $count ); + $heading .= sprintf( + __( 'Post Author: %s' ,'revisionary' ), + get_the_author_meta( 'display_name', (int) $_REQUEST['origin_post_author'] ) + ); + $count++; + } + + if( ! empty( $heading ) ) { + $heading = ' (' . $heading . ')'; + } + + return $heading; + } + + /** + * Generate a label next to heading for search results + * + * @return string + */ + public function search_in_heading() { + $heading = ''; + + if( isset( $_REQUEST['s'] ) && ! empty( trim( $_REQUEST['s'] ) ) ) { + $heading .= sprintf( + __( 'Search results for "%s"', 'revisionary' ), + strtolower( + sanitize_text_field( + trim( $_REQUEST['s'] ) + ) + ) + ); + } + + return sprintf( + '%s', + $heading + ); + } + + /** + * Generate count query database SELECT + * + * @param string $alias A string to differentiate the query for debugging purposes + * @param string $base The do_query() query to count records from + * + * @return string + */ + private function count_query( $alias, $base ) { + return "SELECT COUNT(*) as {$alias} FROM ($base) as {$alias}_subquery"; + } + + /** + * Build database query select to retrieve data to display later in table + * + * @param array $args The database field to order by (can be an alias from the query) + * + * @return string + */ + private function do_query( $args = [] ) { + global $wpdb; + + $orderby = array_key_exists( 'orderby', $args ) ? $args['orderby'] : 'post_date'; + $order = array_key_exists( 'order', $args ) ? $args['order'] : 'DESC'; + + $query = "SELECT + r.ID AS ID, + r.post_type AS post_type, + r.post_title AS post_title, + r.post_date AS post_date, + r.post_author AS post_author, + r.post_parent AS post_parent, + ( + SELECT COUNT(*) + FROM $wpdb->posts p3 + WHERE p3.post_parent = r.post_parent + AND p3.post_type = 'revision' + ) AS post_count, + ( + SELECT p2.post_author + FROM $wpdb->posts p2 + WHERE p2.ID = r.post_parent + ORDER BY p2.ID DESC + LIMIT 0,1 + ) AS origin_post_author, + ( + SELECT p2.post_date + FROM $wpdb->posts p2 + WHERE p2.ID = r.post_parent + ORDER BY p2.ID DESC + LIMIT 0,1 + ) AS origin_post_date, + ( + SELECT p2.post_type + FROM $wpdb->posts p2 + WHERE p2.ID = r.post_parent + ORDER BY p2.ID DESC + LIMIT 0,1 + ) AS origin_post_type + FROM $wpdb->posts r + LEFT JOIN $wpdb->posts r3 ON r.post_parent = r3.ID + WHERE r.post_type = 'revision' AND r.post_name NOT LIKE '%-autosave-v%'"; + + // Only when Search input is valid + if( isset( $args['s'] ) ) { + $query .= $wpdb->prepare( + " AND LOWER(r.post_title) LIKE '%s'", + '%' . $wpdb->esc_like( $args['s'] ) . '%' + ); + } + + $count = 0; + + // Filter by origin_post_author + if( isset( $args['origin_post'] ) ) { + $query .= $wpdb->prepare( + "{$this->having_and( $count )} post_parent = %d", + $args['origin_post'] + ); + $count++; + } + + // Filter by origin_post_author + if( isset( $args['origin_post_author'] ) ) { + $query .= $wpdb->prepare( + "{$this->having_and( $count )} origin_post_author LIKE %d", + $wpdb->esc_like( $args['origin_post_author'] ) + ); + $count++; + } + + // Filter by post_author + if( isset( $args['post_author'] ) ) { + $query .= $wpdb->prepare( + "{$this->having_and( $count )} post_author LIKE %d", + $wpdb->esc_like( $args['post_author'] ) + ); + $count++; + } + + // Filter by post_parent + if( isset( $args['post_parent'] ) ) { + $query .= $wpdb->prepare( + "{$this->having_and( $count )} post_parent LIKE %d", + $wpdb->esc_like( $args['post_parent'] ) + ); + $count++; + } + + // Filter by origin_post_type + if( isset( $args['origin_post_type'] ) ) { + $query .= $wpdb->prepare( + "{$this->having_and( $count )} origin_post_type LIKE %s", + $wpdb->esc_like( $args['origin_post_type'] ) + ); + $count++; + } + + $query .= $this->having_and( $count ) . ' origin_post_type IN ("' . implode('","', $this->post_types ) . '")'; + $count++; + + // Set order by and order + $query .= ' ORDER BY ' . $orderby . ' ' . strtoupper( $order ); + + return $query; + } + + /** + * Check if a key exists in array + * + * @param string $array e.g. ['origin_post_author' => $current_user->ID] + * @param string $find Which key are we looking in an array. e.g. 'origin_post_author' + * + * @return string|bool + */ + private function key_in_args( $array, $find ) { + if ( array_key_exists( $find, $array ) ) { + $find_value = $array[$find]; + } + + if ( isset( $find_value ) ) { + return $find_value; + } + + return false; + } + + /** + * HAVING clause helper to build dynamic query + * + * @param int $count Number that later decide the return + * + * @return string + */ + private function having_and( $count ) { + return $count > 0 ? ' AND' : ' HAVING'; + } + + /** + * Generate dynamic spacing + * + * @param int $count Number that later decide the return + * + * @return string + */ + private function heading_spacing( $count ) { + return $count > 0 ? ', ' : ''; + } + + protected function get_bulk_actions() { + $actions = []; + + if (rvy_get_option('revision_archive_deletion')) { + $actions['delete'] = esc_html__( 'Delete Revision', 'revisionary' ); + } + + return $actions; + } + + // override default nonce field + protected function display_tablenav( $which ) { + if ( 'top' === $which ) { + wp_nonce_field( 'bulk-revision-archive' ); + } + ?> +
+ + has_items() ) : ?> +
+ bulk_actions( $which ); ?> +
+ extra_tablenav( $which ); + + if (!empty($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI'] = str_replace('#038;', '&', esc_url_raw($_SERVER['REQUEST_URI'])); + } + + $this->pagination( $which ); + ?> + +
+
+ '', + 'post_title' => __( 'Revision', 'revisionary' ), + 'post_count' => __( 'Count', 'revisionary' ), + 'origin_post_type' => __( 'Post Type', 'revisionary' ), + 'post_author' => __( 'Revised By', 'revisionary' ), + 'post_date' => __( 'Revision Date', 'revisionary' ), + 'publication_method' => __('Method', 'revisionary'), + 'approved_by' => __('Approved By', 'revisionary'), + 'origin_post_date' => __( 'Published Date', 'revisionary' ), + 'origin_post_author' => __( 'Published Author', 'revisionary' ), + ); + + if (!$this->show_approved_by_col) { + unset($arr['approved_by']); + } + + return $arr; + } + + /** + * Make post datetime friendly + * + * @return html + */ + public function friendly_date( $time ) { + $timezone = get_option( 'timezone_string' ); + if ( $timezone ) { + date_default_timezone_set( $timezone ); + } + + $timestamp = strtotime( $time ); + $current_time = time(); + $time_diff = $current_time - $timestamp; + $date_format = sanitize_text_field( get_option( 'date_format' ) ); + $time_format = sanitize_text_field( get_option( 'time_format' ) ); + + if ( $time_diff < 60 ) { + $result = esc_html__( 'just now', 'revisionary' ); + } elseif ( $time_diff < 3600 ) { + $result = sprintf( + esc_html__( '%s minutes ago', 'revisionary' ), + floor( $time_diff / 60 ) + ); + } elseif ( $time_diff < 86400 ) { + $result = sprintf( + esc_html__( '%s hours ago', 'revisionary' ), + floor( $time_diff / 3600 ) + ); + } /*elseif ( $time_diff < 2592000 ) { + $result = sprintf( + esc_html__( '%s days ago', 'revisionary' ), + floor( $time_diff / 86400 ) + ); + }*/ else { + $result = date_i18n( "$date_format @ $time_format", $timestamp ); + } + + $saved_time = date( 'Y/m/d H:i:s', $timestamp ); + + return '' . $result . ''; + } + + /** + * Override WP_List_Table::column_default() + */ + public function column_default( $item, $column_name ) { + switch ( $column_name ) { + case 'post_title': + // Are revisions enabled for the post type of this post parent? + $post_object = get_post( $item->post_parent ); + $revisions_enabled = wp_revisions_enabled( $post_object ); + if( $revisions_enabled ) { + // Show title with link + printf( + '%s', + esc_url_raw( get_edit_post_link( $item->ID ) . '&width=900&height=600&rvy-popup=true&TB_iframe=1' ), + esc_attr( $item->$column_name ), + $item->$column_name + ); + } else { + // Show title WITHOUT link + printf( + '%s %s', + $item->$column_name, + sprintf( + '', + sprintf( + esc_attr__( 'Revisions are disabled for %s post type', 'revisionary' ), + $item->origin_post_type + ) + ) + ); + } + + break; + + case 'origin_post_type': + $type_obj = get_post_type_object($item->$column_name); + $type_label = (!empty($type_obj)) ? $type_obj->labels->singular_name : $item->$column_name; + + echo $this->build_filter_link( + $type_label, + [ + 'origin_post_type' => sanitize_key( $item->$column_name ) + ] + ); + break; + + case 'post_date': + case 'origin_post_date': + return $this->friendly_date( $item->$column_name ); + break; + + case 'origin_post_author': + echo $this->build_filter_link( + get_the_author_meta( 'display_name', $item->$column_name ), + [ + 'origin_post_author' => (int) $item->$column_name + ] + ); + break; + + case 'post_author': + echo $this->build_filter_link( + get_the_author_meta( 'display_name', $item->$column_name ), + [ + 'post_author' => (int) $item->$column_name + ] + ); + break; + + case 'publication_method': + $revision_publication = get_post_meta($item->ID, '_rvy_published_gmt', true); + $prev_revision_status = get_post_meta($item->ID, '_rvy_prev_revision_status', true); + + switch ($prev_revision_status) { + case 'future-revision': + printf(__('Scheduled Rev.')); + break; + + case 'pending-revision': + case 'draft-revision': + printf(__('Submitted Rev.', 'revisionary')); + break; + + default: + if (!empty($revision_publication)) { + printf(__('Submitted Rev.', 'revisionary')); + } else { + printf(__('Direct Edit', 'revisionary')); + } + } + + break; + + case 'approved_by': + if ($approver_id = get_post_meta($item->ID, '_rvy_approved_by', true)) { + if ($user = new WP_User($approver_id)) { + echo $user->display_name; + } + } + + break; + + case 'post_count': + echo $this->build_filter_link( + (int) $item->$column_name, + [ + 'post_parent' => (int) $item->post_parent + ] + ); + break; + + default: + return ''; + } + } + + /** + * Override WP_List_Table::column_cb() + */ + public function column_cb( $item ) { + return sprintf( + '', $item->ID + ); + } + + /** + * Override WP_List_Table::extra_tablenav() + */ + protected function extra_tablenav( $which ) { + ?> +
+ post_types_dropdown(); + + $output = ob_get_clean(); + + if ( ! empty( $output ) ) { + echo $output; + submit_button( __( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); + } + + if( count( $_REQUEST ) > 1 ) : + ?> + + + + +
+ + + 'origin_post_date', + 'post_date' => 'post_date', + 'post_count' => 'post_count', + ]; + } + + /** + * Override WP_List_Table::get_views() + */ + protected function get_views() { + global $current_user; + ?> + + post_parent)); + + $actions = []; + $can_read_post = !empty($post_status_obj) && current_user_can( 'read_post', $item->ID ); + $can_edit_post = $is_administrator || (!empty($post_status_obj && current_user_can('edit_post', $item->post_parent))); + //$can_delete_post = current_user_can( 'delete_post', $item->ID ); + $post_type_object = get_post_type_object( $item->origin_post_type ); + $post_object = get_post( $item->post_parent ); + $revisions_enabled = wp_revisions_enabled( $post_object ); + + if ( ( $can_read_post || $can_edit_post ) && $revisions_enabled ) { + $actions['diff'] = sprintf( + '%3$s', + admin_url( "revision.php?revision=$item->ID" ), + esc_attr( + sprintf( + esc_html__( 'Compare Changes in %s', 'revisionary' ), + $item->post_title + ) + ), + _x( 'Compare', 'revisions', 'revisionary' ) + ); + } + + if ( is_post_type_viewable( $post_type_object ) ) { + if ( $can_read_post && $post_type_object && ! empty( $post_type_object->public ) ) { + if ( rvy_get_option( 'revision_preview_links' ) || $is_administrator ) { + do_action('pp_revisions_get_post_link', $item->ID); + + $preview_link = rvy_preview_url( $item ); + + $preview_link = remove_query_arg( 'preview_id', $preview_link ); + $actions['view'] = sprintf( + '%3$s', + esc_url( $preview_link ), + esc_attr( esc_html__( 'Preview Revision', 'revisionary' ) ), + esc_html__( 'Preview' ) + ); + + do_action('pp_revisions_post_link_done', $item->ID); + } + } + } + + $actions['post_filter'] = sprintf( + '%3$s', + add_query_arg('origin_post', $item->post_parent, untrailingslashit(site_url('')) . esc_url_raw( $_SERVER['REQUEST_URI'] )), + esc_attr( esc_html__( 'List Revisions of this Post', 'revisionary' ) ), + esc_html__( 'Filter', 'revisionary' ) + ); + + if ( $can_edit_post && rvy_get_option('revision_archive_deletion')) { + $delete_link = esc_url(wp_nonce_url( + "admin.php?page=rvy-revisions&action=delete&revision={$item->ID}", + 'delete-revision_' . $item->ID + )); + + $actions['delete'] = sprintf( + '%3$s', + $delete_link, + esc_html__( 'Delete Past Revision', 'revisionary' ), + esc_html__( 'Delete' ) + ); + } + + return $this->row_actions( $actions ); + } + + /** + * Generate all the hidden input fields to use as filters in database + * + * @return html + */ + public function hidden_input() { + ?> + + single_hidden_input( 'origin_post_type' ); + $this->single_hidden_input( 'origin_post_author', true ); + $this->single_hidden_input( 'post_author', true ); + $this->single_hidden_input( 'post_parent', true ); + } + + /** + * Generate hidden input fields to use as filters in database + * + * @param string $field The field name from database query + * @param bool $integer The field is a number? + * + * @return html + */ + public function single_hidden_input( $field, $integer = false ) { + if( isset( $_REQUEST[$field] ) && ! empty( $_REQUEST[$field] ) ) : + ?> + + sanitize_key( $_REQUEST[$var] ) + ], + $args + ); + } + } + + $count = $count ==! null ? ' (' . $count . ')' : ''; + + // Check if $args['v'] exists and is current page + $v = ''; + if( array_key_exists( 'v', $args ) + && isset( $_REQUEST['v'] ) + && sanitize_key( $_REQUEST['v'] ) === $args['v'] + ) { + $v = ' class="current"'; + } + + return '' + . sanitize_text_field( $label ) . $count + . ''; + } + + /** + * Override WP_List_Table::no_items() + */ + public function no_items() { + _e( 'No revisions found.', 'revisionary' ); + } +} diff --git a/wp-content/plugins/revisionary/admin/class-list-table_rvy.php b/wp-content/plugins/revisionary/admin/class-list-table_rvy.php new file mode 100644 index 000000000..ad77de59e --- /dev/null +++ b/wp-content/plugins/revisionary/admin/class-list-table_rvy.php @@ -0,0 +1,1412 @@ + 'posts', + 'screen' => isset( $args['screen'] ) ? $args['screen'] : null, + ]); + + if ( isset( $args['post_types'] ) ) + $this->post_types = $args['post_types']; + else + $this->post_types = array_keys($revisionary->enabled_post_types); + + $omit_types = ['forum', 'topic', 'reply']; + $this->post_types = array_diff( $this->post_types, $omit_types ); + + add_filter('manage_revisionary-q_columns', [$this, 'rvy_pending_list_register_columns']); + + add_action('manage_posts_custom_column', [$this, 'rvy_pending_custom_col'], 10, 2); + add_action('manage_pages_custom_column', [$this, 'rvy_pending_custom_col'], 10, 2); + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + // Don't allow MA to change revision author display. Authors taxonomy storage is only for application to published post. + global $multiple_authors_addon; + remove_action('the_post', [$multiple_authors_addon, 'fix_post'], 10); + } + + if (!empty($_REQUEST['published_post']) && !rvy_get_post_meta((int) $_REQUEST['published_post'], '_rvy_has_revisions', true)) { + revisionary_refresh_postmeta((int) $_REQUEST['published_post']); + } + + // Gutenberg will not allow immediate deletion of revisions from within editor + + // Ensure deletion of trashed revisions through redundant triggering: + // * Revision and Post IDs stored to options array on trashed_post action + // * Revision IDs in redirect URL + + if ($triggered_deletions = (array) get_option('_rvy_trigger_deletion')) { + $clear_trigger_option = true; + } + + if (!empty($_REQUEST['pp_revisions_deleted'])) { + global $current_user; + + $delete_id = (int) $_REQUEST['pp_revisions_deleted']; + + if (('trash' == get_post_field('post_status', $delete_id))) { + $revision = get_post($delete_id); + + if (!empty($revision->comment_count)) { + $triggered_deletions[$delete_id] = $revision->comment_count; + } + } + } + + foreach ($triggered_deletions as $revision_id => $post_id) { + if ($revision_id) { + wp_delete_post($revision_id, true); + } + + if ($post_id) { + revisionary_refresh_postmeta($post_id); + } + } + + if ($clear_trigger_option) { + delete_option('_rvy_trigger_deletion'); + } + + $this->correctCommentCounts(); + + if (!defined('REVISIONARY_DISABLE_WP_CRON_RESTORATION') && rvy_get_option('scheduled_revisions') && rvy_get_option('scheduled_publish_cron')) { + add_action('admin_footer', [$this, 'act_reschedule_missed_cron_revisions']); + } + } + + function act_reschedule_missed_cron_revisions() { + global $wpdb; + + $time_gmt = current_time('mysql', 1); + + $cron_catchup_limit = (defined('REVISIONARY_SCHEDULED_CRON_RESTORATION_LIMIT_SECONDS')) ? REVISIONARY_SCHEDULED_CRON_RESTORATION_LIMIT_SECONDS : 3600 * 24 * 30; + + $timezone = new DateTimeZone('UTC'); + $datetime = new DateTime('now', $timezone); + $datetime->setTimestamp(strtotime($time_gmt) - $cron_catchup_limit); + $limit_time_gmt = $datetime->format('Y-m-d H:i:s'); + + $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts WHERE post_type != 'revision'" + . " AND post_status != 'inherit' AND post_mime_type = 'future-revision' AND post_date_gmt > %s AND post_date_gmt < %s" + . " ORDER BY post_date_gmt DESC", + + $limit_time_gmt, + $time_gmt + ) + ); + + foreach($results as $revision) { + if (strtotime($time_gmt) - strtotime($revision->post_date_gmt) < $cron_catchup_limit) { // safeguard to prevent ancient misses from being published now + if (!wp_get_scheduled_event('publish_revision_rvy', [$revision->ID])) { + // safeguard to prevent future schedules from being published immediately + $schedule_time = strtotime($revision->post_date_gmt) < strtotime($time_gmt) ? strtotime($time_gmt) : strtotime($revision->post_date_gmt); + + wp_schedule_single_event($schedule_time, 'publish_revision_rvy', [$revision->ID]); + } + } + } + } + + function do_query( $q = false ) { + if ( false === $q ) $q = $_GET; + + // === first, query published posts that have any Revisionary revisions === + + $qp['cat'] = isset($q['cat']) ? (int) $q['cat'] : 0; + + if ( isset($q['post_type']) && in_array( $q['post_type'], $this->post_types ) ) + $qp['post_type'] = $q['post_type']; + else + $qp['post_type'] = $this->post_types; + + $omit_stati = ['hidden']; + + $qp['post_status'] = array_diff( rvy_filtered_statuses(), $omit_stati ); + + if (!empty($q['published_post'])) { + $qp['p'] = (int) $q['published_post']; + } + + $qp['posts_per_page'] = -1; + $qp['fields'] = 'ids'; + + //$qp['meta_key'] = '_rvy_has_revisions'; + + global $wpdb; + + if (!empty($q['post_author'])) { + do_action('revisionary_queue_pre_query'); + $_pre_query = new WP_Query( $qp ); + + // workaround for unidentified plugin conflict inserting inappropriate clauses into our query + if (!defined('REVISIONARY_QUEUE_DISABLE_QUERY_COMPAT_WORKAROUNDS')) { + if (false !== stripos($_pre_query->request, ", IF ( _has_featured_image.meta_value IS NULL, 0, 1 ) AS has_featured_image")) { + $_pre_query->request = str_ireplace( + ", IF ( _has_featured_image.meta_value IS NULL, 0, 1 ) AS has_featured_image", + '', + $_pre_query->request + ); + + $_pre_query->request = str_ireplace( + "LEFT JOIN wp_postmeta AS _has_featured_image ON _has_featured_image.post_id = $wpdb->posts.ID and _has_featured_image.meta_key = '_thumbnail_id'", + '', + $_pre_query->request + ); + + $_pre_query->request = str_ireplace( + 'ORDER BY has_featured_image DESC,', + 'ORDER BY ', + $_pre_query->request + ); + } + } + + $this->published_post_count_ids_query = $_pre_query->request; + do_action('revisionary_queue_pre_query_done'); + + $qp['author'] = $q['post_author']; + } + + $filter_name = (defined('REVISIONARY_QUEUE_LEGACY_FILTER')) ? 'posts_clauses' : 'posts_clauses_request'; + + do_action('revisionary_queue_pre_query'); + add_filter($filter_name, [$this, 'pre_query_filter'], 5, 2); + add_filter($filter_name, [$this, 'restore_revisions_filter'], PHP_INT_MAX - 1, 2); + $pre_query = new WP_Query( $qp ); + + // workaround for unidentified plugin conflict inserting inappropriate clauses into our query + if (!defined('REVISIONARY_QUEUE_DISABLE_QUERY_COMPAT_WORKAROUNDS')) { + if (false !== stripos($pre_query->request, ", IF ( _has_featured_image.meta_value IS NULL, 0, 1 ) AS has_featured_image")) { + $pre_query->request = str_ireplace( + ", IF ( _has_featured_image.meta_value IS NULL, 0, 1 ) AS has_featured_image", + '', + $pre_query->request + ); + + $pre_query->request = str_ireplace( + "LEFT JOIN wp_postmeta AS _has_featured_image ON _has_featured_image.post_id = $wpdb->posts.ID and _has_featured_image.meta_key = '_thumbnail_id'", + '', + $pre_query->request + ); + + $pre_query->request = str_ireplace( + 'ORDER BY has_featured_image DESC,', + 'ORDER BY ', + $pre_query->request + ); + } + } + + remove_filter($filter_name, [$this, 'pre_query_filter'], 5, 2); + remove_filter($filter_name, [$this, 'restore_revisions_filter'], PHP_INT_MAX - 1, 2); + do_action('revisionary_queue_pre_query_done'); + + $this->published_post_ids_query = $pre_query->request; + + // === now query the revisions === + $qr = $q; + + unset($qr['post_author']); + + $qr['post_type'] = $qp['post_type']; + + $qr['post_status'] = rvy_revision_base_statuses(); + + if (isset($qr['m']) && strlen($qr['m']) == 6) { + $qr['date_query'] = [ + 'column' => ( ! empty($_REQUEST['post_mime_type']) && 'future-revision' == $_REQUEST['post_mime_type'] ) ? 'post_date' : 'post_modified', + 'year' => substr($qr['m'], 0, 4), + 'month' => substr($qr['m'], 4) + ]; + + unset($qr['m']); + } + + if ( isset( $q['orderby'] ) && !in_array($q['orderby'], ['post_mime_type', 'post_type']) ) { + $qr['orderby'] = $q['orderby']; + } else { + $qr['orderby'] = ( ! empty($_REQUEST['post_mime_type']) && 'future-revision' == $_REQUEST['post_mime_type'] ) ? 'date' : 'modified'; + } + + if ( isset( $q['order'] ) && !in_array($q['orderby'], ['post_mime_type', 'post_type'] ) ) { + $qr['order'] = $q['order']; + } else { + $qr['order'] = 'DESC'; + } + + $per_page = "revisions_per_page"; + $qr['posts_per_page'] = (int) get_user_option( $per_page ); + + if ( empty( $qr['posts_per_page'] ) || $qr['posts_per_page'] < 1 ) + $qr['posts_per_page'] = 20; + + if ( isset($q['post_status']) && rvy_is_revision_status( $q['post_status'] ) ) { + $qr['post_mime_type'] = [$q['post_status']]; + } else { + $qr['post_mime_type'] = rvy_revision_statuses(); + } + + if (!rvy_get_option('pending_revisions')) { + $qr['post_mime_type'] = array_diff($qr['post_mime_type'], ['draft-revision', 'pending-revision']); + } + + if (!rvy_get_option('scheduled_revisions')) { + $qr['post_mime_type'] = array_diff($qr['post_mime_type'], ['future-revision']); + } + + global $wp_query; + + $filter_name = (defined('REVISIONARY_QUEUE_LEGACY_FILTER')) ? 'posts_clauses' : 'posts_clauses_request'; + + add_filter('presspermit_posts_clauses_intercept', [$this, 'flt_presspermit_posts_clauses_intercept'], 10, 4); + add_filter($filter_name, [$this, 'revisions_filter'], 5, 2); + add_filter($filter_name, [$this, 'restore_revisions_filter'], PHP_INT_MAX - 1, 2); + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + remove_action('pre_get_posts', ['MultipleAuthors\\Classes\\Query', 'action_pre_get_posts']); + remove_filter('posts_where', ['MultipleAuthors\\Classes\\Query', 'filter_posts_where'], 10, 2); + remove_filter('posts_join', ['MultipleAuthors\\Classes\\Query', 'filter_posts_join'], 10, 2); + remove_filter('posts_groupby', ['MultipleAuthors\\Classes\\Query', 'filter_posts_groupby'], 10, 2); + + if (!defined('PUBLISHPRESS_AUTHORS_DISABLE_FILTER_THE_AUTHOR')) { + define('PUBLISHPRESS_AUTHORS_DISABLE_FILTER_THE_AUTHOR', true); + } + } + + if (!empty($_REQUEST['s'])) { + $qr['s'] = sanitize_text_field($_REQUEST['s']); + } + + $qr = apply_filters('revisionary_queue_vars', $qr); + + $wp_query->is_revisions_query = true; + + add_filter('posts_where', [$this, 'fltFixMimeTypeClause']); + $wp_query->query($qr); + remove_filter('posts_where', [$this, 'fltFixMimeTypeClause']); + + $wp_query->is_revisions_query = false; + + do_action('revisionary_queue_done'); + + // prevent default display of all revisions + if (!$wp_query->posts) { + $wp_query->posts = [true]; + } + + remove_filter('presspermit_posts_clauses_intercept', [$this, 'flt_presspermit_posts_clauses_intercept'], 10, 4); + remove_filter($filter_name, [$this, 'revisions_filter'], 5, 2); + remove_filter($filter_name, [$this, 'restore_revisions_filter'], PHP_INT_MAX - 1, 2); + + return $qr['post_mime_type']; + } + + function fltFixMimeTypeClause($where) { + return str_replace("-revision/%'", "-revision'", $where); + } + + function flt_presspermit_posts_clauses_intercept( $intercept, $clauses, $_wp_query, $args) { + return $clauses; + } + + function pre_query_where_filter($where, $args = []) { + global $wpdb, $current_user, $revisionary; + + if (!current_user_can('administrator') && empty($args['suppress_author_clause']) && empty($_REQUEST['post_author'])) { + if (rvy_get_option('revisor_hide_others_revisions') && !current_user_can('list_others_revisions') ) { + + $p = (!empty($args['alias'])) ? $args['alias'] : $wpdb->posts; + + $can_edit_others_types = []; + + foreach(array_keys($revisionary->enabled_post_types) as $post_type) { + if ($type_obj = get_post_type_object($post_type)) { + if (current_user_can($type_obj->cap->edit_others_posts)) { + $can_edit_others_types[]= $post_type; + } + } + } + + $can_edit_others_types = array_map('sanitize_key', apply_filters('revisionary_queue_edit_others_types', $can_edit_others_types)); + + $type_clause = ($can_edit_others_types) ? "OR $p.post_type IN ('" . implode("','", $can_edit_others_types) . "')" : ''; + + $where .= $wpdb->prepare(" AND ($p.post_author = %d $type_clause)", $current_user->ID ); + } + } + + return $where; + } + + function restore_revisions_filter($clauses, $_wp_query = false) { + if (!empty($this->posts_clauses_filtered) && !defined('REVISIONARY_ENABLE_REVISION_QUEUE_FILTERING')) { + $clauses = $this->posts_clauses_filtered; + } + + return $clauses; + } + + function pre_query_filter($clauses, $_wp_query = false) { + $clauses['where'] = $this->pre_query_where_filter($clauses['where']); + + $this->posts_clauses_filtered = $clauses; + + return $clauses; + } + + function append_revisions_where($where, $args=[]) { + // relocated to calling function for clarity + return ''; + } + + function revisions_where_filter($where, $args = []) { + global $wpdb, $current_user, $revisionary; + + $p = (!empty($args['alias'])) ? sanitize_text_field($args['alias']) : $wpdb->posts; + + $is_count_query = empty($args['revision_query']); + + $is_my_activity = empty($_REQUEST['all']) && empty($_REQUEST['author']) && empty($_REQUEST['post_author']) && empty($_REQUEST['post_status']); + + if (!empty($args['status_count'])) { + $id_subquery = (!empty($this->published_post_count_ids_query)) ? $this->published_post_count_ids_query : $this->published_post_ids_query; + } else { + $id_subquery = $this->published_post_ids_query; + } + + if ((empty($_REQUEST['post_author']) || !empty($args['status_count'])) && empty($_REQUEST['published_post']) && empty($args['my_published_count'])) { + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + $own_revision_and = ''; + + if (defined('ICL_SITEPRESS_VERSION')) { + if (!empty($_REQUEST['lang'])) { + $lang = sanitize_text_field($_REQUEST['lang']); + } else { + global $sitepress; + if (!empty($sitepress) && method_exists($sitepress, 'get_admin_language_cookie')) { + $lang = sanitize_text_field($sitepress->get_admin_language_cookie()); + } + } + + if (!empty($lang)) { + $own_revision_and = $wpdb->prepare( + " AND $p.comment_count IN (SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type LIKE 'post_%' AND language_code = %s)", + $lang + ); + } + } + + $own_revision_clause = $wpdb->prepare( + " OR ($p.post_status IN ('draft', 'pending') AND $p.post_mime_type IN ('$revision_status_csv') AND $p.post_author = %d {$own_revision_and})", + $current_user->ID + ); + } else { + $own_revision_clause = ''; + } + + if ((!$is_my_activity && !$is_count_query && (empty($args['revision_query']) || (!empty($_REQUEST['author']) && ($current_user->ID != $_REQUEST['author'])))) + || rvy_get_option('list_unsubmitted_revisions') + ) { + $revision_status_clause = ''; + + } elseif ((!$is_my_activity && !$is_count_query + && (empty($_REQUEST['all']) + && (empty($_REQUEST['post_status']) || ('draft-revision' != sanitize_key($_REQUEST['post_status']))) + )) || !empty($args['my_published_count'])) { + $revision_status_clause = "AND $p.post_mime_type != 'draft-revision' "; + + } elseif (($is_my_activity && !$is_count_query) || (rvy_get_option('manage_unsubmitted_capability') && !current_user_can("manage_unsubmitted_revisions"))) { + $revision_status_clause = "AND ($p.post_mime_type != 'draft-revision' OR $p.post_author = '$current_user->ID')"; + } else { + $revision_status_clause = ''; + } + + $where_append = "($p.comment_count IN ($id_subquery) {$revision_status_clause}$own_revision_clause)"; + + $status_csv = implode("','", array_map('sanitize_key', rvy_filtered_statuses())); + + $own_posts = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_status IN ('$status_csv') AND post_author = %d", + $current_user->ID + ) + ); + + if (rvy_get_option('admin_revisions_to_own_posts')) { + $own_posts = apply_filters('revisionary_own_post_ids', $own_posts, $current_user->ID); + } else { + $own_posts = []; + } + + $own_posts_csv = implode("','", array_map('intval', $own_posts)); + + if (rvy_get_option('revisor_hide_others_revisions') && !current_user_can('administrator') + && !current_user_can('list_others_revisions') && empty($args['suppress_author_clause']) + ) { + $allow_post_types = apply_filters('revisionary_queue_allow_post_types', []); + + $can_publish_types = []; + foreach(array_keys($revisionary->enabled_post_types) as $post_type) { + $type_obj = get_post_type_object($post_type); + + if ( + ( + !empty($allow_post_types[$post_type]) + || (isset($type_obj->cap->edit_published_posts) + && current_user_can($type_obj->cap->edit_published_posts) + && !empty($current_user->allcaps[$type_obj->cap->edit_others_posts]) + && current_user_can($type_obj->cap->publish_posts) + )) + && (!empty($revisionary->enabled_post_types[$post_type]) || !$revisionary->config_loaded) + ) { + $can_publish_types[]= $post_type; + } + } + + $can_publish_types = array_intersect($can_publish_types, apply_filters('revisionary_manageable_types', $can_publish_types)); + + if ($can_publish_types){ + $type_clause = "OR $p.post_type IN ('" . implode("','", array_map('sanitize_key', $can_publish_types)) . "')"; + } else { + $type_clause = ''; + } + + $where_append .= $wpdb->prepare(" AND (($p.post_author = %d $type_clause) OR ($p.comment_count IN ('$own_posts_csv') $type_clause))", $current_user->ID ); + + } elseif ($revisionary->config_loaded) { + $where_append .= (array_filter($revisionary->enabled_post_types)) + ? " AND ($p.post_type IN ('" + . implode("','", + array_map( + 'sanitize_key', + array_keys( + array_filter($revisionary->enabled_post_types) + ) + ) + ) . "'))" + + : " AND 1=2"; + } + + if (empty($args['suppress_author_clause'])) { + $status_csv = implode("','", array_map('sanitize_key', rvy_filtered_statuses())); + + $where_append .= " AND $p.comment_count IN (SELECT ID FROM $wpdb->posts WHERE post_status IN ('$status_csv'))"; + } + + $where .= " AND $where_append"; + + return $where; + } + + function revisions_filter($clauses, $_wp_query = false) { + $clauses['where'] = $this->revisions_where_filter($clauses['where'], ['revision_query' => true]); + $this->posts_clauses_filtered = $clauses; + return $clauses; + } + + function correctCommentCounts() { + global $wpdb; + + $revision_base_status_csv = implode("','", array_map('sanitize_key', rvy_revision_base_statuses())); + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + if ($revision_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_status IN ('$revision_base_status_csv') AND post_mime_type IN ('$revision_status_csv') AND comment_count = 0")) { + foreach($revision_ids as $revision_id) { + if ($main_post_id = get_post_meta($revision_id, '_rvy_base_post_id', true)) { + $wpdb->update($wpdb->posts, ['comment_count' => $main_post_id], ['ID' => $revision_id]); + } + } + } + } + + function rvy_pending_list_register_columns( $columns ) { + global $wp_query; + foreach( $wp_query->posts as $post ) { + if ( !empty($post) && is_object($post) && (('future-revision' == $post->post_mime_type && 'inherit' != $post->post_status) || (strtotime($post->post_date_gmt) > agp_time_gmt())) ) { + $have_scheduled = true; + break; + } + } + + $arr = [ + 'cb' => '', + 'title' => pp_revisions_label('queue_col_revision'), + 'post_status' => esc_html__('Status', 'revisionary'), + 'post_type' => esc_html__('Post Type', 'revisionary'), + 'author' => pp_revisions_label('queue_col_revised_by'), + 'date' => pp_revisions_label('queue_col_revision_date'), + ]; + + if (!empty($_REQUEST['cat'])) { + $arr['categories'] = get_taxonomy('category')->labels->name; + } + + if (! empty( $have_scheduled ) || (!empty($_REQUEST['orderby']) && 'date_sched' == $_REQUEST['orderby']) ) { + $arr['date_sched'] = esc_html__('Schedule'); + } + + $arr['published_post'] = pp_revisions_label('queue_col_published_post'); + + $arr['post_author'] = pp_revisions_label('queue_col_post_author'); + + return $arr; + } + + function rvy_pending_custom_col( $column_name, $post_id ) { + if ( ! $post = get_post( $post_id ) ) + return; + + $request_url = add_query_arg($_REQUEST,rvy_admin_url('admin.php?page=revisionary-q')); + + switch ($column_name) { + case 'post_type': + $post_type = get_post_field('post_type', $post_id); + + if ( $type_obj = get_post_type_object( $post_type ) ) { + $link = add_query_arg('post_type', $type_obj->name, $request_url); + echo "" . esc_html($type_obj->labels->singular_name) . ""; + } else { + echo esc_html("($post_type)"); + } + + break; + + case 'post_status': + if (rvy_is_revision_status($post->post_mime_type)) { + $label = pp_revisions_status_label($post->post_mime_type, 'short'); + } else { + $label = ucwords($post->post_mime_type); + } + + $link = add_query_arg('post_status', $post->post_mime_type, $request_url); + echo "" . esc_html($label) . ""; + + break; + + case 'date_sched' : + if ( ('future-revision' === $post->post_mime_type ) || ( strtotime($post->post_date_gmt) > agp_time_gmt() ) ) { + $t_time = get_the_time( esc_html__( 'Y/m/d g:i:s a', 'revisionary' ) ); + $m_time = $post->post_date; + + $time = get_post_time( 'G', true, $post ); + + $time_diff = time() - $time; + + if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) { + $h_time = sprintf( esc_html__( '%s ago' ), human_time_diff( $time ) ); + } else { + $h_time = mysql2date( esc_html__( 'Y/m/d g:i a', 'revisionary' ), get_date_from_gmt($post->post_date_gmt) ); + $h_time = str_replace( ' am', ' am', $h_time ); + $h_time = str_replace( ' pm', ' pm', $h_time ); + $h_time = str_replace( ' ', '
', $h_time ); + } + + if ('future-revision' == $post->post_mime_type) { + $t_time = sprintf(esc_html__('Scheduled publication: %s', 'revisionary'), $t_time); + } else { + $h_time = "[$h_time]"; + $t_time = sprintf(esc_html__('Requested publication: %s', 'revisionary'), $t_time); + } + + if ( $time_diff > 0 ) { + echo '' . esc_html__( 'Missed schedule' ) . ''; + echo '
'; + } + + /** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */ + $mode = 'list'; + echo '' . apply_filters( 'rvy_post_schedule_date_column_time', $h_time, $post, 'date', $mode ) . ''; + } + + break; + + case 'published_post': + if ($parent_post = get_post($post->comment_count)) { + self::column_title($parent_post, true); + + } elseif ($published_id = rvy_post_id($post->ID)) { + if ($parent_post = get_post($published_id)) { + self::column_title($parent_post, true); + } else { + echo esc_html($published_id); + } + } + + $this->handle_published_row_actions( $parent_post, 'published_post' ); + + break; + + case 'post_author': + $parent_post = get_post(rvy_post_id($post->ID)); + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + $authors = get_multiple_authors($parent_post->ID); + $authors_str = []; + foreach ($authors as $author) { + if (is_object($author)) { + $url = add_query_arg('post_author', $author->ID, $request_url); + $authors_str[] = '' . esc_html($author->display_name) . ''; + } + } + + if (empty($authors_str)) { + $authors_str[] = '' . esc_html__('No author', + 'revisionary') . ''; + } + + echo implode(', ', $authors_str); // output variables escaped above + } else { + $author_caption = get_the_author_meta('display_name', $parent_post->post_author); + $this->apply_edit_link(add_query_arg('post_author', $parent_post->post_author, $request_url), $author_caption); + } + } // end switch + } + + protected function handle_published_row_actions( $post, $column_name ) { + $post_type_object = get_post_type_object( $post->post_type ); + $can_edit_post = current_user_can( 'edit_post', $post->ID ); + $actions = []; + + static $last_past_revision; + + if(!isset($last_past_revision)) { + $last_past_revision = []; + } + + if ( $can_edit_post && 'trash' != $post->post_status ) { + if ($edit_link = get_edit_post_link( $post->ID )) { + $actions['edit'] = sprintf( + '%3$s', + $edit_link, + /* translators: %s: post title */ + esc_attr('Edit published post'), + esc_html__( 'Edit' ) + ); + } + } + + $request_url = add_query_arg($_REQUEST, rvy_admin_url('admin.php?page=revisionary-q')); + + $actions['list_filter'] = sprintf( + '%3$s', + + add_query_arg('published_post', $post->ID, $request_url), + /* translators: %s: post title */ + esc_attr( sprintf( esc_html__( 'View only revisions of %s', 'revisionary' ), '“' . $post->post_title . '”' ) ), + esc_html__( 'Filter' ) + ); + + if ( is_post_type_viewable( $post_type_object ) ) { + $status_obj = get_post_status_object($post->post_status); + + if (!empty($status_obj->public) || !empty($status_obj->private)) { + $actions['view'] = sprintf( + '%3$s', + get_permalink( $post->ID ), + /* translators: %s: post title */ + esc_attr( esc_html__( 'View published post', 'revisionary' ) ), + esc_html__( 'View' ) + ); + } else { + $actions['view'] = sprintf( + '%3$s', + get_preview_post_link( $post->ID ), + /* translators: %s: post title */ + esc_attr( esc_html__( 'View published post', 'revisionary' ) ), + esc_html__( 'Preview' ) + ); + } + } + + // todo: single query for all listed published posts + if (!isset($last_past_revision[$post->ID])) { + global $wpdb; + if ($revision_id = $wpdb->get_var( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_type='revision' AND post_status='inherit' AND post_parent = %d ORDER BY ID DESC LIMIT 1", + $post->ID + ) + )) { + $last_past_revision[$post->ID] = $revision_id; + } + } + + if (!empty($last_past_revision[$post->ID])) { + $actions['history'] = sprintf( + '%3$s', + admin_url("revision.php?revision={$last_past_revision[$post->ID]}"), + /* translators: %s: post title */ + esc_attr(esc_html__('Compare Past Revisions', 'revisionary')), + esc_html__( 'History', 'revisionary' ) + ); + } + + $action_count = count( $actions ); + + if ( ! $action_count ) { + return; + } + + $mode = get_user_setting( 'posts_list_mode', 'list' ); + + $visible = ( 'excerpt' === $mode ) ? ' visible' : ''; + + echo '
'; + + $i = 0; + + foreach ( $actions as $action => $link ) { + ++$i; + + $sep = ( $i < $action_count ) ? ' | ' : ''; + + echo "" . "$link$sep" . ""; + } + + echo '
'; + + echo ''; + } + + /** + * + * @return bool + */ + public function ajax_user_can() { + return false; + } + + /** + * + * @global array $avail_post_stati + * @global WP_Query $wp_query + * @global int $per_page + * @global string $mode + */ + public function prepare_items() { + global $avail_post_stati, $wp_query, $per_page, $mode; + + // is going to call wp() + $avail_post_stati = $this->do_query(); + + $per_page = $this->get_items_per_page( 'revisions_per_page' ); + + $total_items = $wp_query->found_posts; + + $this->set_pagination_args( [ + 'total_items' => $total_items, + 'per_page' => $per_page + ]); + + if (empty($_REQUEST['all']) && empty($_REQUEST['author']) && empty($_REQUEST['post_author']) && empty($_REQUEST['post_status'])) :?> + + labels->not_found_in_trash); + else + echo esc_html(get_post_type_object( $post_type )->labels->not_found); + } + + /** + * Determine if the current view is the "All" view. + * + * @since 4.2.0 + * + * @return bool Whether the current view is the "All" view. + */ + protected function is_base_request() { + $vars = $_GET; + unset( $vars['paged'] ); + + if ( empty( $vars ) ) { + return true; + } + + return 1 === count( $vars ) && ! empty( $vars['mode'] ); + } + + private function count_revisions($post_type = '', $statuses = '' ) { + global $wpdb; + + $status_csv = implode("','", array_map('sanitize_key', (array) $statuses)); + + if ($post_type) { + $type_clause = "AND post_type IN ('" + . implode("','", array_map('sanitize_key', (array) $post_type)) + . "')"; + } + + $where = $this->revisions_where_filter("post_mime_type IN ('$status_csv') AND post_status != 'trash' $type_clause", ['status_count' => true]); + + $query = "SELECT post_mime_type, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE $where"; + $query .= ' GROUP BY post_mime_type'; + + // todo: Permissions filter + //$query = apply_filters('presspermit_posts_request', $query, ['has_cap_check' => true]); + + $results = (array) $wpdb->get_results( $query, ARRAY_A ); + + $counts = []; + + foreach ( $results as $row ) { + $counts[ $row['post_mime_type'] ] = $row['num_posts']; + } + + if (!rvy_get_option('pending_revisions')) { + unset($counts['draft-revision']); + unset($counts['pending-revision']); + } + + if (!rvy_get_option('scheduled_revisions')) { + unset($counts['future-revision']); + } + + $counts = (object) $counts; + + return apply_filters( 'revisionary_count_revisions', $counts, $post_type, $statuses ); + } + + /** + * + * @return array + */ + protected function get_views() { + global $wp_query, $wpdb, $current_user; + + $post_types = rvy_get_manageable_types(); + $revision_statuses = rvy_revision_statuses(); + + $num_posts = $this->count_revisions($post_types, $revision_statuses); + + $links = []; + + $links[''] = ''; + $links['all'] = ''; + + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + $where = $this->revisions_where_filter( + $wpdb->prepare( + "$wpdb->posts.post_mime_type IN ('$revision_status_csv') AND $wpdb->posts.post_status IN ('draft', 'pending', 'future') AND $wpdb->posts.post_author = '%d'", + $current_user->ID + ), + ['status_count' => true] + ); + + $_request = apply_filters('presspermit_posts_request', + "SELECT COUNT($wpdb->posts.ID) FROM $wpdb->posts WHERE $where", + ['has_cap_check' => true] + ); + + if ($my_count = $wpdb->get_var($_request)) { + if (!empty($_REQUEST['author']) && ($current_user->ID == $_REQUEST['author']) && empty($_REQUEST['post_type']) && empty($_REQUEST['post_author']) && empty($_REQUEST['published_post']) && empty($_REQUEST['post_status'])) { + $current_link_class = 'mine'; + $link_class = " class='current'"; + } else { + $link_class = ''; + } + + $links['mine'] = sprintf( + translate_nooped_plural(pp_revisions_label('my_revisions'), $my_count), + "", '', "$my_count" + ) .' '; + } + + $where = $this->revisions_where_filter( + $wpdb->prepare( + "r.post_mime_type IN ('$revision_status_csv') AND p.post_author = '%d'", + $current_user->ID + ), + ['alias' => 'r', 'status_count' => true, 'my_published_count' => true] + ); + + $count_query = apply_filters('presspermit_posts_request', + "SELECT COUNT(r.ID) FROM $wpdb->posts AS p INNER JOIN $wpdb->posts AS r ON r.comment_count = p.ID WHERE $where", + ['has_cap_check' => true, 'source_alias' => 'p'] + ); + + $status_csv = implode("','", array_map('sanitize_key', rvy_filtered_statuses())); + $count_query .= " AND p.post_status IN ('$status_csv') AND r.post_status != 'trash'"; + + // work around some versions of PressPermit inserting non-aliased post_type reference into where clause under some configurations + $count_query = str_replace("$wpdb->posts.post_type ", "p.post_type ", $count_query); + + if ($my_post_count = $wpdb->get_var( + $count_query + )) { + if (!empty($_REQUEST['post_author']) && ($current_user->ID == $_REQUEST['post_author']) && empty($_REQUEST['post_type']) && empty($_REQUEST['author']) && empty($_REQUEST['published_post']) && empty($_REQUEST['post_status'])) { + $current_link_class = 'my_posts'; + $link_class = " class='current'"; + } else { + $link_class = ''; + } + + $links['my_posts'] = sprintf( + translate_nooped_plural(pp_revisions_label('my_published_posts'), $my_post_count), + "", '', "$my_post_count" + ) . ' '; + } + + $all_count = 0; + foreach($revision_statuses as $status) { + if (!isset($num_posts->$status)) { + $num_posts->$status = 0; + } + + if (!empty($num_posts->$status)) { + $status_obj = get_post_status_object($status); + + $status_label = $status_obj ? sprintf( + translate_nooped_plural( $status_obj->label_count, $num_posts->$status ), + number_format_i18n( $num_posts->$status ) + ) : $status; + + if (!empty($_REQUEST['post_status']) && ($status == sanitize_key($_REQUEST['post_status'])) && empty($_REQUEST['post_type']) && empty($_REQUEST['author']) && empty($_REQUEST['post_author']) && empty($_REQUEST['published_post'])) { + $current_link_class = $status; + $link_class = " class='current'"; + } else { + $link_class = ''; + } + $links[$status] = "$status_label"; + + $all_count += $num_posts->$status; + } + } + + if (empty($current_link_class) && empty($_REQUEST['post_type']) && empty($_REQUEST['author']) && empty($_REQUEST['post_author']) && empty($_REQUEST['published_post']) && empty($_REQUEST['post_status']) && empty($_REQUEST['all'])) { + $link_class = " class='current'"; + } else { + $link_class = ''; + } + + $links[''] = "" . sprintf( esc_html__('My Activity', 'revisionary'), "($all_count)" ) . ''; + + if (empty($current_link_class) && empty($_REQUEST['post_type']) && empty($_REQUEST['author']) && empty($_REQUEST['post_author']) && empty($_REQUEST['published_post']) && empty($_REQUEST['post_status']) && !empty($_REQUEST['all'])) { + $link_class = " class='current'"; + } else { + $link_class = ''; + } + + $links['all'] = "" . sprintf( esc_html__('All %s', 'revisionary'), "($all_count)" ) . ''; + + return $links; + } + + /** + * + * @return array + */ + protected function get_bulk_actions() { + global $current_user; + + $actions = array(); + + $approval_potential = false; + + foreach(rvy_get_manageable_types() as $post_type) { + $type_obj = get_post_type_object($post_type); + if (isset($type_obj->cap->edit_published_posts) && !empty($current_user->allcaps[$type_obj->cap->edit_published_posts])) { + $approval_potential = true; + break; + } + } + + $actions['submit_revision'] = esc_html__('Submit'); + + if ($approval_potential = apply_filters('revisionary_bulk_action_approval', $approval_potential)) { + $actions['approve_revision'] = esc_html__('Approve'); + $actions['decline_revision'] = esc_html__('Decline'); + $actions['publish_revision'] = esc_html__('Publish'); + + if (rvy_get_option('scheduled_revisions')) { + $actions['unschedule_revision'] = esc_html__('Unschedule', 'revisionary'); + } + } + + $actions['delete'] = (defined('RVY_DISCARD_CAPTION')) ? esc_html__( 'Discard Revision', 'revisionary' ) : esc_html__( 'Delete Revision', 'revisionary' ); + + return $actions; + } + + protected function categories_dropdown( $post_type ) { + if ( false !== apply_filters( 'disable_categories_dropdown', false, $post_type ) ) { + return; + } + + $cat = (!empty($_REQUEST['cat'])) ? (int) $_REQUEST['cat'] : ''; + + $dropdown_options = array( + 'show_option_all' => get_taxonomy( 'category' )->labels->all_items, + 'hide_empty' => 0, + 'hierarchical' => 1, + 'show_count' => 0, + 'orderby' => 'name', + 'selected' => $cat + ); + + echo ''; + wp_dropdown_categories( $dropdown_options ); + } + + + protected function extra_tablenav( $which ) { +?> +
+
+ 'title', + 'post_status' => 'post_status', + 'post_type' => 'post_type', + 'author' => 'author', + 'date' => array( 'modified', true ), + 'date_sched' => array( 'date_sched', true ), + 'published_post' => 'published_post', + 'post_author' => 'post_author', + ]; + } + + // Overriding parent class method here to make column sort link double as filter clearance (todo: jQuery?) + public function print_column_headers( $with_id = true ) { + list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); + + if (!empty($_SERVER['REQUEST_URI']) && !empty($_SERVER['HTTP_HOST'])) { + $current_url = set_url_scheme( esc_url(esc_url_raw($_SERVER['HTTP_HOST']) . esc_url_raw($_SERVER['REQUEST_URI']) )); + $current_url = remove_query_arg( 'paged', $current_url ); + } else { + $current_url = ''; + } + + if ( isset( $_GET['orderby'] ) ) { + $current_orderby = sanitize_key($_GET['orderby']); + } else { + $current_orderby = ''; + } + + if ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) { + $current_order = 'desc'; + } else { + $current_order = 'asc'; + } + + if ( ! empty( $columns['cb'] ) ) { + static $cb_counter = 1; + $columns['cb'] = '' + . ''; + $cb_counter++; + } + + foreach ( $columns as $column_key => $column_display_name ) { + $class = array( 'manage-column', "column-$column_key" ); + + if ( in_array( $column_key, $hidden ) ) { + $class[] = 'hidden'; + } + + if ( 'cb' === $column_key ) { + $class[] = 'check-column'; + } elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) ) { + $class[] = 'num'; + } + + if ( $column_key === $primary ) { + $class[] = 'column-primary'; + } + + if ( isset( $sortable[ $column_key ] ) ) { + list( $orderby, $desc_first ) = $sortable[ $column_key ]; + + if ( $current_orderby === $orderby ) { + $order = 'asc' === $current_order ? 'desc' : 'asc'; + $class[] = 'sorted'; + $class[] = $current_order; + } else { + $order = $desc_first ? 'desc' : 'asc'; + $class[] = 'sortable'; + $class[] = $desc_first ? 'asc' : 'desc'; + } + } + + $tag = ( 'cb' === $column_key ) ? 'td' : 'th'; + $scope = ( 'th' === $tag ) ? 'col' : ''; + $id = $with_id ? $column_key : ''; + + if ( ! empty( $class ) ) { + $class = join( ' ', $class ); + } + + echo "<" . esc_attr($tag) . " scope='" . esc_attr($scope) . "' id='" . esc_attr($id) . "' class='" . esc_attr($class) . "'>"; + + $current_url = str_replace('#038;', '&', $current_url); + $current_url = remove_query_arg('orderby', $current_url); + $current_url = remove_query_arg('order', $current_url); + + if ( isset( $sortable[ $column_key ] ) ) { + // kevinB modification: make column sort links double as filter clearance + // (If results are already filtered by column, first header click clears the filter, second click applies sorting) + if (!empty($_REQUEST[$column_key])) { + + // use post status and post type column headers to reset filter, but not for sorting + $_url = remove_query_arg($orderby, $current_url); + + echo '' . esc_html($column_display_name) . ''; + } else { + if (!empty($_REQUEST['orderby']) && ($column_key == $_REQUEST['orderby'])) { + echo '' . esc_html($column_display_name) . ''; + } else { + echo '' . esc_html($column_display_name) . ''; + } + } + } else { + echo $column_display_name; + } + + echo ""; + } + } + + public function column_title( $post, $simple_link = false ) { + $can_edit_post = current_user_can( 'edit_post', $post->ID) || $simple_link; + + echo ""; + + $title = _draft_or_post_title($post); + + if ( $can_edit_post && $post->post_status != 'trash' && $edit_link = get_edit_post_link( $post->ID )) { + printf( + '%s%s', + $edit_link, + /* translators: %s: post title */ + esc_attr( sprintf( esc_html__( '“%s” (Edit)' ), $title ) ), + '', + esc_attr($title) + ); + } else { + echo esc_html($title); + } + + echo "\n"; + } + + public function column_date( $post ) { + $t_time = get_the_modified_time( esc_html__( 'Y/m/d g:i:s a', 'revisionary' ), $post ); + $time = strtotime($post->post_modified_gmt); + $time_diff = time() - $time; + + if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) { + $h_time = sprintf( esc_html__( '%s ago' ), human_time_diff( $time ) ); + $h_time = str_replace( ' ', ' ', $h_time ); + } else { + $h_time = mysql2date( esc_html__( 'Y/m/d g:i a', 'revisionary' ), $t_time ); + $h_time = str_replace( ' am', ' am', $h_time ); + $h_time = str_replace( ' pm', ' pm', $h_time ); + $h_time = str_replace( ' ', '
', $h_time ); + } + + echo '' . apply_filters( 'post_date_column_time', $h_time, $post, 'date' ) . ''; + } + + protected function apply_edit_link( $url, $label ) { + printf( + '%s', + esc_url( $url ), + esc_html($label) + ); + } + + public function column_author( $post ) { + // Just track single post_author for revision. Authors taxonomy is applied to revise + + $request_url = add_query_arg($_REQUEST, rvy_admin_url('admin.php?page=revisionary-q')); + + $args = ['author' => get_the_author_meta( 'ID' )]; + $this->apply_edit_link( add_query_arg('author', $args['author'], $request_url), get_the_author() ); + } + + /** + * Generates and displays row action links. + * + * @since 4.3.0 + * @access protected + * + * @param object $post Post being acted upon. + * @param string $column_name Current column name. + * @param string $primary Primary column name. + * @return string Row actions output for posts. + */ + + protected function handle_row_actions( $post, $column_name, $primary ) { + if ( $primary !== $column_name ) { + return ''; + } + + $post_type_object = get_post_type_object( $post->post_type ); + + $can_read_post = current_user_can('read_post', $post->ID); + + $can_edit_post = current_user_can( 'edit_post', $post->ID ); + + $can_read_post = $can_read_post || $can_edit_post; // @todo + + $actions = array(); + $title = _draft_or_post_title(); + + if ( $can_edit_post && 'trash' != $post->post_status ) { + if ($edit_link = get_edit_post_link( $post->ID )) { + $actions['edit'] = sprintf( + '%3$s', + get_edit_post_link( $post->ID ), + /* translators: %s: post title */ + esc_attr('Edit Revision'), + esc_html__( 'Edit' ) + ); + } + + $main_post_id = rvy_post_id($post->ID); + + if ($main_post_id && in_array($post->post_status, ['draft', 'pending']) && current_user_can('copy_post', $main_post_id)) { + $redirect_arg = ( ! empty($_REQUEST['rvy_redirect']) ) ? "&rvy_redirect=" . esc_url_raw($_REQUEST['rvy_redirect']) : ''; + $url = rvy_admin_url("admin.php?page=rvy-revisions&post={$post->ID}&action=revise$redirect_arg"); + $actions['copy_revision'] = "" . esc_html__('Copy') . ''; + } + } + + if ( current_user_can( 'delete_post', $post->ID ) ) { + if ($delete_link = get_delete_post_link( $post->ID, '', true )) { + if (defined('RVY_DISCARD_CAPTION')) { + $actions['delete'] = sprintf( + '%3$s', + $delete_link, + /* translators: %s: post title */ + esc_attr( sprintf( esc_html__( 'Discard Revision', 'revisionary' ), $title ) ), + esc_html__( 'Discard' ) + ); + } else { + $delete_caption = (defined('RVY_DISCARD_CAPTION')) ? esc_html__( 'Discard Revision', 'revisionary-pro' ) : esc_html__( 'Delete Revision', 'revisionary' ); + + $actions['delete'] = sprintf( + '%3$s', + $delete_link, + /* translators: %s: post title */ + esc_attr( sprintf( $delete_caption, $title ) ), + esc_html__( 'Delete' ) + ); + } + } + } + + if ( is_post_type_viewable( $post_type_object ) ) { + if ($can_read_post && $post_type_object && !empty($post_type_object->public)) { + if (rvy_get_option('revision_preview_links') || current_user_can('administrator') || is_super_admin()) { + do_action('pp_revisions_get_post_link', $post->ID); + + $preview_link = rvy_preview_url($post); + + $preview_link = remove_query_arg( 'preview_id', $preview_link ); + $actions['view'] = sprintf( + '%3$s', + esc_url( $preview_link ), + /* translators: %s: post title */ + esc_attr( esc_html__( 'Preview Revision', 'revisionary' ) ), + esc_html__( 'Preview' ) + ); + + do_action('pp_revisions_post_link_done', $post->ID); + } + } + } + + // todo: make this work for Author with Revision exceptions + if ( $can_read_post || $can_edit_post ) { + $actions['diff'] = sprintf( + '%3$s', + admin_url("revision.php?revision=$post->ID"), + /* translators: %s: post title */ + esc_attr( sprintf( esc_html__('Compare Changes', 'revisionary'), $title ) ), + _x('Compare', 'revisions', 'revisionary') + ); + } + + if ($can_edit_post && ('pending-revision' == $post->post_mime_type)) { + $actions['decline'] = sprintf( + '%2$s', + wp_nonce_url(admin_url("post.php?post=$post->ID&action=decline_revision"), 'decline-revision'), + _x( 'Decline', 'revisions', 'revisionary' ) + ); + } + + $actions = apply_filters('revisionary_queue_row_actions', $actions, $post); + + return $this->row_actions( $actions ); + } + + // override default nonce field + protected function display_tablenav( $which ) { + if ( 'top' === $which ) { + wp_nonce_field( 'bulk-revision-queue' ); + } + ?> +
+ + has_items() ) : ?> +
+ bulk_actions( $which ); ?> +
+ extra_tablenav( $which ); + + if (!empty($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI'] = str_replace('#038;', '&', esc_url_raw($_SERVER['REQUEST_URI'])); + } + + $this->pagination( $which ); + ?> + +
+
+ + + post_type)) ? $post->post_type : awp_post_type_from_uri(); + + $unrevisable_css_ids = apply_filters('rvy_hidden_meta_boxes', ['authordiv', 'visibility']); + + if (rvy_in_revision_workflow($post)) { + $unrevisable_css_ids = array_merge($unrevisable_css_ids, ['publish', 'slugdiv', 'edit-slug-box']); + } + + echo( "\n\n"; + + // display the current status, but hide edit link + echo "\n\n"; // this line adapted from Clutter Free plugin by Mark Jaquith + } + } + + public function fltEditorUIstatus($status, $post, $args) { + if (rvy_in_revision_workflow($post)) { + $status = $post->post_mime_type; + } + + return $status; + } + + public function fltImmediateCaption($caption, $post) { + if (rvy_in_revision_workflow($post)) { + $caption = esc_html__('Publish on approval', 'revisionary'); + } + + return $caption; + } + + public function post_submit_meta_box($post, $args = []) + { + if (rvy_is_revision_status($post->post_mime_type)) { + require_once(dirname(__FILE__) . '/RevisionEditSubmitMetabox.php'); + RvyRevisionEditSubmitMetabox::post_submit_meta_box($post, $args); + } + } + + public function act_replace_publish_metabox($post_type, $post) + { + global $wp_meta_boxes; + + if ('attachment' != $post_type) { + if (!empty($wp_meta_boxes[$post_type]['side']['core']['submitdiv'])) { + $wp_meta_boxes[$post_type]['side']['core']['submitdiv']['callback'] = [$this, 'post_submit_meta_box']; + } + } + } + + public function actSubmitMetaboxActions() { + global $post; + + $compare_link = rvy_admin_url("revision.php?revision=$post->ID"); + $compare_button = _x('Compare', 'revisions', 'revisionary'); + $compare_title = esc_html__('Compare this revision to published copy, or to other revisions', 'revisionary'); + ?> + + + ", ''); + } else { + $preview_msg = esc_html__('Revision updated.', 'revisionary'); + } + + $messages['post'][1] = $preview_msg; + $messages['page'][1] = $preview_msg; + $messages[$post->post_type][1] = $preview_msg; + + return $messages; + } +} diff --git a/wp-content/plugins/revisionary/admin/edit-revision-ui_rvy.php b/wp-content/plugins/revisionary/admin/edit-revision-ui_rvy.php new file mode 100644 index 000000000..c0df44978 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/edit-revision-ui_rvy.php @@ -0,0 +1,84 @@ + + + + + + + $property_name ) ) { + echo esc_html($this->$property_name); + + } elseif ( ! empty( $_GET['post'] ) ) { + $args = array( 'format' => 'list', 'parent' => false ); + rvy_list_post_revisions( (int) $_GET['post'], $status, $args ); + } + } + + function rvy_metabox_revisions_pending() { + self::rvy_metabox_revisions( 'pending-revision' ); + } + + function rvy_metabox_revisions_future() { + self::rvy_metabox_revisions( 'future-revision' ); + } + + function act_tweak_metaboxes() { + static $been_here; + + if ( isset($been_here) ) + return; + + $been_here = true; + + global $wp_meta_boxes; + + if ( empty($wp_meta_boxes) ) + return; + + $object_type = awp_post_type_from_uri(); + + if ( empty($wp_meta_boxes[$object_type]) ) + return; + + $object_id = rvy_detect_post_id(); + + // This block will be moved to separate class + foreach ( $wp_meta_boxes[$object_type] as $context => $priorities ) { + foreach ( $priorities as $priority => $boxes ) { + foreach ( array_keys($boxes) as $box_id ) { + // Remove Scheduled / Pending Revisions metabox if none will be listed + // If a listing does exist, buffer it for subsequent display + if ( 'pending_revisions' == $box_id ) { + if ( ! $object_id || ! $this->pending_revisions = rvy_list_post_revisions( $object_id, 'pending-revision', array( 'format' => 'list', 'parent' => false, 'echo' => false ) ) ) + unset( $wp_meta_boxes[$object_type][$context][$priority][$box_id] ); + + } elseif ( 'future_revisions' == $box_id ) { + if ( ! $object_id || ! $this->future_revisions = rvy_list_post_revisions( $object_id, 'future-revision', array( 'format' => 'list', 'parent' => false, 'echo' => false ) ) ) + unset( $wp_meta_boxes[$object_type][$context][$priority][$box_id] ); + } + } + } + } + } + + public function fltDisableExceptionUI($disable, $src_name, $post_id, $post_type = '') { + if (!$post_id) { + // Permissions version < 3.1.4 always passes zero value $post_id + $post_id = rvy_detect_post_id(); + } + + if ($post_id && rvy_in_revision_workflow($post_id)) { + return true; + } + + return $disable; + } + + function actAdminBarPreventPostClobber() { + global $post; + + // prevent PHP Notice from Multiple Authors code: + // Notice: Trying to get property of non-object in F:\www\wp50\wp-content\plugins\publishpress-multiple-authors\core\Classes\Utils.php on line 309 + // @todo: address within MA + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION') && !empty($_REQUEST['post'])) { + $post = get_post((int) $_REQUEST['post']); + } + } + +} // end class diff --git a/wp-content/plugins/revisionary/admin/history_rvy.php b/wp-content/plugins/revisionary/admin/history_rvy.php new file mode 100644 index 000000000..8d0d4dc12 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/history_rvy.php @@ -0,0 +1,1231 @@ +revision_status = ['draft-revision', 'pending-revision']; + + add_action('load-revision.php', [$this, 'actLoadRevision']); + + add_action('admin_enqueue_scripts', [$this, 'actEnqueueScripts'], 10, 1); + add_action('admin_head', [$this,'actRevisionDiffScripts']); + add_action('admin_head', [$this, 'actPastRevisionDiffScripts'], 10, 1); + add_action('admin_print_scripts', [$this, 'actCompareRevisionsTweakUI']); + add_filter('wp_prepare_revision_for_js', [$this, 'fltPrepareRevisionsForJS'], 10, 3); + + add_filter('wp_get_revision_ui_diff', [$this, 'fltGetRevisionUIDiff'], 10, 3); + add_action('wp_ajax_get-revision-diffs', [$this, 'actAjaxRevisionDiffs'], 1); + + add_action('parse_query', [$this, 'actDisableProblemQueries'], 5); + + // Thin Out Revisions plugin breaks View / Approve button on Compare Pending Revisions screen + if (class_exists('HM_TOR_Plugin_Loader')) { + global $hm_tor_plugin_loader; + if (!empty($hm_tor_plugin_loader)) { + remove_action( 'admin_enqueue_scripts', array( $hm_tor_plugin_loader, 'admin_enqueue_scripts' ), 20 ); + } + } + + if (did_action('load-revision.php')) { + $this->actLoadRevision(); + } + } + + function actCompareRevisionsTweakUI() { + global $revisionary; + + if (!empty($_REQUEST['revision'])) { + $revision_id = (int) $_REQUEST['revision']; + } elseif (isset($_REQUEST['to'])) { + $revision_id = (int) $_REQUEST['to']; + } else { + return; + } + + // Hide Restore button if user does not have permission + if ($_post = get_post($revision_id)) { + if (!rvy_in_revision_workflow($_post)) { + $parent_post = get_post($_post->post_parent); + + if (($parent_post && !$revisionary->canEditPost($parent_post)) + || (rvy_get_option('revision_restore_require_cap') && !current_user_can('administrator') && !is_super_admin() && !current_user_can('restore_revisions')) + ) : + ?> + + set('tribe_suppress_query_filters', true); + } + + public function actLoadRevision() { + global $wpdb, $post; + + if (!empty($_REQUEST['revision']) && is_scalar($_REQUEST['revision']) && !empty($_REQUEST['post_id']) && !is_numeric($_REQUEST['revision']) && rvy_is_revision_status(sanitize_key($_REQUEST['revision']))) { + $revision_status = sanitize_key($_REQUEST['revision']); + + $orderby = ('future-revision' == $revision_status) ? 'post_date' : 'ID'; + $order = ('future-revision' == $revision_status) ? 'DESC' : 'ASC'; + + $_revisions = rvy_get_post_revisions(intval($_REQUEST['post_id']), $revision_status, ['orderby' => $orderby, 'order' => $order]); + $revision_id = ($revision = array_pop($_revisions)) ? $revision->ID : 0; + + $_REQUEST['revision'] = $revision_id; + } else { + $revision_id = (isset($_REQUEST['revision'])) ? (int) $_REQUEST['revision'] : ''; + } + + $from = (isset($_REQUEST['from'])) ? (int) $_REQUEST['from'] : ''; + $to = (isset($_REQUEST['to'])) ? (int) $_REQUEST['to'] : ''; + + $from = is_numeric( $from ) ? absint( $from ) : null; + if ( ! $revision_id ) { + $revision_id = absint( $to ); + } + + $this->revision_id = $revision_id; + + $redirect = 'edit.php'; + + if (empty($action)) { + $action = ''; + } + + switch ( $action ) { + case 'view': + case 'edit': + default: + if ( ! $revision = wp_get_post_revision( $revision_id ) ) { + if (!$revision = get_post($revision_id)) { + return; + } + } + + // global variable used by WP core + $post = $revision; + + if (rvy_in_revision_workflow($revision)) { + if ( ! $published_post = get_post( rvy_post_id($revision->ID) ) ) { + return; + } + } else { + if ($from && $from_revision = get_post($from)) { + if (rvy_in_revision_workflow($from_revision)) { + $_revision_id = $revision_id; // @todo: eliminate this? + $revision = $from_revision; + $revision_id = $from; + + if ( ! $published_post = get_post( rvy_post_id($revision->ID) ) ) { + return; + } + } + } + } + + if (!rvy_in_revision_workflow($revision)) { + return; + } + + if (!$published_post && !rvy_in_revision_workflow($from_revision)) { + if (!$published_post = get_post($revision->post_parent)) { + return; + } + } + + if ((!current_user_can('read_post', $revision->ID) && !current_user_can('edit_post', $revision->ID))) { + return; + } + + // Revisions disabled and we're not looking at an autosave + if ( apply_filters('revisionary_revisions_disabled', false, $revision) && ! wp_is_post_autosave( $revision ) ) { + return; + } + + $this->revision_status = $revision->post_mime_type; + + $status_obj = get_post_status_object($revision->post_mime_type); + + $post_edit_link = get_edit_post_link($published_post); + $post_title = '' . _draft_or_post_title($published_post) . ''; + /* translators: %s: post title */ + $do_h1 = true; + $title = $status_obj->labels->plural; + + $redirect = false; + break; + } + + do_action('rvy_compare_revisions'); + + require ABSPATH . 'wp-admin/includes/revision.php'; + + // This is so that the correct "Edit" menu item is selected. + if ( ! empty( $published_post->post_type ) && 'post' != $published_post->post_type ) { + $parent_file = $submenu_file = 'edit.php?post_type=' . $published_post->post_type; + } else { + $parent_file = $submenu_file = 'edit.php'; + } + + wp_enqueue_script( 'revisions' ); + + $this->actEnqueueScripts(); + + require_once( ABSPATH . 'wp-admin/admin-header.php' ); + + ?> + +
+

labels->plural, $post_title ); + } + ?> +

+ ' . esc_html__( 'Return to editor' ) . ''; + } + ?> +
+ published_post_ids = [$post->ID]; + + $q = []; + $q['post_type'] = $post->post_type; + $q['orderby'] = 'id'; // 'modified'; + $q['order'] = 'ASC'; + $q['post_mime_type'] = ('future-revision' == $this->revision_status) ? $this->revision_status : array_diff(rvy_revision_statuses(), ['future-revision']); + $q['posts_per_page'] = 99; + $q['is_revisions_query'] = true; + + $q = apply_filters('revisionary_compare_vars', $q); + + add_filter('posts_clauses', [$this, 'fltRevisionClauses'], 5, 2); + + add_filter('posts_where', [$this, 'fltFixMimeTypeClause']); + $rvy_query = new WP_Query($q); + remove_filter('posts_where', [$this, 'fltFixMimeTypeClause']); + + remove_filter('posts_clauses', [$this, 'fltRevisionClauses'], 5, 2); + + $posts = []; + + // key by ID for js array prep + foreach($rvy_query->posts as $_post) { + $posts[$_post->ID] = $_post; + } + + return $posts; + } + + public function actEnqueueScripts($hook_suffix='') { + if (!did_action('rvy_compare_revisions')) { + return; + } + + $revision_id = (isset($_REQUEST['revision'])) ? absint($_REQUEST['revision']) : ''; + $from = (isset($_REQUEST['from'])) ? (int) $_REQUEST['from'] : ''; + $to = (isset($_REQUEST['to'])) ? (int) $_REQUEST['to'] : ''; + + $from = is_numeric( $from ) ? absint( $from ) : null; + if ( ! $revision_id ) { + $revision_id = absint( $to ); + } + + if ( !$revision = wp_get_post_revision( $revision_id ) ) { + if (!$revision = get_post($revision_id)) { + return; + } + } + + $post_id = (rvy_in_revision_workflow($revision)) ? rvy_post_id($revision->ID) : $revision->post_parent; + + if (!$post = get_post($post_id)) { + return; + } + + if (!$from) { + $from = $post->ID; + } + + $rvy_revisions = $this->queryRevisions($post); + + $revisions = $this->prepare_revisions_for_js( $post, $revision_id, $from, $rvy_revisions ); + + add_filter('posts_clauses', [$this, 'fltRevisionClauses'], 5, 2); + + wp_localize_script( 'revisions', '_wpRevisionsSettings', $revisions ); + } + + public function fltRevisionQueryWhere($where, $args = []) { + global $wpdb; + + $p = (!empty($args['alias'])) ? sanitize_text_field($args['alias']) : $wpdb->posts; + + $post_id_csv = implode("','", array_map('intval', $this->published_post_ids)); + + $where .= " AND $p.comment_count IN ('$post_id_csv')"; + + return $where; + } + + function fltRevisionClauses($clauses, $_wp_query = false) { + $clauses['where'] = $this->fltRevisionQueryWhere($clauses['where']); + return $clauses; + } + + public function fltPrepareRevisionsForJS($revisions_data, $revision, $post) { + return $revisions_data; + } + + public static function fltOrderRevisionsByModified($qry) { + global $wpdb; + + $qry = str_replace("ORDER BY $wpdb->posts.post_date", "ORDER BY $wpdb->posts.post_modified", $qry); + + return $qry; + } + + // port wp_ajax_get_revision_diffs() to support pending, scheduled revisions + public function actAjaxRevisionDiffs() { + if (!isset($_REQUEST['post_id'])) { + return; + } + + if ( ! $post = get_post( (int) $_REQUEST['post_id'] ) ) { + return; + } + + if ( ! current_user_can( 'read_post', $post->ID ) ) { + return; + } + + $revision_id = (isset($_REQUEST['revision'])) ? absint($_REQUEST['revision']) : ''; + $from = (isset($_REQUEST['from'])) ? (int) $_REQUEST['from'] : ''; + $to = (isset($_REQUEST['to'])) ? (int) $_REQUEST['to'] : ''; + + if (!$revision_id && !$to && !empty($_REQUEST['compare'])) { + $compare = sanitize_text_field( + is_array($_REQUEST['compare']) + ? reset($_REQUEST['compare']) + : $_REQUEST['compare'] + ); + + list( $from, $to ) = explode( ':', $compare); // from:to + } + + $from = is_numeric( $from ) ? absint( $from ) : null; + if ( ! $revision_id ) { + $revision_id = absint( $to ); + } + + if (!$revision = get_post($revision_id)) { + return; + } + + if (!rvy_in_revision_workflow($revision)) { + return; + } + + $this->revision_status = $revision->post_mime_type; + + if (!$rvy_revisions = $this->queryRevisions($post)) { + return; + } + + $return = array(); + @set_time_limit( 0 ); + + $current_revision_id = $post->ID; + + $return[] = [ + 'id' => "0:{$current_revision_id}", + 'fields' => $this->getRevisionUIDiff( $post, $post->ID, $current_revision_id ), + ]; + + foreach($rvy_revisions as $rvy_revision) { + $return[] = [ + 'id' => "{$current_revision_id}:{$rvy_revision->ID}", + 'fields' => $this->getRevisionUIDiff( $post, $current_revision_id, $rvy_revision->ID ), + ]; + } + + $rvy_revisions_copy = array_values($rvy_revisions); + + foreach($rvy_revisions_copy as $revision_copy) { + foreach($rvy_revisions as $rvy_revision) { + if ($revision_copy->ID != $rvy_revision->ID) { + $return[] = [ + 'id' => "{$revision_copy->ID}:{$rvy_revision->ID}", + 'fields' => $this->getRevisionUIDiff( $post, $revision_copy->ID, $rvy_revision->ID ), + ]; + } + } + } + + wp_send_json_success( $return ); + } + + public function fltGetRevisionUIDiff($return, $compare_from, $compare_to) { + if ( $compare_from ) { + if ( ! $compare_from = get_post( $compare_from ) ) { + return $return; + } + } else { + // If we're dealing with the first revision... + $compare_from = false; + } + + if ( ! $compare_to = get_post( $compare_to ) ) { + return $return; + } + + if (!rvy_in_revision_workflow($compare_from) && !rvy_in_revision_workflow($compare_to)) { + return $return; + } + + return $this->getRevisionUIDiff(rvy_post_id($compare_to), $compare_from, $compare_to); + } + + // port of core wp_get_revision_ui_diff() to allow comparison of pending, future revisions (published post ID stored in comment_count instead of post_parent) + public function getRevisionUIDiff($post, $compare_from, $compare_to) { + if ( ! $post ) { + return false; + } + + if ( $compare_from ) { + if ( ! $compare_from = get_post( $compare_from ) ) { + return false; + } + } else { + // If we're dealing with the first revision... + $compare_from = false; + } + + if ( ! $compare_to = get_post( $compare_to ) ) { + return false; + } + + $strip_tags = rvy_get_option('diff_display_strip_tags'); + + // Add default title if title field is empty + if ( $compare_from && empty( $compare_from->post_title ) ) { + $compare_from->post_title = esc_html__( '(no title)' ); + } + if ( empty( $compare_to->post_title ) ) { + $compare_to->post_title = esc_html__( '(no title)' ); + } + + $return = array(); + + $acf_active = function_exists('acf_get_setting'); + + foreach ( $all_meta_fields = _wp_post_revision_fields( $compare_to ) as $field => $name ) { + /** + * Contextually filter a post revision field. + * + * The dynamic portion of the hook name, `$field`, corresponds to each of the post + * fields of the revision object being iterated over in a foreach statement. + * + * @since 3.6.0 + * + * @param string $compare_from->$field The current revision field to compare to or from. + * @param string $field The current revision field. + * @param WP_Post $compare_from The revision post object to compare to or from. + * @param string null The context of whether the current revision is the old + * or the new one. Values are 'to' or 'from'. + */ + $content_from = $compare_from ? apply_filters( "_wp_post_revision_field_{$field}", $compare_from->$field, $field, $compare_from, 'from' ) : ''; + + /** This filter is documented in wp-admin/includes/revision.php */ + $content_to = apply_filters( "_wp_post_revision_field_{$field}", $compare_to->$field, $field, $compare_to, 'to' ); + + if ($acf_active && is_scalar($content_to) && (0 === strpos($content_to, 'field_'))) { + continue; + } + + $args = array( + 'show_split_view' => true, + ); + + /** + * Filters revisions text diff options. + * + * Filters the options passed to wp_text_diff() when viewing a post revision. + * + * @since 4.1.0 + * + * @param array $args { + * Associative array of options to pass to wp_text_diff(). + * + * @type bool $show_split_view True for split view (two columns), false for + * un-split view (single column). Default true. + * } + * @param string $field The current revision field. + * @param WP_Post $compare_from The revision post to compare from. + * @param WP_Post $compare_to The revision post to compare to. + */ + $args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to ); + + if ($strip_tags) { + if (is_string($content_from)) { + $content_from = wp_strip_all_tags($content_from); + } + + if (is_string($content_to)) { + $content_to = wp_strip_all_tags($content_to); + } + } + + $diff = wp_text_diff( $content_from, $content_to, $args ); + + if ( ! $diff && 'post_title' === $field ) { + // It's a better user experience to still show the Title, even if it didn't change. + // No, you didn't see this. + $diff = ''; + + // In split screen mode, show the title before/after side by side. + if ( true === $args['show_split_view'] ) { + $diff .= ''; + } else { + $diff .= ''; + + // In single column mode, only show the title once if unchanged. + if ( $compare_from->post_title !== $compare_to->post_title ) { + $diff .= ''; + } + } + + $diff .= ''; + $diff .= '
' . esc_html( $compare_from->post_title ) . '' . esc_html( $compare_to->post_title ) . '' . esc_html( $compare_from->post_title ) . '
' . esc_html( $compare_to->post_title ) . '
'; + } + + if ( $diff ) { + $return[] = array( + 'id' => $field, + 'name' => $name, + 'diff' => $diff, + ); + } + } + + $compare_fields = [ + 'post_date' => esc_html__('Post Date', 'revisionary'), + 'post_parent' => esc_html__('Post Parent', 'revisionary'), + 'menu_order' => esc_html__('Menu Order', 'revisionary'), + 'comment_status' => esc_html__('Comment Status', 'revisionary'), + 'ping_status' => esc_html__('Ping Status', 'revisionary'), + ]; + + if ( + ((('future-revision' == $compare_from->post_mime_type) || ('future-revision' == $compare_to->post_mime_type)) && !rvy_get_option('scheduled_revision_update_post_date')) + || ((in_array($compare_from->post_mime_type, ['draft-revision', 'pending-revision']) || in_array($compare_to->post_mime_type, ['draft-revision', 'pending-revision'])) && !rvy_get_option('pending_revision_update_post_date')) + ) { + unset($compare_fields['post_date']); + } + + // === Add core post fields which cannot normally be versioned + foreach( apply_filters('revisionary_compare_post_fields', $compare_fields) as $field => $name + ) { + // don't display post date difference when it's set to a future date for scheduling + if (strtotime($compare_to->post_date_gmt) > agp_time_gmt() || ('future-revision' == $compare_to->post_mime_type)) { + continue; + } + + if (('post_parent' == $field) && ($compare_from->$field != $compare_to->$field)) { + if (!$parent_post = get_post($compare_from->$field)) { + $from_val = $compare_from->$field; + } else { + $from_val = $parent_post->post_title . " (id: $parent_post->ID)"; + } + + if (!$parent_post = get_post($compare_to->$field)) { + $to_val = $compare_from->$field; + } else { + $to_val = $parent_post->post_title . " (id: $parent_post->ID)"; + } + + $content_from = $compare_from ? apply_filters( "_wp_post_revision_field_{$field}", $from_val, $field, $compare_from, 'from' ) : ''; + $content_to = apply_filters( "_wp_post_revision_field_{$field}", $to_val, $field, $compare_to, 'to' ); + } else { + $content_from = $compare_from ? apply_filters( "_wp_post_revision_field_{$field}", $compare_from->$field, $field, $compare_from, 'from' ) : ''; + $content_to = apply_filters( "_wp_post_revision_field_{$field}", $compare_to->$field, $field, $compare_to, 'to' ); + } + + $args = array( + 'show_split_view' => true, + ); + + $args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to ); + + if ($strip_tags) { + $content_from = wp_strip_all_tags($content_from); + $content_to = wp_strip_all_tags($content_to); + } + + if ($diff = wp_text_diff( $content_from, $content_to, $args )) { + $return[] = array( + 'id' => $field, + 'name' => $name, + 'diff' => $diff, + ); + } + } + + // === Add taxonomies + $taxonomies = []; + $_taxonomies = get_taxonomies(['public' => true], 'objects'); + + foreach($_taxonomies as $taxonomy => $tx_obj) { + if (in_array($compare_to->post_type, (array)$tx_obj->object_type)) { + $taxonomies[$taxonomy] = $tx_obj->labels->name; + } + } + + $published_id = rvy_post_id($compare_from->ID); + $is_beaver = defined('FL_BUILDER_VERSION') && get_post_meta($published_id, '_fl_builder_data', true); + + foreach( apply_filters('revisionary_compare_taxonomies', $taxonomies) as $taxonomy => $name) { + $field = $taxonomy; + + if (!$terms = get_the_terms($compare_from, $taxonomy)) { + $terms = []; + } + $term_names = []; + foreach($terms as $term) { + $term_names []= $term->name; + } + sort($term_names); + $val = implode(", ", $term_names); + $content_from = apply_filters( "_wp_post_revision_field_{$field}", $val, $field, $compare_from, 'from' ); + + if (!$terms = get_the_terms($compare_to, $taxonomy)) { + $terms = []; + } + + $other_term_names = $term_names; + + $term_names = []; + foreach($terms as $term) { + $term_names []= $term->name; + } + sort($term_names); + $val = implode(", ", $term_names); + $content_to = apply_filters( "_wp_post_revision_field_{$field}", $val, $field, $compare_to, 'to' ); + + $args = array( + 'show_split_view' => true, + ); + + if ($is_beaver + && (!$other_term_names && !rvy_in_revision_workflow($compare_from)) + || (!$term_names && !rvy_in_revision_workflow($compare_to)) + ) { + continue; + } + + $args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to ); + + if ($diff = wp_text_diff( $content_from, $content_to, $args )) { + $return[] = array( + 'id' => $field, + 'name' => $name, + 'diff' => $diff, + ); + } + } + + // === Add select postmeta fields + if ($compare_from) { + $from_meta = get_post_meta($compare_from->ID); + } + + $to_meta = get_post_meta($compare_to->ID); + + if (defined('ELEMENTOR_VERSION')) { + unset($to_meta['_elementor_data']); + unset($from_meta['_elementor_data']); + } + + $meta_fields = []; + + $meta_fields['_wp_page_template'] = esc_html__('Page Template', 'revisionary'); + + if (post_type_supports($compare_to->post_type, 'thumbnail')) { + $meta_fields ['_thumbnail_id'] = esc_html__('Featured Image', 'revisionary'); + } + + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION') && defined('FL_BUILDER_VERSION') && defined('REVISIONARY_BEAVER_BUILDER_DIFF')) { // todo: move to filter + $meta_fields['_fl_builder_data'] = esc_html__('Beaver Builder Data', 'revisionary'); + $meta_fields['_fl_builder_data_settings'] = esc_html__('Beaver Builder Settings', 'revisionary'); + } + + $native_fields = _wp_post_revision_fields( $to_meta, $compare_to ); + + $meta_fields = array_diff_key( apply_filters('revisionary_compare_meta_fields', $meta_fields), $native_fields ); + + foreach($meta_fields as $field => $name) { + if ($compare_from) { + $val = get_post_meta($compare_from->ID, $field, true); + $content_from = maybe_serialize(apply_filters( "_wp_post_revision_field_{$field}", $val, $field, $compare_from, 'from' )); + } else { + $content_from = ''; + } + + $val = get_post_meta($compare_to->ID, $field, true); + $content_to = maybe_serialize(apply_filters( "_wp_post_revision_field_{$field}", $val, $field, $compare_to, 'to' )); + + if ('_thumbnail_id' == $field) { + $content_from = ($content_from) ? "$content_from (" . wp_get_attachment_image_url($content_from, 'full') . ')' : ''; + $content_to = ($content_to) ? "$content_to (" . wp_get_attachment_image_url($content_to, 'full') . ')' : ''; + + // suppress false alarm for featured image clearance + if ($content_from && !$content_to) { + continue; + } + + } elseif(('_requested_slug' == $field)) { + if ($content_to && !rvy_in_revision_workflow($compare_to)) { + $content_to = ''; + } + + if ($content_from && !rvy_in_revision_workflow($compare_from)) { + $content_from = ''; + } + + if ($content_to && !$content_from) { + if ($parent_post = get_post($published_id)) { + $content_from = $parent_post->post_name; + } + } + } + + if ($is_beaver && !$content_to) { + continue; + } + + $args = array( + 'show_split_view' => true, + ); + + $args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to ); + + if ($strip_tags) { + $content_from = wp_strip_all_tags($content_from); + $content_to = wp_strip_all_tags($content_to); + } + + if ($diff = wp_text_diff( $content_from, $content_to, $args )) { + $return[] = array( + 'id' => $field, + 'name' => $name, + 'diff' => $diff, + ); + } + } + + $args = compact('to_meta', 'native_fields', 'meta_fields', 'strip_tags'); + $return = apply_filters('revisionary_diff_ui', $return, $compare_from, $compare_to, $args); + + return $return; + } + + private function loadAuthorInfo($revision, $use_multiple_authors, $args = []) { + $show_avatars = !empty($args['show_avatars']); + + if ($use_multiple_authors = $use_multiple_authors && function_exists('get_multiple_authors')) { + $author_ids = []; + $authors = get_multiple_authors($revision); + foreach($authors as $_author) { + $author_ids []= $_author->ID; + } + } + + if (!$use_multiple_authors || !$author_ids) { + $author_ids = [$revision->post_author]; + + if ($_author = new WP_User($revision->post_author)) { + $authors = [$_author]; + } + } + + sort($author_ids); + $author_key = implode(",", $author_ids); + + if ( ! isset( $this->authors[ $author_key ] ) ) { + $author_captions = []; + $avatars = ''; + foreach($authors as $_author) { + $author_captions []= ($use_multiple_authors) ? esc_html($_author->display_name) : htmlspecialchars_decode(get_the_author_meta('display_name', $_author->ID)); + $avatars .= $show_avatars ? get_avatar( $_author->ID, 32 ) : ''; + } + + if (empty($author_captions)) { + $author_captions[] = esc_html__('No author', 'revisionary'); + } + + $this->authors[ $author_key ] = array( + 'id' => (int) $revision->post_author, + 'avatar' => $avatars, + 'name' => implode(', ', $author_captions), + ); + } + + return $author_key; + } + + /** + * Prepare revisions for JavaScript. + + * @param object|int $post The post object. Also accepts a post ID. + * @param int $selected_revision_id The selected revision ID. + * @param int $from Optional. The revision ID to compare from. + * + * @return array An associative array of revision data and related settings. + */ + + // Port of wp_prepare_revisions_for_js() to support pending, scheduled revisions + private function prepare_revisions_for_js( $post, $selected_revision_id, $from = null, $revisions = null ) { + $post = get_post( $post ); + $now_gmt = time(); + + if (is_null($revisions)) { + $revisions = wp_get_post_revisions( + $post->ID, + array( + 'order' => 'ASC', + 'check_enabled' => false, + ) + ); + } + + // If revisions are disabled, we only want autosaves and the current post. + if ( $revisions_disabled = apply_filters('revisionary_revisions_disabled', false, $post) ) { + foreach ( $revisions as $revision_id => $revision ) { + if ( ! wp_is_post_autosave( $revision ) ) { + unset( $revisions[ $revision_id ] ); + } + } + + $revisions = [$post->ID => $post] + $revisions; + } + + $show_avatars = get_option( 'show_avatars' ); + + cache_users( wp_list_pluck( $revisions, 'post_author' ) ); + + $type_obj = get_post_type_object($post->post_type); + + $can_restore = current_user_can('edit_post', $post->ID); + + $current_id = false; + + $revisions = [$post->ID => $post] + $revisions; + + foreach ( $revisions as $revision ) { + $modified = strtotime( $revision->post_modified ); + $modified_gmt = strtotime( $revision->post_modified_gmt . ' +0000' ); + + $current = ($revision->ID == $post->ID); + + if ( $current && ! empty( $current_id ) ) { + // If multiple revisions have the same post_modified_gmt, highest ID is current. + if ( $current_id < $revision->ID ) { + $revisions[ $current_id ]['current'] = false; + $current_id = $revision->ID; + } else { + $current = false; + } + } elseif ( $current ) { + $current_id = $revision->ID; + } + + // Without this step, "Current Revision" shows stored post_author (or Multiple Authors), regardless of user(s) who made the last update + if ($current && !$revisions_disabled && !defined('RVY_LEGACY_COMPARE_REVISIONS_AUTHOR_DISPLAY')) { + if ($past_revisions = wp_get_post_revisions($post->ID, ['orderby' => 'ID', 'order' => 'DESC'])) { + + // Ignore autosaves. + foreach($past_revisions as $id => $past_revision) { + if ( false !== strpos( $past_revision->post_name, "{$past_revision->post_parent}-autosave" ) ) { + unset($past_revisions[$id]); + } + } + + if ($last_revision = array_shift($past_revisions)) { + if ($last_revision->ID > $post->session_id) { + $revision->post_author = $last_revision->post_author; + } + } + } + } + + $edit_url = false; + + // Until Reject button is implemented, just route to Preview screen so revision can be edited / deleted if necessary + if ($current || rvy_in_revision_workflow($revision)) { + $restore_link = rvy_preview_url($revision); // default to revision preview link + + if ($can_restore) { + $published_post_id = rvy_post_id($revision->ID); + + // For non-public types, force direct approval because preview is not available + if ((($type_obj && !is_post_type_viewable($type_obj)) || rvy_get_option('compare_revisions_direct_approval')) && current_user_can( 'edit_post', $published_post_id) ) { + $redirect_arg = ( ! empty($_REQUEST['rvy_redirect']) ) ? "&rvy_redirect=" . esc_url_raw($_REQUEST['rvy_redirect']) : ''; + + if (in_array($revision->post_mime_type, ['draft-revision', 'pending-revision'])) { + $restore_link = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision={$revision->ID}&action=approve$redirect_arg"), "approve-post_$published_post_id|{$revision->ID}" ); + + } elseif (in_array($revision->post_mime_type, ['future-revision'])) { + $restore_link = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision={$revision->ID}&action=publish$redirect_arg"), "publish-post_$published_post_id|{$revision->ID}" ); + } + + if (current_user_can('edit_post', $revision->ID)) { + $edit_url = rvy_admin_url("post.php?action=edit&post=$revision->ID"); + } + } + } + } else { + $restore_link = ''; + } + + if ('future-revision' == $revision->post_mime_type) { + $date_prefix = esc_html__('Scheduled for ', 'revisionary'); + $modified = strtotime( $revision->post_date ); + $modified_gmt = strtotime( $revision->post_date_gmt . ' +0000' ); + + } elseif (in_array($revision->post_mime_type, ['draft-revision', 'pending-revision']) && (strtotime($revision->post_date_gmt) > $now_gmt ) ) { + $date_prefix = esc_html__('Requested for ', 'revisionary'); + $modified = strtotime( $revision->post_date ); + $modified_gmt = strtotime( $revision->post_date_gmt . ' +0000' ); + + } else { + $date_prefix = esc_html__('Modified ', 'revisionary'); + $modified = strtotime( $revision->post_modified ); + $modified_gmt = strtotime( $revision->post_modified_gmt . ' +0000' ); + } + + $time_diff_label = ($now_gmt > $modified_gmt) ? esc_html__( '%s%s ago' ) : esc_html__( '%s%s from now', 'revisionary'); + + $use_multiple_authors = function_exists('get_multiple_authors') && !rvy_in_revision_workflow($revision); + + // Just track single post_author for revision. Changes to Authors taxonomy will be applied to published post. + $author_key = $this->loadAuthorInfo($revision, $use_multiple_authors, compact('show_avatars')); + + $revisions_data = [ + 'id' => $revision->ID, + 'title' => get_the_title( $revision->ID ), + 'author' => $this->authors[ $author_key ], + 'date' => sprintf('%s%s', $date_prefix, date_i18n( esc_html__( 'M j, Y @ g:i a', 'revisionary' ), $modified )), + 'dateShort' => date_i18n( _x( 'j M @ g:i a', 'revision date short format' ), $modified ), + 'timeAgo' => sprintf( $time_diff_label, $date_prefix, human_time_diff( $modified_gmt, $now_gmt ) ), + 'autosave' => false, + 'current' => $current, + 'restoreUrl' => $restore_link, + 'editUrl' => $edit_url, + ]; + + /** + * Filters the array of revisions used on the revisions screen. + * + * @since 4.4.0 + * + * @param array $revisions_data { + * The bootstrapped data for the revisions screen. + * + * @type int $id Revision ID. + * @type string $title Title for the revision's parent WP_Post object. + * @type int $author Revision post author ID. + * @type string $date Date the revision was modified. + * @type string $dateShort Short-form version of the date the revision was modified. + * @type string $timeAgo GMT-aware amount of time ago the revision was modified. + * @type bool $autosave Whether the revision is an autosave. + * @type bool $current Whether the revision is both not an autosave and the post + * modified date matches the revision modified date (GMT-aware). + * @type bool|false $restoreUrl URL if the revision can be restored, false otherwise. + * } + * @param WP_Post $revision The revision's WP_Post object. + * @param WP_Post $post The revision's parent WP_Post object. + */ + $revisions[ $revision->ID ] = apply_filters( 'wp_prepare_revision_for_js', $revisions_data, $revision, $post ); + } + + /** + * If we only have one revision, the initial revision is missing; This happens + * when we have an autsosave and the user has clicked 'View the Autosave' + */ + if ( 1 === sizeof( $revisions ) ) { + $author_key = $this->loadAuthorInfo($post, true, compact('show_avatars')); + + $revisions[ $post->ID ] = array( + 'id' => $post->ID, + 'title' => get_the_title( $post->ID ), + 'author' => $this->authors[ $author_key ], + 'date' => date_i18n( esc_html__( 'M j, Y @ H:i', 'revisionary' ), strtotime( $post->post_modified ) ), + 'dateShort' => date_i18n( _x( 'j M @ H:i', 'revision date short format', 'revisionary' ), strtotime( $post->post_modified ) ), + 'timeAgo' => sprintf( esc_html__( '%s ago' ), human_time_diff( strtotime( $post->post_modified_gmt ), $now_gmt ) ), + 'autosave' => false, + 'current' => true, + 'restoreUrl' => false, + ); + $current_id = $post->ID; + } + + /* + * If a post has been saved since the last revision (no revisioned fields + * were changed), we may not have a "current" revision. Mark the latest + * revision as "current". + */ + if ( empty( $current_id ) ) { + if ( $revisions[ $revision->ID ]['autosave'] ) { + $revision = end( $revisions ); + while ( $revision['autosave'] ) { + $revision = prev( $revisions ); + } + $current_id = $revision['id']; + } else { + $current_id = $revision->ID; + } + $revisions[ $current_id ]['current'] = true; + } + + // Now, grab the initial diff. + $compare_two_mode = is_numeric( $from ); + if ( ! $compare_two_mode ) { + $found = array_search( $selected_revision_id, array_keys( $revisions ) ); + if ( $found ) { + $from = array_keys( array_slice( $revisions, $found - 1, 1, true ) ); + $from = reset( $from ); + } else { + $from = 0; + } + } + + $from = absint( $from ); + + $diffs = [ + [ + 'id' => $from . ':' . $selected_revision_id, + 'fields' => $this->getRevisionUIDiff( $post->ID, $from, $selected_revision_id ), + ], + ]; + + return [ + 'postId' => $post->ID, + 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ), + 'revisionData' => array_values( $revisions ), + 'to' => $selected_revision_id, + 'from' => $from, + 'diffData' => $diffs, + 'baseUrl' => wp_parse_url( rvy_admin_url( 'revision.php' ), PHP_URL_PATH ), + 'compareTwoMode' => absint( $compare_two_mode ), // Apparently booleans are not allowed + 'revisionIds' => array_keys( $revisions ), + ]; + } + + function actRevisionDiffScripts() { + if (!did_action('rvy_compare_revisions')) { + return; + } + + $post_id = (isset($_REQUEST['revision'])) ? (int) $_REQUEST['revision'] : 0; + if (!$post_id) { + $post_id = (isset($_REQUEST['to'])) ? (int) $_REQUEST['to'] : 0; + } + + if ($post_type = get_post_field('post_type', $post_id)) { + $type_obj = get_post_type_object($post_type); + } + + // For non-public types, force direct approval because preview is not available + $direct_approval = (($type_obj && !is_post_type_viewable($type_obj)) || rvy_get_option('compare_revisions_direct_approval')) + && current_user_can('edit_post', rvy_post_id($post_id)); + + if ($post_id) { + $can_approve = current_user_can('edit_post', rvy_post_id($post_id)); + } else { + $can_approve = isset($type_obj->cap->edit_published_posts) && current_user_can($type_obj->cap->edit_published_posts); + } + + if (empty($type_obj) || $can_approve) { + $button_label = $direct_approval ? esc_html__('Approve', 'revisionary') : esc_html__('Preview / Approve', 'revisionary'); + } else { + $button_label = esc_html__('Preview', 'revisionary'); + } + ?> + + post_type); + } else { + return; + } + + if ($main_post_id = rvy_post_id($post_id)) { + if ($main_post = get_post($main_post_id)) { + $main_post_status = get_post_status_object($main_post->post_status); + } + } + + if (!empty($main_post) && !empty($main_post_status) && (empty($main_post_status->public) && empty($main_post_status->private))) { + $can_edit = $revisionary->canEditPost($main_post); + } else { + $edit_published_cap = isset($type_obj->cap->edit_published_posts) ? $type_obj->cap->edit_published_posts : 'do_not_allow'; + $can_edit = current_user_can($edit_published_cap); + } + + $show_preview_link = rvy_get_option('revision_preview_links') || current_user_can('administrator') || is_super_admin(); + + if ($show_preview_link) { + $preview_label = (empty($type_obj) || $can_edit) + ? esc_html__('Preview / Restore', 'revisionary') + : esc_html__('Preview'); + + $preview_url = rvy_preview_url($post); + } + + $manage_label = (empty($type_obj) || $can_edit) + ? esc_html__('Manage', 'revisionary') + : esc_html__('List', 'revisionary'); + + $manage_url = rvy_admin_url("admin.php?page=revisionary-archive&origin_post=$main_post_id"); + ?> + + false, 'customize_defaults' => false]; + $args = array_merge($defaults, (array)$args); + + $this->sitewide = $args['sitewide']; + $this->customize_defaults = $args['customize_defaults']; + $this->display_hints = rvy_get_option( 'display_hints' ); + } + + function option_checkbox( $option_name, $tab_name, $section_name, $hint_text, $unused_arg = '', $args = '') { + $return = array( 'in_scope' => false, 'val' => '', 'subcaption' => '', 'style' => '' ); + + if ( ! is_array($args) ) + $args = array(); + + if ( in_array( $option_name, $this->form_options[$tab_name][$section_name] ) ) { + $this->all_options []= $option_name; + + $return['val'] = rvy_get_option($option_name, $this->sitewide, $this->customize_defaults, ['bypass_condition_check' => true]); + + echo "
"; + + echo ""; + + if ( $hint_text && $this->display_hints ) + echo "
" . esc_html($hint_text) . "
"; + + if ( ! empty($args['subcaption']) ) + echo $args['subcaption']; + + echo "
"; + + $return['in_scope'] = true; + } + + return $return; + } + +function options_ui( $sitewide = false, $customize_defaults = false ) { + +global $revisionary; +global $rvy_options_sitewide, $rvy_default_options; + +if ( ! current_user_can( 'manage_options' ) || ( $sitewide && ! is_super_admin() ) ) + wp_die(''); + +?> +
+all_options = array(); + +$this->tab_captions = array( 'features' => esc_html__( 'Settings', 'revisionary' ), 'optscope' => esc_html__( 'Setting Scope', 'revisionary' ) ); + +$this->section_captions = array( + 'features' => array( + 'post_types' => esc_html__('Post Types', 'revisionary'), + 'role_definition' => esc_html__('Revisors', 'revisionary'), + 'revision_statuses' => esc_html__('Statuses', 'revisionary'), + 'working_copy' => rvy_get_option('revision_statuses_noun_labels') ? pp_revisions_status_label('draft-revision', 'plural') : esc_html__('Revision Creation', 'revisionary'), + 'pending_revisions' => rvy_get_option('revision_statuses_noun_labels') ? pp_revisions_status_label('pending-revision', 'plural') : esc_html__('Revision Submission', 'revisionary'), + 'scheduled_revisions' => pp_revisions_status_label('future-revision', 'plural'), + 'revision_queue' => esc_html__('Queue', 'revisionary'), + 'preview' => esc_html__('Preview / Approval', 'revisionary'), + 'revisions' => esc_html__('Options', 'revisionary'), + 'notification' => esc_html__('Notifications', 'revisionary') + ) +); + +// TODO: replace individual _e calls with these (and section, tab captions) +$pending_revision_singular = pp_revisions_status_label('pending-revision', 'name'); +$pending_revision_plural = rvy_get_option('revision_statuses_noun_labels') ? pp_revisions_status_label('pending-revision', 'plural') : esc_html__('Revision Submission', 'revisionary'); +$pending_revision_basic = pp_revisions_status_label('pending-revision', 'basic'); +$future_revision_singular = pp_revisions_status_label('future-revision', 'name'); + +$this->option_captions = apply_filters('revisionary_option_captions', + [ + 'revision_statuses_noun_labels' => esc_html__('Use alternate labeling: "Working Copy" > "Change Request" > "Scheduled Change"', 'revisionary'), + 'manage_unsubmitted_capability' => sprintf(esc_html__('Additional role capability required to manage %s'), pp_revisions_status_label('draft-revision', 'plural')), + 'copy_posts_capability' => rvy_get_option('revision_statuses_noun_labels') ? esc_html__("Additional role capability required to create a Working Copy", 'revisionary') : esc_html__("Additional role capability required to create a new revision", 'revisionary'), + 'caption_copy_as_edit' => sprintf(esc_html__('Posts / Pages list: Use "Edit" caption for %s link'), pp_revisions_status_label('draft-revision', 'submit_short')), + 'pending_revisions' => sprintf(esc_html__('Enable %s', 'revisionary'), $pending_revision_plural), + 'revision_limit_per_post' => esc_html__("Limit to one active revision per post", 'revisionary'), + 'auto_submit_revisions' => esc_html__("Auto-submit revisions created by a user with publishing capability", 'revisionary'), + 'scheduled_revisions' => sprintf(esc_html__('Enable %s', 'revisionary'), pp_revisions_status_label('future-revision', 'plural')), + 'revise_posts_capability' => rvy_get_option('revision_statuses_noun_labels') ? esc_html__("Additional role capability required to submit a Change Request", 'revisionary') : esc_html__("Additional role capability required to submit a revision", 'revisionary'), + 'revisor_lock_others_revisions' => esc_html__("Editing others' revisions requires role capability", 'revisionary'), + 'revisor_hide_others_revisions' => esc_html__("Listing others' revisions requires role capability", 'revisionary'), + 'admin_revisions_to_own_posts' => esc_html__("Users can always administer revisions to their own editable posts", 'revisionary'), + 'revision_update_notifications' => esc_html__('Also notify on Revision Update', 'revisionary'), + 'trigger_post_update_actions' => esc_html__('Revision Publication: API actions to mimic Post Update', 'revisionary'), + 'diff_display_strip_tags' => esc_html__('Hide html tags on Compare Revisions screen', 'revisionary'), + 'scheduled_publish_cron' => esc_html__('Use WP-Cron scheduling', 'revisionary'), + 'wp_cron_usage_detected' => esc_html__('Site uses a custom trigger for WP-Cron tasks', 'revisionary'), + 'async_scheduled_publish' => esc_html__('Asynchronous Publishing', 'revisionary'), + 'scheduled_revision_update_post_date' => esc_html__('Update Publish Date', 'revisionary'), + 'pending_revision_update_post_date' => esc_html__('Update Publish Date', 'revisionary'), + 'scheduled_revision_update_modified_date' => esc_html__('Update Modified Date', 'revisionary'), + 'pending_revision_update_modified_date' => esc_html__('Update Modified Date', 'revisionary'), + 'pending_rev_notify_author' => sprintf(esc_html__('Email original Author when a %s is submitted', 'revisionary'), $pending_revision_basic), + 'rev_approval_notify_author' => sprintf(esc_html__('Email the original Author when a %s is approved', 'revisionary'), $pending_revision_singular), + 'rev_approval_notify_revisor' => sprintf(esc_html__('Email the Revisor when a %s is approved', 'revisionary'), $pending_revision_singular), + 'publish_scheduled_notify_author' => sprintf(esc_html__('Email the original Author when a %s is published', 'revisionary'), $future_revision_singular), + 'publish_scheduled_notify_revisor' => sprintf(esc_html__('Email the Revisor when a %s is published', 'revisionary'), $future_revision_singular), + 'use_notification_buffer' => esc_html__('Enable notification buffer', 'revisionary'), + 'revisor_role_add_custom_rolecaps' => esc_html__('All custom post types available to Revisors', 'revisionary' ), + 'require_edit_others_drafts' => esc_html__("Prevent Revisors from editing other user's drafts", 'revisionary' ), + 'display_hints' => esc_html__('Display Hints'), + 'revision_preview_links' => esc_html__('Show Preview Links', 'revisionary'), + 'preview_link_type' => esc_html__('Preview Link Type', 'revisionary'), + 'preview_link_alternate_preview_arg' => esc_html__('Modify preview link for better theme compatibility', 'revisionary'), + 'block_editor_extra_preview_button' => esc_html__('Extra preview button in Gutenberg Editor top bar', 'revisionary'), + 'home_preview_set_home_flag' => esc_html__('Theme Compat: For front page revision preview, set home flag', 'revisionary'), + 'compare_revisions_direct_approval' => esc_html__('Approve Button on Compare Revisions screen', 'revisionary'), + 'copy_revision_comments_to_post' => esc_html__('Copy revision comments to published post', 'revisionary'), + 'past_revisions_order_by' => esc_html__('Compare Past Revisions ordering:'), + 'list_unsubmitted_revisions' => sprintf(esc_html__('Include %s in My Activity, Revisions to My Posts views', 'revisionary'), pp_revisions_status_label('draft-revision', 'plural')), + 'rev_publication_delete_ed_comments' => esc_html__('On Revision publication, delete Editorial Comments', 'revisionary'), + 'deletion_queue' => esc_html__('Enable deletion queue', 'revisionary'), + 'revision_archive_deletion' => esc_html__('Enable deletion in Revision Archive', 'revisionary'), + 'revision_restore_require_cap' => esc_html__('Revision Restore: Non-Administrators need capability', 'revisionary'), + ] +); + + +if ( defined('RVY_CONTENT_ROLES') ) { + $this->option_captions['pending_rev_notify_admin'] = sprintf(esc_html__('Email designated Publishers when a %s is submitted', 'revisionary'), $pending_revision_basic); + $this->option_captions['publish_scheduled_notify_admin'] = sprintf(esc_html__('Email designated Publishers when a %s is published', 'revisionary'), $future_revision_singular); + $this->option_captions['rev_approval_notify_admin'] = sprintf(esc_html__('Email designated Publishers when a %s is approved', 'revisionary'), $pending_revision_singular); +} else { + $this->option_captions['pending_rev_notify_admin'] = sprintf(esc_html__('Email Editors and Administrators when a %s is submitted', 'revisionary'), $pending_revision_basic); + $this->option_captions['publish_scheduled_notify_admin'] = sprintf(esc_html__('Email Editors and Administrators when a %s is published', 'revisionary'), $future_revision_singular); + $this->option_captions['rev_approval_notify_admin'] = sprintf(esc_html__('Email Editors and Administrators when a %s is approved', 'revisionary'), $pending_revision_singular); +} + + +$this->form_options = apply_filters('revisionary_option_sections', [ +'features' => [ + 'license' => ['edd_key'], + 'post_types' => ['enabled_post_types'], + 'role_definition' => ['revisor_role_add_custom_rolecaps', 'require_edit_others_drafts'], + 'revision_statuses' => ['revision_statuses_noun_labels'], + 'working_copy' => ['manage_unsubmitted_capability', 'copy_posts_capability', 'revision_limit_per_post', 'auto_submit_revisions', 'caption_copy_as_edit'], + 'scheduled_revisions' => ['scheduled_revisions', 'scheduled_publish_cron', 'async_scheduled_publish', 'wp_cron_usage_detected', 'scheduled_revision_update_post_date', 'scheduled_revision_update_modified_date'], + 'pending_revisions' => ['pending_revisions', 'revise_posts_capability', 'pending_revision_update_post_date', 'pending_revision_update_modified_date'], + 'revision_queue' => ['revisor_lock_others_revisions', 'revisor_hide_others_revisions', 'admin_revisions_to_own_posts', 'list_unsubmitted_revisions'], + 'preview' => ['revision_preview_links', 'preview_link_type', 'preview_link_alternate_preview_arg', 'home_preview_set_home_flag', 'compare_revisions_direct_approval', 'block_editor_extra_preview_button'], + 'revisions' => ['trigger_post_update_actions', 'copy_revision_comments_to_post', 'diff_display_strip_tags', 'past_revisions_order_by', 'rev_publication_delete_ed_comments', 'deletion_queue', 'revision_archive_deletion', 'revision_restore_require_cap', 'display_hints'], + 'notification' => ['pending_rev_notify_admin', 'pending_rev_notify_author', 'revision_update_notifications', 'rev_approval_notify_admin', 'rev_approval_notify_author', 'rev_approval_notify_revisor', 'publish_scheduled_notify_admin', 'publish_scheduled_notify_author', 'publish_scheduled_notify_revisor', 'use_notification_buffer'], +] +]); + +if ( RVY_NETWORK ) { + if ( $sitewide ) + $available_form_options = $this->form_options; + + foreach ( $this->form_options as $tab_name => $sections ) { + foreach ( $sections as $section_name => $option_names ) { + if ($sitewide) { + $this->form_options[$tab_name][$section_name] = array_intersect( $this->form_options[$tab_name][$section_name], array_keys($rvy_options_sitewide) ); + } elseif ('license' != $section_name) { + $this->form_options[$tab_name][$section_name] = array_diff( $this->form_options[$tab_name][$section_name], array_keys($rvy_options_sitewide) ); + } + } + } + + foreach ( $this->form_options as $tab_name => $sections ) + foreach ( array_keys($sections) as $section_name ) + if ( empty( $this->form_options[$tab_name][$section_name] ) ) + unset( $this->form_options[$tab_name][$section_name] ); + + if (!$sitewide) { + unset($this->form_options['features']['license']); + } +} + +do_action('revisionary_settings_ui', $this, $sitewide, $customize_defaults); +?> +
+ +'; +wp_nonce_field( 'rvy-update-options' ); + +if ( $sitewide ) + echo ""; + +if ( $customize_defaults ) + echo ""; + +?> + + + +
+

+

+
+
+ +
+ + + +
+ + + +
+
+ +'; + esc_html_e( 'These are the default settings for options which can be adjusted per-site.', 'revisionary' ); + echo '

'; + +} else + $color_class = 'rs-settings'; + +if ( $sitewide || $customize_defaults ) { + $class_selected = "agp-selected_agent agp-agent $color_class"; + $class_unselected = "agp-unselected_agent agp-agent"; + + // todo: prevent line breaks in these links + echo "'; +} + +// ------------------------- BEGIN Features tab --------------------------------- + +$tab = 'features'; +echo "
"; + +if ( rvy_get_option('display_hints', $sitewide, $customize_defaults) ) { + echo '
'; + + if ( $sitewide ) { + printf( esc_html__('Use this tab to make NETWORK-WIDE changes to PublishPress Revisions settings. %s', 'revisionary'), '' ); + + if ( count( $rvy_options_sitewide ) < count( $rvy_default_options ) ) { + printf( esc_html__( 'You can also specify %1$sdefaults for site-specific settings%2$s.', 'revisionary' ), '', '' ); + } + } elseif ( $customize_defaults ) { + esc_html_e('Here you can change the default value for settings which are controlled separately on each site.', 'revisionary'); + } + + if ( RVY_NETWORK && is_super_admin() ) { + if ( ! $sitewide ) { + global $blog_id; + + echo ' '; + + if ( is_main_site($blog_id) ) { + printf( esc_html__('Note that %1$s network-wide settings%2$s may also be available.', 'revisionary'), "", ''); + } else { + printf( esc_html__('Note that %1$s network-wide settings%2$s may also be available.', 'revisionary'), '', '' ); + } + } + } + ?> + + +
+ + + + +
+ +form_options['features']['license'])) { + require_once(REVISIONARY_PRO_ABSPATH . '/includes-pro/SettingsLicense.php'); + $license_ui = new RevisionaryLicenseSettings(); + ?> + > + display($sitewide, $customize_defaults); ?> + + form_options[$tab][$section] ) ) :?> + ">
+ + all_options []= $option_name; + + esc_html_e('Enable revision submission for these Post Types:', 'revisionary'); + echo '

'; + + $hidden_types = ['attachment' => true, 'tablepress_table' => true, 'acf-field-group' => true, 'acf-field' => true, 'nav_menu_item' => true, 'custom_css' => true, 'customize_changeset' => true, 'wp_block' => true, 'wp_template' => true, 'wp_template_part' => true, 'wp_global_styles' => true, 'wp_navigation' => true]; + $locked_types = []; + + $types = get_post_types(['public' => true, 'show_ui' => true], 'object', 'or'); + + $types = rvy_order_types($types); + + foreach ($types as $key => $obj) { + if (!$key) { + continue; + } + + $id = $option_name . '-' . $key; + $name = $option_name . "[$key]"; + ?> + + + + + + + +
+ + '; + + if (!empty($revisionary->enabled_post_types[$key]) && isset($obj->capability_type) && !in_array($obj->capability_type, [$obj->name, 'post', 'page'])) { + if ($cap_type_obj = get_post_type_object($obj->capability_type)) { + echo ' (' . esc_html(sprintf(__('%s capabilities'), $cap_type_obj->labels->singular_name)) . ')'; + } + } + + echo '
'; + endif; + endif; // displaying checkbox UI + + } // end foreach src_otype + ?> + +
+
+ +
+ +
+ form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox( 'revisor_role_add_custom_rolecaps', $tab, $section, $hint, '' ); + ?> + + option_checkbox( 'require_edit_others_drafts', $tab, $section, $hint, '' ); + ?> + +
+ form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox( 'revision_statuses_noun_labels', $tab, $section, $hint, '' ); + ?> + +
+form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox( 'copy_posts_capability', $tab, $section, $hint, '' ); + + if (defined('PRESSPERMIT_VERSION')) :?> +
+ +

+ option_checkbox('manage_unsubmitted_capability', $tab, $section, $hint, ''); + + ?> +
+ option_checkbox( 'revision_limit_per_post', $tab, $section, '', '' ); + ?> + +
+ option_checkbox( 'auto_submit_revisions', $tab, $section, '', '' ); + + do_action('revisionary_auto_submit_setting_ui', $this, $tab, $section); + ?> +
+ option_checkbox( 'caption_copy_as_edit', $tab, $section, $hint, '' ); + ?> +
+form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox('pending_revisions', $tab, $section, '', '', ['style' => 'margin-bottom: 0']); + + echo "
" + . sprintf( + esc_html__( 'Enable published content to be copied, edited, submitted for approval and managed in %sRevision Queue%s.', 'revisionary' ), + "", + '' + ) + . "
"; + + $hint = esc_html__('This restriction applies to users who are not full editors for the post type. To enable a role, add capabilities: revise_posts, revise_others_pages, etc.', 'revisionary'); + $this->option_checkbox( 'revise_posts_capability', $tab, $section, $hint, '' ); + + $hint = sprintf(esc_html__( 'When a %s is published, update post publish date to current time.', 'revisionary' ), pp_revisions_status_label('pending-revision', 'name')); + $this->option_checkbox( 'pending_revision_update_post_date', $tab, $section, $hint, '' ); + + $hint = sprintf(esc_html__( 'When a %s is published, update post modified date to current time.', 'revisionary' ), pp_revisions_status_label('pending-revision', 'name')); + $this->option_checkbox( 'pending_revision_update_modified_date', $tab, $section, $hint, '' ); + + do_action('revisionary_option_ui_pending_revisions', $this); + ?> +
+ form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox( 'scheduled_revisions', $tab, $section, $hint, '' ); + + $hint = sprintf(esc_html__( 'When a %s is published, update post publish date to current time.', 'revisionary' ), pp_revisions_status_label('future-revision', 'name')); + $this->option_checkbox( 'scheduled_revision_update_post_date', $tab, $section, $hint, '' ); + + $hint = sprintf(esc_html__( 'When a %s is published, update post modified date to current time.', 'revisionary' ), pp_revisions_status_label('future-revision', 'name')); + $this->option_checkbox( 'scheduled_revision_update_modified_date', $tab, $section, $hint, '' ); + + global $wp_version; + + $hint = esc_html__( 'Publish scheduled revisions using the WP-Cron mechanism. On some sites, publication will fail if this setting is disabled.', 'revisionary' ); + $this->option_checkbox( 'scheduled_publish_cron', $tab, $section, $hint, '' ); + + if (!rvy_get_option('scheduled_publish_cron')) { + $hint = esc_html__( 'Publish scheduled revisions asynchronously, via a secondary http request from the server. This is usually best since it eliminates delay, but some servers may not support it.', 'revisionary' ); + $this->option_checkbox( 'async_scheduled_publish', $tab, $section, $hint, '' ); + } + + if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) { + $hint = esc_html__( 'The WP-Cron trigger is disabled, but scheduled tasks are still excecuted using a custom trigger.', 'revisionary' ); + $this->option_checkbox( 'wp_cron_usage_detected', $tab, $section, $hint, '' ); + } + ?> +
+ form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox( 'revisor_lock_others_revisions', $tab, $section, $hint, '' ); + + $hint = esc_html__('This restriction applies to users who are not full editors for the post type. To enable a role, give it the list_others_revisions capability.', 'revisionary'); + $this->option_checkbox( 'revisor_hide_others_revisions', $tab, $section, $hint, '' ); + + $hint = esc_html__('Bypass the above restrictions for others\' revisions to logged in user\'s own posts.', 'revisionary'); + $this->option_checkbox( 'admin_revisions_to_own_posts', $tab, $section, $hint, '' ); + + $hint = ''; + $this->option_checkbox( 'list_unsubmitted_revisions', $tab, $section, $hint, '' ); + ?> + + +

+ +

+ + +
+ form_options[$tab][$section] ) ) :?> + ">
+ + option_checkbox( 'revision_preview_links', $tab, $section, $hint, '' ); + + $id = 'preview_link_type'; + if ( in_array( $id, $this->form_options[$tab][$section] ) ) { + $this->all_options []= $id; + $current_setting = rvy_get_option($id, $sitewide, $customize_defaults); + + echo '
'; + echo "'; + + echo "  '; + + if ( $this->display_hints ) : ?> +
+
+ +
+ '; + + if (defined('RVY_PREVIEW_ARG_LOCKED') && defined('RVY_PREVIEW_ARG')) { + printf( + esc_html__( + 'The revision preview argument is configured by constant definition: %s', + 'revisionary' + ), + RVY_PREVIEW_ARG + ); + } else { + $hint = esc_html__('Adjust preview links to use "rv_preview" argument instead of "preview". Experiment to see which works best with your theme.', 'revisionary'); + $this->option_checkbox( 'preview_link_alternate_preview_arg', $tab, $section, $hint, '' ); + } + ?> +
+
+ option_checkbox( 'home_preview_set_home_flag', $tab, $section, $hint, '' ); + ?> +
+ + option_checkbox( 'compare_revisions_direct_approval', $tab, $section, $hint, '' ); + ?> +
+ + option_checkbox( 'block_editor_extra_preview_button', $tab, $section, $hint, '' ); + ?> +
+form_options[$tab][$section] ) ) :?> + ">
+ + +
+ + ', + '' + ); + ?> + +
+ + + option_checkbox( 'trigger_post_update_actions', $tab, $section, $hint, '' ); + + $hint = ''; + $this->option_checkbox( 'copy_revision_comments_to_post', $tab, $section, $hint, '' ); + + $hint = ''; + $this->option_checkbox( 'diff_display_strip_tags', $tab, $section, $hint, '' ); + + echo "
"; + + $id = 'past_revisions_order_by'; + if ( in_array( $id, $this->form_options[$tab][$section] ) ) { + echo esc_html($this->option_captions[$id]); + + $this->all_options []= $id; + $current_setting = rvy_get_option($id, $sitewide, $customize_defaults); + + echo "  '; + + echo "

"; + } + + $hint = esc_html__( 'Show descriptive captions for PublishPress Revisions settings', 'revisionary' ); + $this->option_checkbox( 'display_hints', $tab, $section, $hint, '' ); + + if (defined('PUBLISHPRESS_VERSION')) { + echo "
"; + $this->option_checkbox( 'rev_publication_delete_ed_comments', $tab, $section, $hint, '' ); + } + + do_action('revisionary_option_ui_revision_options', $this); + + $hint = ''; + $this->option_checkbox( 'revision_archive_deletion', $tab, $section, $hint, '' ); + + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + $hint = esc_html__('Non-Administrators cannot restore a revision without the restore_revisions capability', 'revisionary'); + $this->option_checkbox( 'revision_restore_require_cap', $tab, $section, $hint, '' ); + } + ?> + +
+ form_options[$tab][$section] ) ) :?> + "> + + + + + + + + +
+ + form_options[$tab][$section] ) ) { + $this->all_options []= $id; + $current_setting = rvy_get_option($id, $sitewide, $customize_defaults); + + echo " '; + + echo esc_html($this->option_captions[$id]); + + echo ( defined('RVY_CONTENT_ROLES') && $group_link = $revisionary->content_roles->get_metagroup_edit_link( 'Pending Revision Monitors' ) ) ? + sprintf( " • " . esc_html__('select recipients', 'revisionary') . "", $group_link ) : ''; + + echo "
"; + } + + $id = 'pending_rev_notify_author'; + if ( in_array( $id, $this->form_options[$tab][$section] ) ) { + $this->all_options []= $id; + $current_setting = rvy_get_option($id, $sitewide, $customize_defaults); + + echo " '; + + echo esc_html($this->option_captions[$id]); + echo "
"; + } + + if (rvy_get_option('pending_rev_notify_admin') || rvy_get_option('pending_rev_notify_author')) { + $hint = ''; + $this->option_checkbox( 'revision_update_notifications', $tab, $section, $hint, '' ); + } + + $hint = ''; + $this->option_checkbox( 'pending_rev_notify_revisor', $tab, $section, $hint, '' ); + + echo '
'; + + $hint = ''; + $this->option_checkbox( 'rev_approval_notify_admin', $tab, $section, $hint, '' ); + + $hint = ''; + $this->option_checkbox( 'rev_approval_notify_author', $tab, $section, $hint, '' ); + + $hint = ''; + $this->option_checkbox( 'rev_approval_notify_revisor', $tab, $section, $hint, '' ); + } + + if( $scheduled_revisions_available ) { + echo '
'; + + $subcaption = ( defined('RVY_CONTENT_ROLES') && $group_link = $revisionary->content_roles->get_metagroup_edit_link( 'Scheduled Revision Monitors' ) ) ? + sprintf( " • " . esc_html__('select recipients', 'revisionary') . "", $group_link ) : ''; + + $hint = ''; + $this->option_checkbox( 'publish_scheduled_notify_admin', $tab, $section, $hint, '', array( 'subcaption' => $subcaption ) ); + + $hint = ''; + $this->option_checkbox( 'publish_scheduled_notify_author', $tab, $section, $hint, '' ); + + $hint = ''; + $this->option_checkbox( 'publish_scheduled_notify_revisor', $tab, $section, $hint, '' ); + } + + echo '
'; + + $hint = esc_html__('To avoid notification failures, buffer emails for delayed sending once minute, hour or day limits are exceeded', 'revisionary'); + $this->option_checkbox( 'use_notification_buffer', $tab, $section, $hint, '' ); + + if (!empty($_REQUEST['truncate_mail_log'])) { + delete_option('revisionary_sent_mail'); + } + + if (!empty($_REQUEST['clear_mail_buffer'])) { + delete_option('revisionary_mail_buffer'); + } + + if (!empty($_SERVER['REQUEST_URI'])) { + $uri = esc_url(esc_url_raw($_SERVER['REQUEST_URI'])); + } else { + $uri = ''; + } + + if (!empty($_REQUEST['mailinfo'])) { + $verbose = !empty($_REQUEST['verbose']); + + if ($q = get_option('revisionary_mail_buffer')) { + echo '

' . esc_html__('Notification Buffer', 'revisionary') . '

'; + foreach($q as $row) { + if (!$verbose) { + unset($row['message']); + } elseif(!empty($row['message'])) { + $row['message'] = '
' . str_replace("\r\n", '
', $row['message']); + } + + $row['time_gmt'] = gmdate('Y-m-d, H:i:s', $row['time_gmt']); + if (isset($row['time'])) { + $row['time'] = gmdate('Y-m-d, g:i:s a', $row['time']); + } + + foreach($row as $k => $val) { + if ($k != 'message') { + echo "" . esc_html($k) . " : " . esc_html($val) . "
"; + } + } + + if ($verbose && !empty($row['message'])) { + echo "message : " . esc_html($row['message']) . "
"; + } + + echo '
'; + } + } + + if ($log = get_option('revisionary_sent_mail')) { + echo '

' . esc_html__('Notification Log', 'revisionary') . '

'; + foreach($log as $row) { + if (!$verbose) { + unset($row['message']); + } elseif(!empty($row['message'])) { + $row['message'] = '
' . str_replace("\r\n", '
', $row['message']); + } + + $row['time_gmt'] = gmdate('Y-m-d, H:i:s', $row['time_gmt']); + if (isset($row['time'])) { + $row['time'] = gmdate('Y-m-d, g:i:s a', $row['time']); + } + + foreach($row as $k => $val) { + if ($k != 'message') { + echo "" . esc_html($k) . " : " . esc_html($val) . "
"; + } + } + + if ($verbose && !empty($row['message'])) { + echo "message : " . esc_html($row['message']) . "
"; + } + + echo '
'; + } + } + + if (get_option('revisionary_mail_buffer')):?> +
+ +
+ + + +
+ + true]); + ?> +

+

sent_counts['minute'], $mail_info->send_limits['minute']));?>

+

sent_counts['hour'], $mail_info->send_limits['hour']));?>

+

sent_counts['day'], $mail_info->send_limits['day']));?>

+ 0) { + echo '
'; + echo esc_html(sprintf(__('Seconds until next buffer processing time: %d', 'revisionary'), $wait_sec)); + } + } + } + } + + if (empty($_REQUEST['mailinfo'])):?> +
+
+ + +

+ +
+ +
+ + +

+ + + +

+ +
+ +

+
+ + +
+ +
+ + + +"; + +echo '
    '; +$all_movable_options = array(); + +unset($available_form_options['features']['license']); + +foreach ( $available_form_options as $tab_name => $sections ) { + echo '
  • '; + + $explanatory_caption = __( 'Specify which PublishPress Revisions Settings to control network-wide. Unselected settings are controlled separately on each site.', 'revisionary' ); + + if ( isset( $this->tab_captions[$tab_name] ) ) + $tab_caption = $this->tab_captions[$tab_name]; + else + $tab_caption = $tab_name; + + echo '
    '; + if ( count( $available_form_options ) > 1 ) { + if ( $this->display_hints ) + printf( esc_html(_x( '%1$s%2$s%3$s (%4$s)', 'opentag option_tabname closetag (explanatory note)', 'revisionary' )), '', esc_html($tab_caption), '', esc_html($explanatory_caption) ); + else + echo esc_html($tab_caption); + } elseif ( $this->display_hints ) { + echo esc_html($explanatory_caption); + } + + echo '
    '; + + echo '
      '; + + foreach ( $sections as $section_name => $option_names ) { + if ( empty( $sections[$section_name] ) ) + continue; + + echo '
    • '; + + if ( isset( $this->section_captions[$tab_name][$section_name] ) ) + echo esc_html($this->section_captions[$tab_name][$section_name]); + else + echo esc_html(ucwords(str_replace('_', ' ', $section_name))); + + echo '
        '; + + foreach ( $option_names as $option_name ) { + if ( $option_name && !empty($this->option_captions[$option_name]) ) { + $all_movable_options []= $option_name; + echo '
      • '; + + $disabled = ( in_array( $option_name, array( 'file_filtering', 'mu_sitewide_groups' ) ) ) ? "disabled" : ''; + + $id = "{$option_name}_sitewide"; + $val = isset( $rvy_options_sitewide[$option_name] ); + echo "
      • '; + } + } + + echo '

      '; + } + echo '


    '; +} +echo '
'; + +echo '
'; + +$all_movable_options = implode(',', $all_movable_options); +echo ""; + +endif; // any options accessable in this tab +// ------------------------- END Option Scope tab --------------------------------- + + +$this->all_options = implode(',', $this->all_options); +echo ""; + +echo ""; +?> +

+ +" style="float:right;" /> +

+ +
+
+
+ + + +

+ + + + + +options_ui($sitewide, $customize_defaults); +} diff --git a/wp-content/plugins/revisionary/admin/post-edit-block-ui_rvy.php b/wp-content/plugins/revisionary/admin/post-edit-block-ui_rvy.php new file mode 100644 index 000000000..242595eb5 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/post-edit-block-ui_rvy.php @@ -0,0 +1,184 @@ +post_modified_gmt == $_post->post_date_gmt) { + global $wpdb; + + $_post->post_modified_gmt = gmdate('Y/m/d H:i:s', strtotime($_post->post_modified_gmt) - 1); + $_post->post_modified = gmdate('Y/m/d H:i:s', strtotime($_post->post_modified) - 1); + $wpdb->update($wpdb->posts, ['post_modified_gmt' => $_post->post_modified_gmt, 'post_modified' => $_post->post_modified], ['ID' => $_post->ID]); + + if (!get_transient("revisionary-post-edit-redirect-{$_post_id}")) { + set_transient("revisionary-post-edit-redirect-{$_post_id}", true, 30); + wp_redirect(esc_url_raw($_SERVER['REQUEST_URI'])); + exit; + } + } + } + } +} + +if (rvy_post_revision_supported($_post_id)) { + add_action( 'enqueue_block_editor_assets', ['RVY_PostBlockEditUI', 'disablePublishPressStatusesScripts'], 1); + add_action( 'enqueue_block_editor_assets', array( 'RVY_PostBlockEditUI', 'act_object_guten_scripts' ) ); +} + +class RVY_PostBlockEditUI { + public static function disablePublishPressStatusesScripts() { + global $publishpress; + + if ($post_id = rvy_detect_post_id()) { + if (rvy_in_revision_workflow($post_id)) { + if (!empty($publishpress) && !empty($publishpress->custom_status->module->options)) { + $publishpress->custom_status->module->options->post_types = []; + } + + // Permalink Manager plugin + add_filter('permalink_manager_show_uri_editor_post', + function($enable, $post_obj, $post_type) { + return false; + }, + 10, 3 + ); + } + } + } + + public static function act_object_guten_scripts() { + global $current_user, $revisionary, $pagenow, $post, $wp_version; + + if ('post-new.php' == $pagenow) { + return; + } + + if (empty($post)) { + return; + } + + if (!$type_obj = get_post_type_object($post->post_type)) { + return; + } + + if (empty($revisionary->enabled_post_types[$post->post_type]) || !$revisionary->config_loaded) { + return; + } + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '.dev' : ''; + + $do_pending_revisions = rvy_get_option('pending_revisions'); + $do_scheduled_revisions = rvy_get_option('scheduled_revisions'); + + if (('revision' == $post->post_type) || rvy_in_revision_workflow($post)) { + wp_enqueue_script( 'rvy_object_edit', RVY_URLPATH . "/admin/rvy_revision-block-edit{$suffix}.js", array('jquery', 'jquery-form'), PUBLISHPRESS_REVISIONS_VERSION, true ); + + $args = \PublishPress\Revisions\PostEditorWorkflowUI::revisionLinkParams(compact('post', 'do_pending_revisions', 'do_scheduled_revisions')); + + $args['deleteCaption'] = (defined('RVY_DISCARD_CAPTION')) ? esc_html__('Discard Revision', 'revisionary') : esc_html__('Delete Revision', 'revisionary'); + + if (!empty($type_obj->cap->edit_others_posts) && current_user_can($type_obj->cap->edit_others_posts)) { + add_action('admin_print_footer_scripts', ['RVY_PostBlockEditUI', 'author_ui'], 20); + } + } elseif (current_user_can('edit_post', $post->ID)) { + $status_obj = get_post_status_object($post->post_status); + + if (empty($status_obj->public) && empty($status_obj->private) && !rvy_get_option('pending_revision_unpublished')) { + return; + } + + wp_enqueue_script( 'rvy_object_edit', RVY_URLPATH . "/admin/rvy_post-block-edit{$suffix}.js", array('jquery', 'jquery-form'), PUBLISHPRESS_REVISIONS_VERSION, true ); + + $args = \PublishPress\Revisions\PostEditorWorkflowUI::postLinkParams(compact('post', 'do_pending_revisions', 'do_scheduled_revisions')); + } + + wp_localize_script( 'rvy_object_edit', 'rvyObjEdit', $args ); + } + + public static function author_ui() { + global $post; + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + return []; + } + + if (!$type_obj = get_post_type_object($post->post_type)) { + return []; + } + + $published_post_id = rvy_post_id($post->ID); + $published_author = get_post_field('post_author', $published_post_id); + + $author_selection = get_post_meta($post->ID, '_rvy_author_selection', true); + + $select_html = wp_dropdown_users( + array( + 'capability' => [$type_obj->cap->edit_posts], + 'name' => 'rvy_post_author', + 'selected' => ($author_selection) ? $author_selection : $published_author, + 'include_selected' => true, + 'show' => 'display_name_with_login', + 'echo' => false, + ) + ); + + $select_html = str_replace(["\n", "\r"], '', $select_html); + + ?> + + '); + + if ( ! $('#timestampdiv a.now-timestamp').length ) { + $('#timestampdiv a.cancel-timestamp').after('' + rvyPostEdit.nowCaption + ''); + } + $('#timestampdiv a.now-timestamp').on('click', function(){ + var nowDate = new Date(); + var month = nowDate.getMonth() + 1; + if ( month.toString().length < 2 ) { + month = '0' + month; + } + $('#mm').val(month); + + $('#jj').val(nowDate.getDate()); + $('#aa').val(nowDate.getFullYear()); + $('#hh').val(nowDate.getHours()); + + var minutes = nowDate.getMinutes(); + if ( minutes.toString().length < 2 ) { + minutes = '0' + minutes; + } + $('#mn').val(minutes); + }); +}); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/post-edit_rvy.php b/wp-content/plugins/revisionary/admin/post-edit_rvy.php new file mode 100644 index 000000000..60f3c60c7 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/post-edit_rvy.php @@ -0,0 +1,297 @@ + + + + post_type)) { + return; + } + + wp_enqueue_script( 'rvy_post', RVY_URLPATH . "/admin/post-edit.js", array('jquery'), PUBLISHPRESS_REVISIONS_VERSION, true ); + + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '.dev' : ''; + + $do_pending_revisions = rvy_get_option('pending_revisions'); + $do_scheduled_revisions = rvy_get_option('scheduled_revisions'); + + if (('revision' == $post->post_type) || rvy_in_revision_workflow($post)) { + wp_enqueue_script('rvy_object_edit', RVY_URLPATH . "/admin/rvy_revision-classic-edit{$suffix}.js", ['jquery', 'jquery-form'], PUBLISHPRESS_REVISIONS_VERSION, true); + + $args = \PublishPress\Revisions\PostEditorWorkflowUI::revisionLinkParams(compact('post', 'do_pending_revisions', 'do_scheduled_revisions')); + + $args['deleteCaption'] = (defined('RVY_DISCARD_CAPTION')) ? esc_html__( 'Discard Revision', 'revisionary' ) : esc_html__('Delete Revision', 'revisionary'); + + $args['submissionDelay'] = (defined('PUBLISHPRESS_VERSION')) ? 2000 : 200; + + wp_localize_script( 'rvy_object_edit', 'rvyObjEdit', $args ); + + if (defined('PUBLISHPRESS_VERSION')) { + wp_dequeue_script('publishpress-custom_status'); + wp_dequeue_style('publishpress-custom_status'); + } + + $type_obj = get_post_type_object($post->post_type); + + if ($type_obj && !empty($type_obj->cap->edit_others_posts) && current_user_can($type_obj->cap->edit_others_posts)) { + add_action('admin_print_footer_scripts', ['RvyPostEdit', 'author_ui'], 20); + } + + } elseif (current_user_can('edit_post', $post->ID)) { + if (rvy_post_revision_supported($post)) { + $status_obj = get_post_status_object($post->post_status); + + if (('future' != $post->post_status) && (!empty($status_obj->public) || !empty($status_obj->private) || rvy_get_option('pending_revision_unpublished'))) { + wp_enqueue_script('rvy_object_edit', RVY_URLPATH . "/admin/rvy_post-classic-edit{$suffix}.js", ['jquery', 'jquery-form'], PUBLISHPRESS_REVISIONS_VERSION, true); + + $args = \PublishPress\Revisions\PostEditorWorkflowUI::postLinkParams(compact('post', 'do_pending_revisions', 'do_scheduled_revisions')); + wp_localize_script( 'rvy_object_edit', 'rvyObjEdit', $args ); + } + } else { + return; + } + } + + $args = array( + 'nowCaption' => esc_html__( 'Current Time', 'revisionary' ), + ); + wp_localize_script( 'rvy_post', 'rvyPostEdit', $args ); + } + + public function fltPreviewLabel($preview_caption) { + global $post; + + $type_obj = get_post_type_object($post->post_type); + + if ($type_obj && empty($type_obj->public)) { + return $preview_caption; + } + + $preview_caption = esc_html__('Preview'); + + return $preview_caption; + } + + public function fltPreviewTitle($preview_title) { + global $post; + + if (!empty($post) && !empty($post->ID) && rvy_in_revision_workflow($post->ID)) { + $type_obj = get_post_type_object($post->post_type); + + if ($type_obj && !empty($type_obj->public)) { + $preview_title = esc_html__('View revision in progress', 'revisionary'); + } + } + + return $preview_title; + } + + function actPostSubmitboxActions($post) { + ?> + +
+ +
+ + ID)) { + return; + } + + if (!rvy_in_revision_workflow($post->ID)) { + return; + } + + if ($type_obj = get_post_type_object($post->post_type)) { + if (empty($type_obj->public) && empty($type_obj->publicly_queryable)) { + return; + } + } + + ?> + ID); + $preview_button = esc_html__('View Saved Revision'); + + if (current_user_can('edit_post', rvy_post_id($post->ID))) { + $preview_title = esc_html__('View / moderate saved revision', 'revisionary'); + + } elseif ($type_obj && !empty($type_obj->public)) { + $preview_title = esc_html__('View saved revision', 'revisionary'); + } + + ?> + + ID) || !rvy_is_supported_post_type($post->post_type)) { + return; + } + + if (rvy_get_option('scheduled_revisions')) { + if ($_revisions = rvy_get_post_revisions($post->ID, 'future-revision', ['orderby' => 'ID', 'order' => 'ASC'])) { + ?> +
+  ', '' . esc_html(count($_revisions)) . ''); + ?> + ID&revision=future-revision")); ?>" target="_revision_diff"> +
+ ID, 'pending-revision', ['orderby' => 'ID', 'order' => 'ASC'])) { + ?> +
+  ', '' . esc_html(count($_revisions)) . ''); + ?> + ID&revision=pending-revision")); ?>" target="_revision_diff"> +
+ post_type && current_user_can('edit_post', $_post->post_parent)) { + if (did_action('post_submitbox_minor_actions')) { + if (!did_action('post_submitbox_misc_actions')) { + $wp_blogcaps = array_merge($wp_blogcaps, array_fill_keys($reqd_caps, true)); + } else { + remove_filter('user_has_cap', [$this, 'fltAllowBrowseRevisionsLink'], 50, 3); + } + } + } + } + + } + + return $wp_blogcaps; + } + + function fltRevisionAllowance($allowance, $post_id) { + // Ensure that revision "edit" link is not suppressed for the Revisions > Browse link + if (did_action('post_submitbox_minor_actions') && !did_action('post_submitbox_misc_actions')) { + $allowance = true; + } + + return $allowance; + } + + // @todo: merge with RVY_PostBlockEditUI::author_ui() + public static function author_ui() { + global $post; + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + return []; + } + + if (!$type_obj = get_post_type_object($post->post_type)) { + return []; + } + + $published_post_id = rvy_post_id($post->ID); + $published_author = get_post_field('post_author', $published_post_id); + + $author_selection = get_post_meta($post->ID, '_rvy_author_selection', true); + + $select_html = wp_dropdown_users( + array( + 'capability' => [$type_obj->cap->edit_posts], + 'name' => 'rvy_post_author', + 'selected' => ($author_selection) ? $author_selection : $published_author, + 'include_selected' => true, + 'show' => 'display_name_with_login', + 'echo' => false, + ) + ); + + $select_html = str_replace(["\n", "\r"], '', $select_html); + ?> + + false, 'do_pending_revisions' => true, 'do_scheduled_revisions' => true]; + $args = array_merge( $defaults, $args ); + foreach( array_keys($defaults) as $var ) { $$var = $args[$var]; } + + global $wp_version; + + if (empty($post)) { + return []; + } + + if (!$type_obj = get_post_type_object($post->post_type)) { + return []; + } + + $published_post_id = rvy_post_id($post->ID); + + $block_editor = \PublishPress\Revisions\Utils::isBlockEditorActive($post->post_type); + + $can_publish = current_user_can('edit_post', $published_post_id); + + $vars = [ + 'postID' => $post->ID, + 'saveRevision' => pp_revisions_label('update_revision'), + 'scheduledRevisionsEnabled' => $do_scheduled_revisions, + 'multiPreviewActive' => version_compare($wp_version, '5.5-beta', '>='), + 'statusLabel' => esc_html__('Status', 'revisionary'), + 'ajaxurl' => rvy_admin_url(''), + 'currentStatus' => str_replace('-revision', '', $post->post_mime_type), + 'currentPostAuthor' => get_post_field('post_author', $published_post_id), + 'onApprovalCaption' => esc_html__('(on approval)', 'revisionary'), + 'canPublish' => $can_publish + ]; + + $vars['disableRecaption'] = version_compare($wp_version, '5.9-beta', '>=') || is_plugin_active('gutenberg/gutenberg.php'); + $vars['viewTitle'] = ''; + $vars['viewTitleExtra'] = ''; + + if (rvy_get_option('revision_preview_links') || current_user_can('administrator') || is_super_admin()) { + $vars['viewURL'] = rvy_preview_url($post); + + if ($type_obj && empty($type_obj->public)) { + $vars['viewURL'] = ''; + $vars['viewCaption'] = ''; + $vars['viewTitle'] = ''; + + } elseif ($can_publish) { + if (version_compare($wp_version, '5.5-beta', '>=')) { + $vars['viewCaption'] = ($block_editor) ? esc_html__('Preview this Revision', 'revisionary') : esc_html__('Preview', 'revisionary'); + } else { + $vars['viewCaption'] = ('future-revision' == $post->post_mime_type) ? esc_html__('View / Publish', 'revisionary') : esc_html__('View / Approve', 'revisionary'); + } + + if (rvy_get_option('block_editor_extra_preview_button')) { + $vars['viewTitleExtra'] = esc_html__('View saved revision', 'revisionary'); + } + + $vars['viewTitle'] = esc_html__('View / Moderate saved revision', 'revisionary'); + } else { + $vars['viewCaption'] = version_compare($wp_version, '5.5-beta', '>=') ? esc_html__('Preview / Submit') : esc_html__('View / Submit'); + + if (rvy_get_option('block_editor_extra_preview_button')) { + $vars['viewTitleExtra'] = esc_html__('View saved revision', 'revisionary'); + } + + $vars['viewTitle'] = esc_html__('View / Submit saved revision', 'revisionary'); + } + + } else { + $vars['viewURL'] = ''; + $vars['viewCaption'] = ''; + $vars['viewTitle'] = ''; + } + + $vars['previewTitle'] = esc_html__('View unsaved changes', 'revisionary'); + + $_revisions = wp_get_post_revisions($post->ID); + if ($_revisions && count($_revisions) > 1) { + $vars['revisionEdits'] = sprintf(esc_html(_n('%s%s Revision Edit', '%s%s Revision Edits', count($_revisions), 'revisionary')), ' ', count($_revisions)); + } else { + $vars['revisionEdits'] = ''; + } + + $redirect_arg = ( ! empty($_REQUEST['rvy_redirect']) ) ? "&rvy_redirect=" . esc_url_raw($_REQUEST['rvy_redirect']) : ''; + + $draft_obj = get_post_status_object('draft-revision'); + $vars['draftStatusCaption'] = $draft_obj->label; + + $vars['draftAjaxField'] = (current_user_can('administrator') || current_user_can('set_revision_pending-revision', $post->ID)) ? 'submit_revision' : ''; + $vars['draftErrorCaption'] = esc_html__('Revision Submission Error', 'revisionary'); + $vars['draftDeletionURL'] = get_delete_post_link($post->ID, '', false); + + if ($vars['draftAjaxField']) { + $vars['draftActionCaption'] = ($can_publish) ? pp_revisions_status_label('pending-revision', 'submit_short') : pp_revisions_status_label('pending-revision', 'submit'); + $vars['draftActionURL'] = ''; + $vars['draftInProcessCaption'] = pp_revisions_status_label('pending-revision', 'submitting'); + $vars['draftCompletedCaption'] = pp_revisions_status_label('pending-revision', 'submitted'); + + $preview_caption = ($block_editor) ? esc_html__('Preview this Revision', 'revisionary') : esc_html__('Preview', 'revisionary'); + + $vars['draftCompletedLinkCaption'] = (!empty($type_obj->public)) ? $preview_caption : ''; + $vars['draftCompletedURL'] = (!empty($type_obj->public)) ? rvy_preview_url($post) : ''; + + $vars['draftCompletedEditCaption'] = esc_html__('Edit', 'revisionary'); + $vars['draftCompletedEditURL'] = admin_url("post.php?post={$post->ID}&action=edit"); + } else { + $vars['draftActionCaption'] = ''; + } + + $vars['approveCaption'] = ($can_publish) ? pp_revisions_status_label('pending-revision', 'approve_short') : ''; + $vars['approvingCaption'] = __('Approving the Revision...', 'revisionary'); + + $pending_obj = get_post_status_object('pending-revision'); + $vars['pendingStatusCaption'] = $pending_obj->label; + + $future_obj = get_post_status_object('future-revision'); + $vars['futureStatusCaption'] = $future_obj->label; + + if ($can_publish) { + $vars['pendingActionCaption'] = pp_revisions_status_label('pending-revision', 'approve'); + $vars['pendingActionURL'] = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision={$post->ID}&action=approve$redirect_arg&editor=1"), "approve-post_$published_post_id|{$post->ID}" ); + + $vars['pendingInProcessCaption'] = pp_revisions_status_label('pending-revision', 'approving'); + + $vars['futureActionCaption'] = pp_revisions_status_label('future-revision', 'publish'); + $vars['futureActionURL'] = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision={$post->ID}&action=publish$redirect_arg&editor=1"), "publish-post_$published_post_id|{$post->ID}" ); + + $vars['pendingDeletionURL'] = get_delete_post_link($post->ID, '', false); + $vars['futureDeletionURL'] = $vars['pendingDeletionURL']; + } else { + $vars['pendingActionURL'] = ''; + $vars['futureActionURL'] = ''; + $vars['pendingDeletionURL'] = ''; + $vars['futureDeletionURL'] = ''; + } + + if ($block_editor) { + $vars['updateCaption'] = esc_html__('Update Revision', 'revisionary'); + } else { + if (!$vars['updateCaption'] = pp_revisions_status_label($post->post_mime_type, 'update')) { + $vars['updateCaption'] = pp_revisions_label('update_revision'); + } + } + + $vars['approvalLocked'] = false; + + return $vars; + } + + public static function postLinkParams($args = []) { + $defaults = ['post' => false, 'do_pending_revisions' => true, 'do_scheduled_revisions' => true]; + $args = array_merge( $defaults, $args ); + foreach( array_keys($defaults) as $var ) { $$var = $args[$var]; } + + global $wp_version; + + if (empty($post)) { + return []; + } + + if (!$type_obj = get_post_type_object($post->post_type)) { + return []; + } + + $type_obj = get_post_type_object($post->post_type); + + $vars = ['postID' => $post->ID, 'currentStatus' => $post->post_status]; + + if ($do_pending_revisions && $_revisions = rvy_get_post_revisions($post->ID, 'pending-revision', ['orderby' => 'ID', 'order' => 'ASC'])) { + $status_obj = get_post_status_object('pending-revision'); + + $status_label = (count($_revisions) <= 1) ? pp_revisions_status_label('pending-revision', 'name') : pp_revisions_status_label('pending-revision', 'plural'); + $vars['pendingRevisionsCaption'] = sprintf(' %s %s', count($_revisions), $status_label); + + $vars['pendingRevisionsURL'] = rvy_admin_url("revision.php?post_id=$post->ID&revision=pending-revision"); // @todo: fix i8n + } else { + $vars['pendingRevisionsURL'] = ''; + } + + if ($do_scheduled_revisions && $_revisions = rvy_get_post_revisions($post->ID, 'future-revision', ['orderby' => 'ID', 'order' => 'ASC'])) { + $status_obj = get_post_status_object('future-revision'); + + $status_label = (count($_revisions) <= 1) ? pp_revisions_status_label('future-revision', 'name') : pp_revisions_status_label('future-revision', 'plural'); + $vars['scheduledRevisionsCaption'] = sprintf(' %s %s', count($_revisions), $status_label); + + $vars['scheduledRevisionsURL'] = rvy_admin_url("revision.php?post_id=$post->ID&revision=future-revision"); + } else { + $vars['scheduledRevisionsURL'] = ''; + } + + $redirect_arg = ( ! empty($_REQUEST['rvy_redirect']) ) ? "&rvy_redirect=" . esc_url_raw($_REQUEST['rvy_redirect']) : ''; + $published_post_id = rvy_post_id($post->ID); + + $is_block_editor = \PublishPress\Revisions\Utils::isBlockEditorActive($post->post_type); + $preview_caption = $is_block_editor ? esc_html__('Preview Revision', 'revisionary') : esc_html__('Preview', 'revisionary'); + $edit_caption = $is_block_editor ? esc_html__('Edit Revision', 'revisionary') : esc_html__('Edit', 'revisionary'); + + if (rvy_get_option('pending_revisions') && current_user_can('copy_post', $post->ID)) { + $vars = array_merge($vars, array( + 'actionCaption' => pp_revisions_status_label('draft-revision', 'submit'), + 'actionTitle' => '', + 'actionDisabledTitle' => esc_attr(sprintf(esc_html__('Update post before creating %s.', 'revisionary'), strtolower(pp_revisions_status_label('draft-revision', 'basic')))), + 'creatingCaption' => pp_revisions_status_label('draft-revision', 'submitting'), + 'completedCaption' => pp_revisions_status_label('draft-revision', 'submitted'), + 'completedLinkCaption' => (!empty($type_obj->public)) ? $preview_caption : '', + 'completedURL' => (!empty($type_obj->public)) ? rvy_nc_url( add_query_arg('get_new_revision', $post->ID, admin_url(''))) : '', + 'completedEditLinkCaption' => $edit_caption, + 'completedEditURL' => rvy_nc_url( add_query_arg(['edit_new_revision' => $post->ID, 'published_post' => $post->ID], admin_url('admin.php?page=revisionary-q'))), + 'errorCaption' => esc_html__('Error Creating Revision', 'revisionary'), + 'ajaxurl' => rvy_admin_url(''), + 'update' => esc_html__('Update', 'revisionary'), + 'postID' => $post->ID + )); + } else { + $vars['actionCaption'] = ''; + } + + if (rvy_get_option('scheduled_revisions') && current_user_can($type_obj->cap->publish_posts)) { + $published_statuses = array_merge(get_post_stati(['public' => true]), get_post_stati(['private' => true])); + + $vars = array_merge($vars, array( + 'publishedStatuses' => $published_statuses, + 'scheduleCaption' => pp_revisions_status_label('future-revision', 'submit'), + 'scheduleTitle' => '', + 'scheduleDisabledTitle' => esc_attr(sprintf(esc_html__('For custom field changes, edit a scheduled %s.', 'revisionary'), strtolower(pp_revisions_status_label('draft-revision', 'basic')))), + 'scheduledCaption' => pp_revisions_status_label('future-revision', 'submitted'), + 'scheduledLinkCaption' => (!empty($type_obj->public)) ? $preview_caption : '', + 'scheduledURL' => (!empty($type_obj->public)) ? rvy_nc_url( add_query_arg('get_new_revision', $post->ID, admin_url(''))) : '', + 'scheduledEditLinkCaption' => $edit_caption, + 'scheduledEditURL' => rvy_nc_url( add_query_arg(['edit_new_revision' => $post->ID, 'published_post' => $post->ID], admin_url('admin.php?page=revisionary-q'))), + 'update' => esc_html__('Update', 'revisionary'), + )); + + if (empty($vars['actionCaption'])) { + $vars = array_merge($vars, array( + 'actionCaption' => '', + 'ajaxurl' => rvy_admin_url(''), + )); + } + } + + return $vars; + } +} diff --git a/wp-content/plugins/revisionary/admin/revision-action_rvy.php b/wp-content/plugins/revisionary/admin/revision-action_rvy.php new file mode 100644 index 000000000..ce7fea447 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/revision-action_rvy.php @@ -0,0 +1,1712 @@ + + * @copyright Copyright (c) 2024 PublishPress. All rights reserved. + * @license GPLv2 or later + * @since 1.0.0 + */ +function rvy_revision_diff() { +} + +function rvy_revision_create($post_id = 0, $args = []) { + if (!$post_id) { + if (isset($_REQUEST['post'])) { + $post_id = (int) $_REQUEST['post']; + } else { + return; + } + } + + if (!rvy_post_revision_supported($post_id)) { + return; + } + + $main_post_id = rvy_in_revision_workflow($post_id) ? rvy_post_id($post_id) : $post_id; + + if (!empty($args['force']) || current_user_can('copy_post', $main_post_id)) { + require_once( dirname(REVISIONARY_FILE).'/revision-creation_rvy.php' ); + $rvy_creation = new PublishPress\Revisions\RevisionCreation(); + $revision_id = $rvy_creation->createRevision($post_id, 'draft-revision', $args); + } else { + $revision_id = 0; + } + + return $revision_id; +} + +// Submits a revision (moving it to pending-revision status) +function rvy_revision_submit($revision_id = 0) { + global $wpdb, $revisionary; + + // PublishPress Authors: Don't alter revision author + remove_action( + 'save_post', + [ + 'MultipleAuthors\\Classes\\Post_Editor', + 'action_save_post_set_initial_author', + ], + 10, + 3 + ); + + if (!$revision_id) { + $batch_process = false; + + if (empty($_GET['revision'])) { + return; + } + + $revision_id = (int) $_GET['revision']; + } else { + $batch_process = true; + } + + $redirect = ''; + + do { + if (!$revision = get_post($revision_id)) { + break; + } + + if (!in_array($revision->post_status, ['draft', 'pending'])) { + break; + } + + if (!current_user_can('administrator') && !current_user_can('set_revision_pending-revision', $revision_id)) { + break; + } + + if (!$published_id = rvy_post_id($revision_id)) { + break; + } + + if (!$post = get_post($published_id)) { + break; + } + + if (!$batch_process) { + check_admin_referer( "submit-post_$post->ID|$revision->ID" ); + } + + $status_obj = get_post_status_object( $revision->post_mime_type ); + + // safeguard: make sure this hasn't already been published + if ( empty($status_obj->public) && empty($status_obj->private) ) { + $wpdb->update($wpdb->posts, ['post_status' => 'pending', 'post_mime_type' => 'pending-revision'], ['ID' => $revision_id]); + + if (defined('REVISIONARY_LIMIT_IGNORE_UNSUBMITTED')) { + rvy_update_post_meta($published_id, '_rvy_has_revisions', true); + } + + clean_post_cache($revision_id); + + require_once( dirname(REVISIONARY_FILE).'/revision-workflow_rvy.php' ); + $rvy_workflow_ui = new Rvy_Revision_Workflow_UI(); + + $args = ['revision_id' => $revision->ID, 'published_post' => $post, 'object_type' => $post->post_type]; + $rvy_workflow_ui->do_notifications('pending-revision', 'pending-revision', (array) $post, $args ); + } else { + $approval_error = true; + } + + if ( !empty($_REQUEST['rvy_redirect']) && 'edit' == $_REQUEST['rvy_redirect'] ) { + $last_arg = array( 'revision_action' => 1, 'published_post' => $revision->ID ); + $redirect = add_query_arg( $last_arg, "post.php?post=$revision_id&action=edit" ); + } else { + $redirect = rvy_preview_url($revision, ['post_type' => $post->post_type]); + } + + } while (0); + + if (!$batch_process) { + if ( ! $redirect ) { + if ( ! empty($post) && is_object($post) && ( 'post' != $post->post_type ) ) { + $redirect = "edit.php?post_type={$post->post_type}"; + } else + $redirect = 'edit.php'; + } + } + + if (empty($approval_error)) { + do_action( 'revision_submitted', $post->ID, $revision->ID ); + } + + if (!$batch_process) { + wp_redirect( $redirect ); + exit; + } + + if (empty($approval_error)) { + return true; + } +} + +// Unsubmits a revision (moving it back to draft-revision status) +function rvy_revision_decline($revision_id = 0) { + global $wpdb, $revisionary; + + if (!$revision_id) { + $batch_process = false; + + if (empty($_GET['revision'])) { + return; + } + + $revision_id = (int) $_GET['revision']; + } else { + $batch_process = true; + } + + $redirect = ''; + + do { + if (!$revision = get_post($revision_id)) { + break; + } + + if (!in_array($revision->post_status, ['draft', 'pending'])) { + break; + } + + if (!current_user_can('administrator') && !current_user_can('set_revision_pending-revision', $revision_id)) { + break; + } + + if (!$published_id = rvy_post_id($revision_id)) { + break; + } + + if (!$post = get_post($published_id)) { + break; + } + + if (!$batch_process) { + check_admin_referer('decline-revision'); + } + + $status_obj = get_post_status_object( $revision->post_mime_type ); + + $wpdb->update($wpdb->posts, ['post_status' => 'draft', 'post_mime_type' => 'draft-revision'], ['ID' => $revision_id]); + + clean_post_cache($revision_id); + + // @todo: notifications for revision decline + + /* + require_once( dirname(REVISIONARY_FILE).'/revision-workflow_rvy.php' ); + $rvy_workflow_ui = new Rvy_Revision_Workflow_UI(); + + $args = ['revision_id' => $revision->ID, 'published_post' => $post, 'object_type' => $post->post_type]; + $rvy_workflow_ui->do_notifications('pending-revision', 'pending-revision', (array) $post, $args ); + */ + + if ( !empty($_REQUEST['rvy_redirect']) && 'edit' == $_REQUEST['rvy_redirect'] ) { + $last_arg = array( 'revision_action' => 1, 'published_post' => $revision->ID ); + $redirect = add_query_arg( $last_arg, "post.php?post=$revision_id&action=edit" ); + } else { + $redirect = rvy_preview_url($revision, ['post_type' => $post->post_type]); + } + + } while (0); + + if (!$batch_process) { + if ( ! $redirect ) { + if ( ! empty($post) && is_object($post) && ( 'post' != $post->post_type ) ) { + $redirect = "edit.php?post_type={$post->post_type}"; + } else + $redirect = 'edit.php'; + } + } + + clean_post_cache($revision->ID); + + if (empty($decline_error)) { + do_action( 'revision_declined', $revision->post_parent, $revision->ID ); + } + + if (!$batch_process) { + wp_redirect( $redirect ); + exit; + } + + if (empty($decline_error)) { + return true; + } +} + +// schedules publication of a revision ( or publishes if requested publish date has already passed ) +function rvy_revision_approve($revision_id = 0, $args = []) { + global $current_user, $wpdb; + + if (!$revision_id) { + $batch_process = false; + + if (empty($_GET['revision'])) { + return; + } + + $revision_id = (int) $_GET['revision']; + } else { + $batch_process = true; + } + + $redirect = ''; + + $blogname = wp_specialchars_decode( get_option('blogname'), ENT_QUOTES ); + + do { + if ( !$revision = wp_get_post_revision( $revision_id ) ) { + if (!$revision = get_post($revision_id)) { + break; + } + } + + $published_id = ('revision' == $revision->post_type) ? $revision->post_parent : rvy_post_id($revision_id); + + if (!$published_id) { + break; + } + + if (!$post = get_post($published_id)) { + break; + } + + if (!current_user_can('edit_post', $post->ID)) { + if ($batch_process) { + break; + } else { + return; + } + } + + if (!$batch_process) { + check_admin_referer( "approve-post_$post->ID|$revision->ID" ); + } + + if (!empty($_REQUEST['editor']) && !defined('REVISIONARY_IGNORE_AUTOSAVE')) { + if (!\PublishPress\Revisions\Utils::isBlockEditorActive()) { + if ($autosave_post = \PublishPress\Revisions\Utils::get_post_autosave($revision_id, $current_user->ID)) { + if (strtotime($autosave_post->post_modified_gmt) > strtotime($revision->post_modified_gmt)) { + $set_post_properties = [ + 'post_content', + 'post_content_filtered', + 'post_title', + 'post_excerpt', + ]; + + $update_data = []; + + foreach($set_post_properties as $prop) { + if (!empty($autosave_post) && !empty($autosave_post->$prop)) { + $update_data[$prop] = $autosave_post->$prop; + } + } + + if ($update_data) { + $wpdb->update($wpdb->posts, $update_data, ['ID' => $revision_id]); + } + + $wpdb->delete($wpdb->posts, ['ID' => $autosave_post->ID]); + } + } + } + } + + clean_post_cache($post->ID); + $published_url = get_permalink($post->ID); + + $db_action = false; + + // If requested publish date is in the past or now, publish the revision + if ( strtotime( $revision->post_date_gmt ) <= agp_time_gmt() ) { + $status_obj = get_post_status_object( $revision->post_mime_type ); + + if ( empty($status_obj->public) && empty($status_obj->private) ) { + $db_action = true; + + if ('revision' == $revision->post_type) { + // prep the revision to look like a normal one so WP doesn't reject it + $data = array( 'post_status' => 'inherit', 'post_date' => $revision->post_modified, 'post_date_gmt' => $revision->post_modified ); + + if ( class_exists('WPCom_Markdown') && ! defined( 'RVY_DISABLE_MARKDOWN_WORKAROUND' ) ) + $data['post_content_filtered'] = $revision->post_content; + + $wpdb->update( $wpdb->posts, $data, array( 'ID' => $revision->ID ) ); + + wp_restore_post_revision( $revision->ID, array( 'post_content', 'post_title', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt' ) ); + + rvy_format_content( $revision->post_content, $revision->post_content_filtered, $post->ID ); + + clean_post_cache( $revision->ID ); + } else { + $_result = rvy_apply_revision($revision->ID, $revision->post_mime_type); + + if (!$_result || is_wp_error($_result)) { + // Go ahead with the normal redirect because the revision may have been approved / published already. + // If revision does not exist, preview's Not Found will prevent false impression of success. + $approval_error = true; + break; + } + + if (!empty($update_data)) { + $wpdb->update($wpdb->posts, $update_data, ['ID' => $published_id]); + } + + clean_post_cache($post->ID); + $published_url = get_permalink($post->ID); + } + } + + $revision_status = ''; + $last_arg = array( 'revision_action' => 1, 'published_post' => $revision->ID ); + $scheduled = ''; + + // If requested publish date is in the future, schedule the revision + } else { + if ( 'future-revision' != $revision->post_mime_type ) { + $wpdb->update( $wpdb->posts, array( 'post_mime_type' => 'future-revision' ), array( 'ID' => $revision->ID ) ); + + rvy_update_next_publish_date(['revision_id' => $revision_id]); + + $db_action = true; + + clean_post_cache( $revision->ID ); + } else { + // this scheduled revision is already approved, so don't included in reported bulk approval count + $approval_error = true; + } + + $revision_status = 'future-revision'; + $last_arg = array( "revision_action" => 1, 'scheduled' => $revision->ID ); + $scheduled = $revision->post_date; + + update_post_meta($revision->ID, '_rvy_approved_by', $current_user->ID); + } + + clean_post_cache($revision->ID); + + // Support workaround to prevent notification when an Administrator or Editor created the revision + if (defined('REVISIONARY_LIMIT_ADMIN_NOTIFICATIONS')) { + $user = ($current_user->ID != $revision->post_author) ? new WP_User($revision->post_author) : $current_user; + + if ($user && !empty($user->ID)) { + foreach (['REVISIONARY_LIMIT_NOTIFICATION_SUBMITTER_ROLES', 'RVY_MONITOR_ROLES', 'SCOPER_MONITOR_ROLES'] as $const) { + if (defined($const)) { + $skip_notification_roles = array_map('trim', explode(',', constant($const))); + break; + } + } + + if (empty($skip_notification_roles)) { + $skip_notification_roles = ['editor', 'administrator']; + } + } + + if (array_intersect($user->roles, $skip_notification_roles)) { + $skip_notification = true; + } + } + + // Don't send approval notification on restoration of a past revision + if (('revision' != $revision->post_type) && empty($skip_notification)) { + $type_obj = get_post_type_object( $post->post_type ); + $type_caption = $type_obj->labels->singular_name; + + $title = sprintf(esc_html__('[%s] Revision Approval Notice', 'revisionary' ), $blogname ); + $message = sprintf( esc_html__('A revision to the %1$s "%2$s" has been approved.', 'revisionary' ), $type_caption, $post->post_title ) . "\r\n\r\n"; + $message = str_replace($message, '"', '"', $message); + + if ( $revisor = new WP_User( $revision->post_author ) ) + $message .= sprintf( esc_html__('The submitter was %1$s.', 'revisionary'), $revisor->display_name ) . "\r\n\r\n"; + + if ( $scheduled ) { + $datef = __awp( 'M j, Y @ g:i a' ); + $message .= sprintf( esc_html__('It will be published on %s', 'revisionary' ), agp_date_i18n( $datef, strtotime($revision->post_date) ) ) . "\r\n\r\n"; + + if (rvy_get_option('revision_preview_links')) { + $preview_link = rvy_preview_url($revision); + $message .= esc_html__( 'Preview it here: ', 'revisionary' ) . $preview_link . "\r\n\r\n"; + } + + $message .= esc_html__( 'Editor: ', 'revisionary' ) . rvy_admin_url("post.php?post={$revision->ID}&action=edit") . "\r\n"; + } else { + $message .= esc_html__( 'View it online: ', 'revisionary' ) . $published_url . "\r\n"; + } + + if ( $db_action && rvy_get_option( 'rev_approval_notify_author' ) ) { + if (function_exists('get_multiple_authors')) { + $authors = get_multiple_authors($post); + } else { + $author = new WP_User($post->post_author); + $authors = [$author]; + } + + foreach($authors as $author) { + if ($author) { + rvy_mail( + $author->user_email, + $title, + $message, + [ + 'revision_id' => $revision->ID, + 'post_id' => $post->ID, + 'notification_type' => 'revision-approval', + 'notification_class' => 'rev_approval_notify_author' + ] + ); + } + } + } + + if ( $db_action && rvy_get_option( 'rev_approval_notify_admin' ) ) { + require_once(dirname(REVISIONARY_FILE).'/revision-workflow_rvy.php'); + $admin_ids = apply_filters('revisionary_approval_notify_admin', Rvy_Revision_Workflow_UI::getRecipients('rev_approval_notify_admin', ['type_obj' => $type_obj, 'published_post' => $post]), ['post_type' => $type_obj->name, 'post_id' => $post->ID, 'revision_id' => $revision->ID]); + + foreach($admin_ids as $user_id) { + if ($user = new WP_User($user_id)) { + rvy_mail( + $user->user_email, + $title, + $message, + [ + 'revision_id' => $revision->ID, + 'post_id' => $post->ID, + 'notification_type' => 'revision-approval', + 'notification_class' => 'rev_approval_notify_admin' + ] + ); + } + } + } + + if ( $db_action && defined( 'RVY_NOTIFY_SUPER_ADMIN' ) && is_multisite() ) { + $super_admin_logins = get_super_admins(); + foreach( $super_admin_logins as $user_login ) { + if ( $super = new WP_User($user_login) ) + rvy_mail( + $super->user_email, + $title, + $message, + [ + 'revision_id' => $revision->ID, + 'post_id' => $post->ID, + 'notification_type' => 'revision-approval', + 'notification_class' => 'rev_approval_notify_super_admin' + ] + ); + } + } + + if (($db_action || !empty($args['force_notify'])) && rvy_get_option( 'rev_approval_notify_revisor' ) ) { + $title = sprintf(esc_html__('[%s] Revision Approval Notice', 'revisionary' ), $blogname ); + $message = sprintf( esc_html__('The revision you submitted for the %1$s "%2$s" has been approved.', 'revisionary' ), $type_caption, $revision->post_title ) . "\r\n\r\n"; + + if ( $scheduled ) { + $datef = __awp( 'M j, Y @ g:i a' ); + $message .= sprintf( esc_html__('It will be published on %s', 'revisionary' ), agp_date_i18n( $datef, strtotime($revision->post_date) ) ) . "\r\n\r\n"; + + if (rvy_get_option('revision_preview_links')) { + $preview_link = rvy_preview_url($revision); + $message .= esc_html__( 'Preview it here: ', 'revisionary' ) . $preview_link . "\r\n\r\n"; + } + + $message .= esc_html__( 'Editor: ', 'revisionary' ) . rvy_admin_url("post.php?post={$revision->ID}&action=edit") . "\r\n"; + } else { + $message .= esc_html__( 'View it online: ', 'revisionary' ) . $published_url . "\r\n"; + } + + if ( $author = new WP_User( $revision->post_author, '' ) ) { + rvy_mail( + $author->user_email, + $title, + $message, + [ + 'revision_id' => $revision->ID, + 'post_id' => $post->ID, + 'notification_type' => 'revision-approval', + 'notification_class' => 'rev_approval_notify_revisor' + ] + ); + } + } + } + + $type_obj = get_post_type_object($post->post_type); + + if ( empty( $_REQUEST['rvy_redirect'] ) && ! $scheduled && is_post_type_viewable($type_obj) ) { + $redirect = $published_url; + + } elseif ( !empty($_REQUEST['rvy_redirect']) && 'edit' == esc_url_raw($_REQUEST['rvy_redirect']) ) { + $redirect = add_query_arg( $last_arg, "post.php?post=$revision_id&action=edit" ); + + } elseif (is_post_type_viewable($type_obj)) { + $redirect = rvy_preview_url($revision, ['post_type' => $post->post_type]); + } else { + $redirect = admin_url("post.php?post={$post->ID}&action=edit"); + } + + } while (0); + + clean_post_cache($revision_id); + + if (!empty($update_next_publish_date)) { + rvy_update_next_publish_date(['revision_id' => $revision_id]); + } + + if (!$batch_process) { + if ( ! $redirect ) { + if ( ! empty($post) && is_object($post) && ( 'post' != $post->post_type ) ) { + $redirect = "edit.php?post_type={$post->post_type}"; + } else + $redirect = 'edit.php'; + } + } + + if (empty($approval_error)) { + do_action( 'revision_approved', $post->ID, $revision->ID ); + } + + if (!$batch_process) { + wp_redirect( $redirect ); + exit; + } + + if (empty($approval_error)) { + return true; + } +} + +function rvy_revision_restore() { + if (!isset($_GET['revision'])) { + return; + } + + $revision_id = (int) $_GET['revision']; + $redirect = ''; + + do { + if ( !$revision = wp_get_post_revision( $revision_id ) ) + break; + + if ( !$post = get_post( $revision->post_parent ) ) + break; + + if (!current_user_can('edit_post', $revision->post_parent)) { + break; + } + + check_admin_referer( "restore-post_{$post->ID}|$revision->ID" ); + + $published_url = get_permalink($post->ID); + + global $wpdb; + + $data = array( 'post_status' => 'inherit', 'post_date' => $revision->post_modified, 'post_date_gmt' => $revision->post_modified ); + + if ( class_exists('WPCom_Markdown') && ! defined( 'RVY_DISABLE_MARKDOWN_WORKAROUND' ) ) + $data['post_content_filtered'] = $revision->post_content; + + $wpdb->update($wpdb->posts, $data, array('ID' => $revision->ID)); + + wp_restore_post_revision( $revision->ID, array( 'post_content', 'post_title', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt' ) ); + + // restore previous meta fields + revisionary_copy_postmeta($revision, $post->ID); + + revisionary_copy_terms($revision, $post->ID); + + clean_post_cache($revision->ID); + clean_post_cache($post->ID); + + rvy_format_content( $revision->post_content, $revision->post_content_filtered, $post->ID ); + + if ( 'inherit' == $revision->post_status ) { + $last_arg = array( 'revision_action' => 1, 'restored_post' => $post->ID ); + } else { + $last_arg = array( 'revision_action' => 1, 'published_post' => $post->ID ); + } + + if ( empty( $_REQUEST['rvy_redirect'] ) && ! $scheduled ) { + $redirect = $published_url; + + } elseif ( 'edit' == $_REQUEST['rvy_redirect'] ) { + $redirect = add_query_arg( $last_arg, "post.php?post={$post->ID}&action=edit" ); + } else { + $redirect = add_query_arg( $last_arg, esc_url_raw($_REQUEST['rvy_redirect']) ); + } + + } while (0); + + if ( ! $redirect ) { + if ( ! empty($post) && is_object($post) && ( 'post' != $post->post_type ) ) { + $redirect = "edit.php?post_type={$post->post_type}"; + } else + $redirect = 'edit.php'; + } + + wp_redirect( $redirect ); + exit; +} + +function rvy_apply_revision( $revision_id, $actual_revision_status = '' ) { + global $wpdb; + + if ( ! $revision = get_post( $revision_id ) ) { + return $revision; + } + + if (!$published_id = $revision->comment_count) { + if (! $published_id = rvy_post_id($revision_id)) { + return false; + } + } + + if ('revision' == get_post_field('post_type', $published_id)) { + return false; + } + + $update = (array) $revision; + + $published = $wpdb->get_row( + $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d", $published_id) + ); + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + if (!$published_authors = get_multiple_authors($published_id)) { + if ($author = \MultipleAuthors\Classes\Objects\Author::get_by_user_id((int) $published->post_author)) { + $published_authors = [$author]; + } + } + } + + // published post columns which should not be overwritten by revision values + $update = array_merge( + $update, + array( + 'ID' => $published->ID, + 'post_author' => $published->post_author, + 'post_type' => $published->post_type, + 'post_status' => $published->post_status, + 'comment_count' => $published->comment_count, + 'post_name' => $published->post_name, + 'guid' => $published->guid, + 'post_mime_type' => $published->post_mime_type + ) + ); + + if ( + (in_array($revision->post_mime_type, ['pending-revision', 'draft-revision']) && !rvy_filter_option('pending_revision_update_post_date', ['revision_id' => $revision_id, 'post_id' => $published->ID])) + || (('future-revision' == $revision->post_mime_type) && !rvy_filter_option('scheduled_revision_update_post_date', ['revision_id' => $revision_id, 'post_id' => $published->ID])) + ) { + // todo: how was post_date_gmt of published post previously set to zero? + if (('0000-00-00 00:00:00' == $published->post_date_gmt) && ('0000-00-00 00:00:00' != $published->post_date)) { + // reconstruct post_date_gmt from stored post_date + $timestamp = strtotime($published->post_date); + $zone_diff = strtotime(current_time('mysql', 'gmt')) - strtotime(current_time('mysql')); + $set_date_gmt = gmdate('Y-m-d H:i:s', $timestamp + $zone_diff); + } else { + $set_date_gmt = $published->post_date_gmt; + } + + $update = array_merge( + $update, + array( + 'post_date' => $published->post_date, + 'post_date_gmt' => $set_date_gmt, + ) + ); + } + + if (defined('FL_BUILDER_VERSION')) { + // If Beaver Builder is active for this post, don't allow pending revision publication to strip terms + if (get_post_meta($published->ID, '_fl_builder_data', true)) { + $orig_terms = []; + $orig_terms['post_tag'] = wp_get_object_terms($published->ID, 'post_tag', ['fields' => 'ids']); + $orig_terms['category'] = wp_get_object_terms($published->ID, 'category', ['fields' => 'ids']); + } + } + + if (defined('POLYLANG_VERSION')) { + $lang_terms = wp_get_object_terms($published->ID, 'post_translations', ['fields' => 'all']); + + $lang_descripts = []; + + foreach($lang_terms as $term) { + $lang_descripts[$term->term_taxonomy_id] = $term->description; + } + } + + /** + * Filter revision data before applying the revision. + * + * @param array $update Revision data + * @param WP_Post $revision Revision being applied + * @param Object $published Currently published post + */ + $update = apply_filters( 'revisionary_apply_revision_data', $update, $revision, $published ); + + $revision_content = $update['post_content']; + + if (defined('REVISIONARY_APPLY_REVISION_WP_UPDATE')) { + $post_id = wp_update_post( $update ); + } else { + // update without filter, action applications + $post_id = rvy_update_post( $update ); + } + + if ( ! $post_id || is_wp_error( $post_id ) ) { + return $post_id; + } + + if (!$set_slug = get_post_meta($revision_id, '_requested_slug', true)) { + $set_slug = $published->post_name; + } + + // Apply requested slug, if applicable. + // Otherwise, work around unexplained reversion of editor-modified post slug back to default format on some sites @todo: identify plugin interaction + $update_fields = ['post_name' => $set_slug, 'guid' => $published->guid, 'post_type' => $published->post_type, 'post_status' => $published->post_status, 'post_mime_type' => $published->post_mime_type, 'post_parent' => $published->post_parent]; + + // Prevent wp_insert_post() from stripping inline html styles + if (!defined('RVY_DISABLE_REVISION_CONTENT_PASSTHRU')) { + $update_fields['post_content'] = $revision_content; + } + + $_post = get_post($post_id); + + // prevent published post status being set to future when a scheduled revision is manually published before the stored post_date + if ($_post && ($_post->post_status != $published->post_status)) { + $update_fields['post_status'] = $published->post_status; + } + + $update_fields = apply_filters('revisionary_apply_revision_fields', $update_fields, $revision, $published, $actual_revision_status); + + if ( + (in_array($revision->post_mime_type, ['draft-revision', 'pending-revision']) && rvy_filter_option('pending_revision_update_modified_date', ['revision_id' => $revision_id, 'post_id' => $published->ID])) + || (('future-revision' == $revision->post_mime_type) && rvy_filter_option('scheduled_revision_update_modified_date', ['revision_id' => $revision_id, 'post_id' => $published->ID])) + ) { + $post_modified = current_time('mysql'); + $post_modified_gmt = current_time('mysql', 1); + } else { + $post_modified = $published->post_modified; + $post_modified_gmt = $published->post_modified_gmt; + } + + $update_fields['post_modified'] = $post_modified; + $update_fields['post_modified_gmt'] = $post_modified_gmt; + + if ( + (in_array($revision->post_mime_type, ['draft-revision', 'pending-revision']) && rvy_filter_option('pending_revision_update_post_date', ['revision_id' => $revision_id, 'post_id' => $published->ID])) + || (('future-revision' == $revision->post_mime_type) && rvy_filter_option('scheduled_revision_update_post_date', ['revision_id' => $revision_id, 'post_id' => $published->ID])) + ) { + $update_fields['post_date'] = current_time('mysql'); + $update_fields['post_date_gmt'] = current_time('mysql', 1); + + } elseif (!empty($update['post_date'])) { + $update_fields['post_date'] = $update['post_date']; + $update_fields['post_date_gmt'] = $update['post_date_gmt']; + } + + // Safeguard: prevent invalid hierarchy and broken Pages admin + if (!empty($update_fields['post_parent']) && ($post_id == $update_fields['post_parent'])) { + $update_fields['post_parent'] = 0; + } + + if ($author_selection = get_post_meta($revision_id, '_rvy_author_selection', true)) { + $user = get_user_by('ID', $author_selection); + + if (is_a($user, 'WP_User')) { + $update_fields['post_author'] = $author_selection; + } + } + + $wpdb->update($wpdb->posts, $update_fields, ['ID' => $post_id]); + + // also copy all stored postmeta from revision + + $is_imported = get_post_meta($revision_id, '_rvy_imported_revision', true); + + // work around bug in < 2.0.7 that saved all scheduled revisions without terms + if (!$is_imported && ('future-revision' == $revision->post_mime_type)) { + if ($install_time = get_option('revisionary_2_install_time')) { + if (strtotime($revision->post_modified_gmt) < $install_time) { + $is_imported = true; + } + } + } + + revisionary_copy_postmeta($revision, $published->ID, ['apply_empty' => !$is_imported]); + + // Allow Multiple Authors revisions to be applied to published post. Revision post_author is forced to actual submitting user. + revisionary_copy_terms($revision_id, $post_id, ['apply_empty' => !$is_imported, 'applying_revision' => true]); + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION') && $published_authors) { + // Make sure Multiple Authors values were not wiped due to incomplete revision data + if (function_exists('get_post_authors') && !get_post_authors($post_id, true)) { + rvy_set_ma_post_authors($post_id, $published_authors); + } + } + + if ($published_id != $revision_id) { + if (!defined('REVISIONARY_NO_SCHEDULED_REVISION_ARCHIVE')) { + $wpdb->update( + $wpdb->posts, + ['post_type' => 'revision', + 'post_status' => 'inherit', + 'post_date' => current_time('mysql'), + 'post_date_gmt' => current_time('mysql', 1), + 'post_parent' => $post_id, + 'comment_count' => 0, + 'post_mime_type' => $published->post_mime_type + ], + ['ID' => $revision_id] + ); + + Revisionary::applyRevisionLimit($published); + } else { + wp_delete_post($revision_id, true); + } + + // todo: save change as past revision? + $wpdb->delete($wpdb->postmeta, array('post_id' => $revision_id)); + } + + rvy_update_post_meta($revision_id, '_rvy_published_gmt', $post_modified_gmt); + + rvy_update_post_meta($revision_id, '_rvy_prev_revision_status', $actual_revision_status); + + if ('future-revision' != $actual_revision_status) { + global $current_user; + rvy_update_post_meta($revision_id, '_rvy_approved_by', $current_user->ID); + } + + // If published revision was the last remaining pending / scheduled, clear _rvy_has_revisions postmeta flag + revisionary_refresh_postmeta($post_id); + + if (!empty($orig_terms) && is_array($orig_terms)) { + foreach($orig_terms as $taxonomy => $terms) { + if ($terms && !wp_get_object_terms($published->ID, $taxonomy, ['fields' => 'ids'])) { + wp_set_object_terms($published->ID, $terms, $taxonomy); + } + } + } + + if (defined('POLYLANG_VERSION')) { + if (!empty($lang_descripts)) { + foreach($lang_descripts as $tt_id => $descript) { + $wpdb->update($wpdb->term_taxonomy, ['description' => $descript], ['term_taxonomy_id' => $tt_id]); + } + } + } + + if (rvy_get_option('copy_revision_comments_to_post')) { + if ($rev_comments = get_comments([ + 'post_id' => $revision_id, + 'status' => 'editorial-comment', + ])) { + $post_comments = get_comments([ + 'post_id' => $published->ID, + 'status' => 'editorial-comment', + ]); + + foreach($rev_comments as $comment) { + $arr_comment = (array) $comment; + $arr_comment['comment_post_ID'] = $published->ID; + + // Don't copy a revision comment if published post already has an identical comment + foreach($post_comments as $post_comment) { + if ($post_comment->comment_content == $comment->comment_content) { + continue 2; + } + } + + wp_insert_comment($arr_comment); + } + } + } + + if (rvy_get_option('trigger_post_update_actions')) { + global $revisionary; + + $_published = get_post($published->ID); + + if (!defined('RVY_NO_TRANSITION_STATUS_ACTION')) { + $old_status = (defined('RVY_TRANSITION_ACTION_USE_REVISION_STATUS')) ? $revision->post_status : 'pending'; + do_action('transition_post_status', $published->post_status, $old_status, $_published); + } + + if (!defined('RVY_NO_SAVE_POST_ACTION')) { + remove_action('save_post', array($revisionary, 'actSavePost'), 20, 2); + + if (function_exists('presspermit')) { + presspermit()->flags['ignore_save_post'] = true; + } + + do_action('save_post', $published->ID, $_published, true); + + if (function_exists('presspermit')) { + unset(presspermit()->flags['ignore_save_post']); + } + } + + if (!defined('RVY_NO_AFTER_INSERT_ACTION') && !empty($_published)) { + do_action('wp_after_insert_post', $_published->ID, $_published, true, $published); + } + } + + if (defined('PUBLISHPRESS_VERSION') && rvy_get_option('rev_publication_delete_ed_comments')) { + global $wpdb; + + $wpdb->query( + $wpdb->prepare( + "DELETE FROM $wpdb->comments WHERE comment_approved = 'editorial-comment' AND (comment_post_ID = %d OR comment_post_ID = %d)", + $revision_id, + $published->ID + ) + ); + } + + rvy_delete_past_revisions($revision_id); + + rvy_delete_redundant_revisions($revision); + + clean_post_cache($revision_id); + clean_post_cache($published->ID); + + if (!defined('REVISIONARY_DISABLE_SECONDARY_CACHE_FLUSH')) { + wp_cache_delete( $published->ID, 'posts' ); + wp_cache_delete( $published->ID, 'post_meta' ); + } + + if (defined('LSCWP_V')) { + do_action('litespeed_purge_post', $published->ID); + } + + // Passing ignore_revision_ids is not theoretically necessary here since this call occurs after deletion, but avoid any cache clearance timing issues. + revisionary_refresh_revision_flags($published->ID, ['ignore_revision_ids' => $revision_id]); + + /** + * Trigger after a revision has been applied. + * + * @param int $post_id The post ID. + * @param int $revision_id The revision object. + */ + do_action( 'revision_applied', $published->ID, $revision ); + + return $revision; +} + +function rvy_delete_redundant_revisions($revision) { + global $wpdb, $current_user; + + $wpdb->query( + $wpdb->prepare( + "DELETE FROM $wpdb->posts WHERE post_type = %s AND post_status = %s AND post_author = %d AND post_parent = %d AND ID > %d", + 'revision', + 'inherit', + $current_user->ID, + rvy_post_id($revision->ID), + $revision->ID + ) + ); +} + +// Restore a past revision (post_status = inherit) +function rvy_do_revision_restore( $revision_id, $actual_revision_status = '' ) { + global $wpdb; + + if ( $revision = wp_get_post_revision( $revision_id ) ) { + if ('future-revision' == $revision->post_mime_type) { + rvy_publish_scheduled_revisions(array('revision_id' => $revision->ID)); + return $revision; + } + + $revision_date = $revision->post_date; + $revision_date_gmt = $revision->post_date_gmt; + + wp_restore_post_revision( $revision_id ); + + // @todo: why do revision post_date, post_date_gmt get changed? + $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_date = %s, post_date_gmt = %s WHERE ID = %d", $revision_date, $revision_date_gmt, $revision->ID ) ); + + // @todo: why does a redundant revision with post_author = 0 get created at revision publication? + $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_author = 0 AND post_parent = %d", $revision->post_parent ) ); + } + + if ( $revision && ! empty($revision->post_parent) ) { + rvy_format_content( $revision->post_content, $revision->post_content_filtered, $revision->post_parent ); + } + + clean_post_cache( $revision_id ); + + return $revision; +} + +function rvy_revision_delete() { + if (!isset($_GET['revision'])) { + return; + } + + $revision_id = (int) $_GET['revision']; + $redirect = ''; + + do { + // this function is only used for past revisions (status=inherit) + if ( ! $revision = wp_get_post_revision( $revision_id ) ) + break; + + if ( ! $post = get_post( $revision->post_parent ) ) + break; + + if ( $type_obj = get_post_type_object( $post->post_type ) ) { + if ( ! current_user_can( $type_obj->cap->delete_post, $revision->post_parent ) ) { + break; + } + } + + check_admin_referer('delete-revision_' . $revision_id); + + clean_post_cache(rvy_post_id($revision_id)); + + // before deleting the revision, note its status for redirect + wp_delete_post_revision( $revision_id ); + + if (!empty($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'revisionary-archive')) { + $redirect = add_query_arg('deleted', '1', esc_url_raw($_SERVER['HTTP_REFERER'])); + } else { + $redirect = "admin.php?page=revisionary-archive&origin_post={$revision->post_parent}&revision_status={$revision->post_mime_type}&deleted=1"; + } + + rvy_delete_past_revisions($revision_id); + + revisionary_refresh_postmeta($revision->post_parent); + } while (0); + + if ( ! empty( $_GET['return'] ) && ! empty( $_SERVER['HTTP_REFERER'] ) ) { + $redirect = str_replace( 'trashed=', 'deleted=', esc_url_raw($_SERVER['HTTP_REFERER']) ); + + } elseif ( ! $redirect ) { + if ( ! empty($post) && is_object($post) && ( 'post' != $post->post_type ) ) { + $redirect = "edit.php?post_type={$post->post_type}"; + } else + $redirect = 'edit.php'; + } + + wp_redirect( $redirect ); + exit; +} + +function rvy_revision_bulk_delete() { + check_admin_referer( 'rvy-revisions' ); + + $redirect = ''; + $delete_count = 0; + $post_id = 0; + $revision_status = ''; + + if ( empty($_POST['delete_revisions']) || empty($_POST['delete_revisions']) ) { + + if ( ! empty( $_POST['left'] ) ) + $post_id = (int) $_POST['left']; + + elseif ( ! empty( $_POST['right'] ) ) + $post_id = (int) $_POST['right']; + + } else { + $delete_revisions = array_map('intval', (array) $_POST['delete_revisions']); + $post_ids = []; + + foreach ($delete_revisions as $revision_id) { + $published_post_id = rvy_post_id(); + + // this function is only used for past revisions (status=inherit) + if ( ! $revision = wp_get_post_revision( $revision_id ) ) + continue; + + if ( ! $post_id ) { + if ( $post = get_post( $revision->post_parent ) ) + $post_id = $post->ID; + else + continue; + } + + if ( $post = get_post( $revision->post_parent ) ) { + $post_ids []= $revision->post_parent; + + if ( $type_obj = get_post_type_object( $post->post_type ) ) { + if ( ! current_user_can( $type_obj->cap->delete_post, $revision->post_parent ) ) { + continue; + } + } + } + + clean_post_cache(rvy_post_id($revision_id)); + + // before deleting the revision, note its status for redirect + $revision_status = $revision->post_mime_type; + wp_delete_post($revision_id, true); + $delete_count++; + + do_action('rvy_delete_revision', $revision_id, $published_post_id); + + rvy_delete_past_revisions($revision_id); + } + + foreach($post_ids as $_post_id) { + revisionary_refresh_postmeta($_post_id); + } + } + + $redirect = "admin.php?page=revisionary-archive&origin_post=$post_id&revision_status=$revision_status&bulk_deleted=$delete_count"; + + wp_redirect( $redirect ); + exit; +} + +function rvy_revision_unschedule($revision_id) { + global $wpdb; + + $redirect = ''; + + do { + if (!$revision = get_post($revision_id)) { + break; + } + + if (!rvy_in_revision_workflow($revision)) { + break; + } + + $published_id = rvy_post_id($revision->ID); + + if (!$post = get_post($published_id)) { + break; + } + + if (!current_user_can('edit_post', $published_id)) { + break; + } + + $wpdb->update( $wpdb->posts, ['post_status' => 'draft', 'post_mime_type' => 'draft-revision'], ['ID' => $revision->ID] ); + + clean_post_cache($revision->ID); + + rvy_update_next_publish_date(); + } while (0); + + return true; +} + +function rvy_revision_publish($revision_id = false) { + if ($revision_id) { + $batch_process = true; + } else { + if (isset($_GET['revision'])) { + $revision_id = (int) $_GET['revision']; + $redirect = site_url(); + $batch_process = false; + } else { + return; + } + } + + do { + if ( !$revision = get_post($revision_id ) ) { + break; + } + + if ( 'future-revision' != $revision->post_mime_type ) { + break; + } + + if (!$published_id = rvy_post_id($revision_id)) { + break; + } + + if (!$post = get_post($published_id)) { + break; + } + + if (!current_user_can('edit_post', $post->ID)) { + break; + } + + if (!$batch_process) { + check_admin_referer( "publish-post_$post->ID|$revision->ID" ); + } + + $do_publish = true; + do_action( 'revision_published', rvy_post_id($revision->ID), $revision->ID ); + } while (0); + + if (!empty($do_publish)) { + rvy_publish_scheduled_revisions(array('revision_id' => $revision->ID)); + + clean_post_cache($revision->ID); + + if ($post) { + clean_post_cache($post->ID); + } + } + + if (!$batch_process) { + if ($post) { + $type_obj = get_post_type_object($post->post_type); + + $redirect = ($type_obj && empty($type_obj->public)) ? rvy_admin_url("post.php?action=edit&post=$post->ID") : add_query_arg('mark_current_revision', 1, get_permalink($post->ID)); // published URL + } + + wp_redirect($redirect); + exit; + } + + if (!empty($do_publish)) { + return true; + } +} + +// rvy_init action passes Revisionary object +function _rvy_publish_scheduled_revisions($revisionary_obj, $args = []) { + rvy_publish_scheduled_revisions($args); +} + +function rvy_publish_scheduled_revisions($args = []) { + global $wpdb, $wp_version; + + if (function_exists('relevanssi_query')) { + remove_action( 'wp_insert_post', 'relevanssi_insert_edit', 99, 1 ); + } + + if (!rvy_get_option('scheduled_publish_cron')) { + rvy_confirm_async_execution( 'publish_scheduled_revisions' ); + + // Prevent this function from being triggered simultaneously by another site request + update_option( 'rvy_next_rev_publish_gmt', '2035-01-01 00:00:00' ); + } + + $time_gmt = current_time('mysql', 1); + + $restored_post_ids = array(); + $skip_revision_ids = array(); + $blogname = wp_specialchars_decode( get_option('blogname'), ENT_QUOTES ); + + $revised_uris = array(); + + if (defined('WP_DEBUG') && WP_DEBUG && !empty($_GET['rs_debug'])) { + echo "current time: " . esc_html($time_gmt); + } + + if (!empty($args['revision_id']) && is_scalar($args['revision_id'])) { + $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts WHERE post_type != 'revision' AND post_status != 'inherit' AND post_mime_type = 'future-revision' AND ID = %d", + (int) $args['revision_id'] + ) + ); + } else { + $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts WHERE post_type != 'revision' AND post_status != 'inherit' AND post_mime_type = 'future-revision' AND post_date_gmt <= %s ORDER BY post_date_gmt DESC", + $time_gmt + ) + ); + } + + if ( $results ) { + foreach ( $results as $row ) { + $published_id = (!empty($row->comment_count)) ? $row->comment_count : rvy_post_id($row->ID); + + if ( ! isset($restored_post_ids[$published_id]) ) { + $revised_uris []= get_permalink( $row->ID ); + + $published_url = get_permalink($published_id); + + $_result = rvy_apply_revision($row->ID, 'future-revision'); + if (!$_result || is_wp_error($_result)) { + // Don't trip an error because revision may have already been published by a different site request. + // If not, the redirect to the published URL will indicate the current status + continue; + } + + if (defined('WP_DEBUG') && WP_DEBUG && ! empty( $_GET['rs_debug'] ) ) { + echo '
' . "publishing revision " . esc_html($row->ID); + } + + $restored_post_ids[$published_id] = true; + + $post = get_post( $published_id ); + + $type_obj = get_post_type_object( $post->post_type ); + $type_caption = $type_obj->labels->singular_name; + + if ( rvy_get_option( 'publish_scheduled_notify_revisor' ) ) { + $title = sprintf( esc_html__('[%s] %s Publication Notice', 'revisionary' ), $blogname, pp_revisions_status_label('future-revision', 'name') ); + $message = sprintf( esc_html__('The scheduled revision you submitted for the %1$s "%2$s" has been published.', 'revisionary' ), $type_caption, $row->post_title ) . "\r\n\r\n"; + + if ( ! empty($post->ID) ) + $message .= esc_html__( 'View it online: ', 'revisionary' ) . $published_url . "\r\n"; + + if ( $author = new WP_User( $row->post_author ) ) + rvy_mail( + $author->user_email, + $title, + $message, + [ + 'revision_id' => $row->ID, + 'post_id' => $published_id, + 'notification_type' => 'publish-scheduled', + 'notification_class' => 'publish_scheduled_notify_revisor' + ] + ); + } + + // Prior to 1.3, notification was sent to author even if also revision submitter + if ( ( ( $post->post_author != $row->post_author ) || defined( 'RVY_LEGACY_SCHEDULED_REV_POST_AUTHOR_NOTIFY' ) ) && rvy_get_option( 'publish_scheduled_notify_author' ) ) { + $title = sprintf( esc_html__('[%s] %s Publication Notice', 'revisionary' ), $blogname, pp_revisions_status_label('future-revision', 'name') ); + $message = sprintf( esc_html__('A scheduled revision to your %1$s "%2$s" has been published.', 'revisionary' ), $type_caption, $post->post_title ) . "\r\n\r\n"; + + if ( $revisor = new WP_User( $row->post_author ) ) + $message .= sprintf( esc_html__('It was submitted by %1$s.'), $revisor->display_name ) . "\r\n\r\n"; + + if ( ! empty($post->ID) ) + $message .= esc_html__( 'View it online: ', 'revisionary' ) . $published_url . "\r\n"; + + if (function_exists('get_multiple_authors')) { + $authors = get_multiple_authors($post); + } else { + $author = new WP_User($post->post_author); + $authors = [$author]; + } + + foreach($authors as $author) { + if ($author && !empty($author->user_email)) { + rvy_mail( + $author->user_email, + $title, + $message, + [ + 'revision_id' => $row->ID, + 'post_id' => $published_id, + 'notification_type' => 'publish-scheduled', + 'notification_class' => 'publish_scheduled_notify_author' + ] + ); + } + } + } + + if ( rvy_get_option( 'publish_scheduled_notify_admin' ) ) { + + // Support workaround to prevent notification when an user of specified role created the revision + if (defined('REVISIONARY_LIMIT_ADMIN_NOTIFICATIONS')) { + global $current_user; + + $user = ($current_user->ID != $revision->post_author) ? new WP_User($revision->post_author) : $current_user; + + if ($user && !empty($user->ID)) { + foreach (['REVISIONARY_LIMIT_NOTIFICATION_SUBMITTER_ROLES', 'RVY_MONITOR_ROLES', 'SCOPER_MONITOR_ROLES'] as $const) { + if (defined($const)) { + // revision submitter roles for which revision publication should not trigger email notification + $skip_notification_revisor_roles = array_map('trim', explode(',', constant($const))); + break; + } + } + + if (empty($skip_notification_revisor_roles)) { + $skip_notification_revisor_roles = ['editor', 'administrator']; + } + } + + if (!empty($skip_notification_revisor_roles) && array_intersect($user->roles, $skip_notification_revisor_roles)) { + $skip_notification = true; + } + } + + if (empty($skip_notification)) { + $title = sprintf(esc_html__('[%s] %s Publication'), $blogname, pp_revisions_status_label('future-revision', 'name') ); + + $message = sprintf( esc_html__('A scheduled revision to the %1$s "%2$s" has been published.'), $type_caption, $row->post_title ) . "\r\n\r\n"; + + if ( $author = new WP_User( $row->post_author ) ) + $message .= sprintf( esc_html__('It was submitted by %1$s.'), $author->display_name ) . "\r\n\r\n"; + + if ( ! empty($post->ID) ) + $message .= esc_html__( 'View it online: ', 'revisionary' ) . $published_url . "\r\n"; + + $object_id = ( isset($post) && isset($post->ID) ) ? $post->ID : $row->ID; + $object_type = ( isset($post) && isset($post->post_type) ) ? $post->post_type : 'post'; + + + // if it was not stored, or cleared, use default recipients + $to_addresses = array(); + + do_action('presspermit_init_rvy_interface'); + + if ( defined('RVY_CONTENT_ROLES') && ! defined('SCOPER_DEFAULT_MONITOR_GROUPS') && ! defined('REVISIONARY_LIMIT_ADMIN_NOTIFICATIONS') ) { // e-mail to Scheduled Revision Montiors metagroup if Role Scoper is activated + global $revisionary; + + $monitor_groups_enabled = true; + $revisionary->content_roles->ensure_init(); + + if ( $default_ids = $revisionary->content_roles->get_metagroup_members( 'Scheduled Revision Monitors' ) ) { + $cols = ( defined('COLS_ALL_RS') ) ? COLS_ALL_RS : 'all'; + + $post_publishers = $revisionary->content_roles->users_who_can('edit_post', $object_id, array( 'cols' => $cols ) ); + + foreach ($post_publishers as $user) { + if (in_array($user->ID, $default_ids)) { + $to_addresses []= $user->user_email; + } + } + } + } + + if ( ! $to_addresses && ( empty($monitor_groups_enabled) || ! defined('RVY_FORCE_MONITOR_GROUPS') ) ) { // if RS/PP are not active, monitor groups have been disabled or no monitor group members can publish this post... + if ( defined( 'SCOPER_MONITOR_ROLES' ) ) { + $use_wp_roles = SCOPER_MONITOR_ROLES; + } else { + $use_wp_roles = (defined('RVY_MONITOR_ROLES')) ? RVY_MONITOR_ROLES : 'administrator,editor'; + } + + $use_wp_roles = str_replace( ' ', '', $use_wp_roles ); + $use_wp_roles = explode( ',', $use_wp_roles ); + + $recipient_ids = array(); + + foreach ( $use_wp_roles as $role_name ) { + $search = new WP_User_Query( "search=&fields=id&role=$role_name" ); + $recipient_ids = array_merge( $recipient_ids, $search->results ); + } + + foreach ( $recipient_ids as $userid ) { + $user = new WP_User($userid); + $to_addresses []= $user->user_email; + } + } + + if ( defined( 'RVY_NOTIFY_SUPER_ADMIN' ) && is_multisite() ) { + $super_admin_logins = get_super_admins(); + foreach( $super_admin_logins as $user_login ) { + if ( $super = new WP_User($user_login) ) + $to_addresses []= $super->user_email; + } + } + + $to_addresses = array_unique( $to_addresses ); + + foreach ( $to_addresses as $address ) { + rvy_mail( + $address, + $title, + $message, + [ + 'revision_id' => $row->ID, + 'post_id' => $published_id, + 'notification_type' => 'publish-scheduled', + 'notification_class' => 'publish_scheduled_notify_admin' + ] + ); + } + } // endif skip_notification + } + + + } else { + $skip_revision_ids[$row->ID] = true; + } + } + + if ( $skip_revision_ids ) { + // if more than one scheduled revision was not yet published, convert the older ones to regular revisions + $id_clause = "AND ID IN ('" + . implode("','", + array_map('intval', array_keys($skip_revision_ids)) + ) + . "')"; + + $wpdb->query( "UPDATE $wpdb->posts SET post_type = 'revision', post_status = 'inherit' WHERE post_mime_type = 'future-revision' $id_clause" ); + } + } + + if (!rvy_get_option('scheduled_publish_cron')) { + rvy_update_next_publish_date(); + } + + // if this was initiated by an asynchronous remote call, we're done. + if ( ! empty( $_GET['action']) && ( 'publish_scheduled_revisions' == $_GET['action'] ) ) { + exit( 0 ); + } elseif (!empty($_SERVER['REQUEST_URI'])) { + if ( in_array( esc_url_raw($_SERVER['REQUEST_URI']), $revised_uris ) ) { + wp_redirect( esc_url(esc_url_raw($_SERVER['REQUEST_URI'])) ); // if one of the revised pages is being accessed now, redirect back so revision is published on first access + exit; + } + } +} + +function rvy_update_next_publish_date($args = []) { + global $wpdb, $wp_version; + + if ($args && !empty($args['revision_id']) && rvy_get_option('scheduled_publish_cron')) { + if ($revision = get_post($args['revision_id'])) { + wp_schedule_single_event(strtotime( $revision->post_date_gmt ), 'publish_revision_rvy', [$args['revision_id']]); + } + } + + if ( $next_publish_date_gmt = $wpdb->get_var( "SELECT post_date_gmt FROM $wpdb->posts WHERE post_mime_type = 'future-revision' ORDER BY post_date_gmt ASC LIMIT 1" ) ) { + + } else { + $next_publish_date_gmt = '2035-01-01 00:00:00'; + } + + update_option( 'rvy_next_rev_publish_gmt', $next_publish_date_gmt ); +} + +// @todo: is this still needed (now only create normal revisions when publishing scheduled post and more than one change was scheduled.) +function rvy_review_revision( $revision_id ) { + if ( class_exists('WPCom_Markdown') && ! defined( 'RVY_DISABLE_MARKDOWN_WORKAROUND' ) ) { + $revision = wp_get_post_revision( $revision_id ); + if ( ! $revision->post_content_filtered ) { + if ( $post = get_post( $revision->post_parent ) ) { + global $wpdb; + $wpdb->update( $wpdb->posts, array( 'post_content_filtered' => $post->post_content_filtered ), array( 'ID' => $revision_id ) ); + } + } + } +} + +function rvy_delete_past_revisions($post_id) { + global $wpdb; + + $revision_ids = $wpdb->get_col($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_type = 'revision' AND post_status = 'inherit' AND post_parent = %d", $post_id)); + + // delete any associated "inherit" copies that were generated due to revision editing + foreach($revision_ids as $_revision_id) { + $wpdb->delete($wpdb->postmeta, array('post_id' => $_revision_id)); + } + + if ($revision_ids) { + $wpdb->delete($wpdb->posts, array('post_type' => 'revision', 'post_status' => 'inherit', 'post_parent' => $post_id)); + } +} + +// apply any necessary third-party transformations to post content after publishing a revision +function rvy_format_content( $content, $content_filtered, $post_id, $args = array() ) { + $defaults = array( 'update_db' => true ); + $args = array_merge( $defaults, $args ); + $args = apply_filters( 'rvy_format_content_args', $args, $post_id ); + + foreach( array_keys( $defaults ) as $var ) { + if ( ! isset( $$var) ) { + $$var = ( isset( $args[$var] ) ) ? $args[$var] : $defaults[$var]; + } + } + + if ( ! $content_filtered ) + $content_filtered = $content; + + $formatted_content = $content; + + if ( class_exists('WPCom_Markdown') && ! defined( 'RVY_DISABLE_MARKDOWN_WORKAROUND' ) ) { + $wpcmd = WPCom_Markdown::get_instance(); + + if ( method_exists( $wpcmd, 'transform' ) ) { + $formatted_content = $wpcmd->transform( $content_filtered, array( 'post_id' => $post_id ) ); + + if ( $update_db ) { + global $wpdb; + $wpdb->update( $wpdb->posts, array( 'post_content' => $formatted_content, 'post_content_filtered' => $content_filtered ), array( 'ID' => $post_id ) ); + } + } + } + + $formatted_content = apply_filters( 'rvy_formatted_content', $formatted_content, $post_id, $content, $args ); + + return $formatted_content; +} + + +function rvy_update_post($postarr = []) { + global $wpdb; + + if ( is_object( $postarr ) ) { + // Non-escaped post was passed. + $postarr = get_object_vars( $postarr ); + $postarr = wp_slash( $postarr ); + } + + // First, get all of the original fields. + $post = get_post( $postarr['ID'], ARRAY_A ); + + if ( is_null( $post ) ) { + return 0; + } + + // Escape data pulled from DB. + $post = wp_slash( $post ); + + // Merge old and new fields with new fields overwriting old ones. + $postarr = sanitize_post( array_merge( $post, $postarr ), 'db' ); + + // Get the post ID and GUID. + $post_before = get_post( $postarr['ID'] ); + + if ( empty( $postarr['ID'] ) || is_null( $post_before ) ) { + return 0; + } + + $data = array_intersect_key( + $postarr, + array_fill_keys(['post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'comment_status', 'post_password', 'pinged', 'menu_order', 'post_mime_type'], true) + ); + + if (!class_exists('WPCom_Markdown') || defined('RVY_DISABLE_MARKDOWN_WORKAROUND')) { + unset($data['post_content_filtered']); + } + + $data['guid'] = get_post_field( 'guid', $postarr['ID'] ); + + $data['post_type'] = (empty( $postarr['post_type'] )) ? 'post' : $postarr['post_type']; + $data['post_status'] = (empty( $postarr['post_status'] )) ? 'draft' : $postarr['post_status']; + + $data['post_modified'] = current_time( 'mysql' ); + $data['post_modified_gmt'] = current_time( 'mysql', 1 ); + + $data['ping_status'] = empty( $postarr['ping_status'] ) ? get_default_comment_status( $data['post_type'], 'pingback' ) : $postarr['ping_status']; + $data['to_ping'] = sanitize_trackback_urls( $postarr['to_ping'] ); + + $data['post_parent'] = (int) $postarr['post_parent']; + + // For an update, don't modify the post_name if it wasn't supplied as an argument. + $data['post_name'] = (!isset( $postarr['post_name'] ) ) ? $post_before->post_name : $postarr['post_name']; + $data['post_name'] = wp_unique_post_slug( $data['post_name'], $postarr['ID'], $data['post_status'], $data['post_type'], $data['post_parent'] ); + + $emoji_fields = array( 'post_title', 'post_content', 'post_excerpt' ); + + foreach ( $emoji_fields as $emoji_field ) { + if ( isset( $data[ $emoji_field ] ) ) { + $charset = $wpdb->get_col_charset( $wpdb->posts, $emoji_field ); + + if ( 'utf8' === $charset ) { + $data[ $emoji_field ] = wp_encode_emoji( $data[ $emoji_field ] ); + } + } + } + + $data = wp_unslash( $data ); + $where = array( 'ID' => $postarr['ID'] ); + + if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) { + return 0; + } + + clean_post_cache( $postarr['ID'] ); + + $post = get_post( $postarr['ID'] ); + + return $postarr['ID']; +} \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/revision-archive_rvy.php b/wp-content/plugins/revisionary/admin/revision-archive_rvy.php new file mode 100644 index 000000000..52ecd6b6d --- /dev/null +++ b/wp-content/plugins/revisionary/admin/revision-archive_rvy.php @@ -0,0 +1,96 @@ + 'revisionary-archive']); +$wp_list_table->prepare_items(); + +if (rvy_get_option('revision_archive_deletion')) { + $bulk_counts = array( + 'deleted' => isset( $_REQUEST['deleted'] ) ? absint( $_REQUEST['deleted'] ) : 0, + ); + + $bulk_messages = []; + $bulk_messages['post'] = array( + 'deleted' => sprintf(esc_html(_n( '%s revision permanently deleted.', '%s revisions permanently deleted.', $bulk_counts['deleted'] )), $bulk_counts['deleted']), + ); + + $bulk_messages['page'] = $bulk_messages['post']; + + $bulk_messages = apply_filters( 'bulk_post_updated_messages', $bulk_messages, $bulk_counts ); + $bulk_counts = array_filter( $bulk_counts ); + + + // If we have a bulk message to issue: + $messages = []; + + foreach ( $bulk_counts as $message => $count ) { + if ( $message == 'trashed' && isset( $_REQUEST['ids'] ) ) { + $any_messages = true; + break; + } elseif (!empty($bulk_messages['post'][$message])) { + $any_messages = true; + break; + } + } + + if (!empty($any_messages)) { + echo '

'; + } + + foreach ( $bulk_counts as $message => $count ) { + if ( $message == 'trashed' && isset( $_REQUEST['ids'] ) ) { + $ids = preg_replace( '/[^0-9,]/', '', sanitize_text_field($_REQUEST['ids'])); + echo '' . esc_html__('Undo') . ' '; + + } elseif (!empty($bulk_messages['post'][$message])) { + echo esc_html($bulk_messages['post'][$message]) . ' '; + } + } + + if (!empty($any_messages)) { + echo '

'; + } + unset( $messages ); + + if (!empty($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'locked', 'skipped', 'updated', 'approved_count', 'published_count', 'deleted', 'trashed', 'untrashed' ), esc_url(esc_url_raw($_SERVER['REQUEST_URI'])) ); + } +} + +?> +
+
+

+ + filters_in_heading(); + ?> +

+ search_in_heading(); ?> +
+ views(); ?> +
+ search_box( 'Search Revisions', 'revision' ); + $wp_list_table->hidden_input(); + $wp_list_table->display(); + ?> +
+ + +
diff --git a/wp-content/plugins/revisionary/admin/revision-queue_rvy.php b/wp-content/plugins/revisionary/admin/revision-queue_rvy.php new file mode 100644 index 000000000..e5ef6b941 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/revision-queue_rvy.php @@ -0,0 +1,201 @@ + Settings.', 'revisionary' ), + esc_html(pp_revisions_status_label('pending-revision', 'plural')), + esc_html(pp_revisions_status_label('future-revision', 'plural')) + )); +} + +set_current_screen( 'revisionary-q' ); + +require_once( dirname(__FILE__).'/class-list-table_rvy.php'); +$wp_list_table = new Revisionary_List_Table(['screen' => 'revisionary-q', 'post_types' => $post_types]); +$pagenum = $wp_list_table->get_pagenum(); + +$parent_file = 'admin.php?page=revisionary-q'; +$submenu_file = 'admin.php?page=revisionary-q'; + +$wp_list_table->prepare_items(); + +$bulk_counts = array( + 'deleted' => isset( $_REQUEST['deleted'] ) ? absint( $_REQUEST['deleted'] ) : 0, + 'updated' => 0, + 'locked' => 0, + 'submitted_count' => isset( $_REQUEST['submitted_count'] ) ? absint( $_REQUEST['submitted_count'] ) : 0, + 'declined_count' => isset( $_REQUEST['declined_count'] ) ? absint( $_REQUEST['declined_count'] ) : 0, + 'approved_count' => isset( $_REQUEST['approved_count'] ) ? absint( $_REQUEST['approved_count'] ) : 0, + 'unscheduled_count' => isset( $_REQUEST['unscheduled_count'] ) ? absint( $_REQUEST['unscheduled_count'] ) : 0, + 'published_count' => isset( $_REQUEST['published_count'] ) ? absint( $_REQUEST['published_count'] ) : 0, + 'trashed' => 0, + 'untrashed' => 0, +); + +$bulk_messages = []; +$bulk_messages['post'] = array( + 'submitted_count' => sprintf(esc_html(_n( '%s revision submitted.', '%s revisions submitted.', $bulk_counts['submitted_count'], 'revisionary' )), $bulk_counts['submitted_count']), + 'declined_count' => sprintf(esc_html(_n( '%s revision declined.', '%s revisions declined.', $bulk_counts['declined_count'], 'revisionary' )), $bulk_counts['declined_count']), + 'approved_count' => sprintf(esc_html(_n( '%s revision approved.', '%s revisions approved.', $bulk_counts['approved_count'], 'revisionary' )), $bulk_counts['approved_count']), + 'unscheduled_count' => sprintf(esc_html(_n( '%s revision unscheduled.', '%s revisions unscheduled.', $bulk_counts['unscheduled_count'], 'revisionary' )), $bulk_counts['unscheduled_count']), + 'published_count' => sprintf(esc_html(_n( '%s revision published.', '%s revisions published.', $bulk_counts['published_count'], 'revisionary' )), $bulk_counts['published_count']), + 'deleted' => sprintf(esc_html(_n( '%s revision permanently deleted.', '%s revisions permanently deleted.', $bulk_counts['deleted'] )), $bulk_counts['deleted']), +); + +$bulk_messages['page'] = $bulk_messages['post']; + +/** + * Filters the bulk action updated messages. + * + * By default, custom post types use the messages for the 'post' post type. + * + * @since 3.7.0 + * + * @param array $bulk_messages Arrays of messages, each keyed by the corresponding post type. Messages are + * keyed with 'updated', 'locked', 'deleted', 'trashed', and 'untrashed'. + * @param array $bulk_counts Array of item counts for each message, used to build internationalized strings. + */ +$bulk_messages = apply_filters( 'bulk_post_updated_messages', $bulk_messages, $bulk_counts ); +$bulk_counts = array_filter( $bulk_counts ); + +require_once( ABSPATH . 'wp-admin/admin-header.php' ); +?> +
+
+

 '; + +if ( ! empty( $_REQUEST['post_type'] ) ) { + $type_obj = get_post_type_object(sanitize_key($_REQUEST['post_type'])); +} + +if (!empty($_REQUEST['published_post'])) { + if ($_post = get_post((int) $_REQUEST['published_post'])) { + $published_title = $_post->post_title; + } +} + +$filters = []; + +if (!empty($_REQUEST['author'])) { + if ($_user = new WP_User((int) $_REQUEST['author'])) { + $filters['author'] = (!empty($_REQUEST['post_status']) || !empty($_REQUEST['post_status'])) + ? sprintf(_x('%s: ', 'Author Name', 'revisionary'), $_user->display_name) + : $_user->display_name; + } +} + +if (!empty($_REQUEST['post_status'])) { + if ($status_obj = get_post_status_object(sanitize_key($_REQUEST['post_status']))) { + $filters['post_status'] = (!empty($status_obj->labels->plural)) ? $status_obj->labels->plural : $status_obj->label; + } +} + +if (!empty($_REQUEST['post_type']) && empty($published_title)) { + $filters['post_type'] = (!empty($_REQUEST['post_status'])) + ? sprintf(_x('of %s', 'Posts / Pages / etc.', 'revisionary'), $type_obj->labels->name) + : $type_obj->labels->name; +} + +if (!empty($_REQUEST['post_author']) && empty($published_title)) { + if ($_user = new WP_User((int) $_REQUEST['post_author'])) { + $filters['post_author'] = $filters + ? sprintf(esc_html__('%sPost Author: %s', 'revisionary'), ' - ', $_user->display_name) + : sprintf(esc_html__('%sPost Author: %s', 'revisionary'), '', $_user->display_name); + } +} + +$filter_csv = ($filters) ? ' (' . implode(" ", $filters) . ')' : ''; + +if (!empty($published_title)) { + printf( esc_html(_x('Revision Queue for "%s"%s', 'PublishedPostName (other filter captions)', 'revisionary')), esc_html($published_title), esc_html($filter_csv) ); +} else + printf( esc_html__('Revision Queue %s', 'revisionary' ), esc_html($filter_csv)); +?>

+ +' . esc_html__( 'Search results for "%s"' ) . '', esc_html(wp_strip_all_tags(sanitize_text_field($_REQUEST['s']))) ); +} +?> + +
+ + + $count ) { + if ( $message == 'trashed' && isset( $_REQUEST['ids'] ) ) { + $any_messages = true; + break; + } elseif (!empty($bulk_messages['post'][$message])) { + $any_messages = true; + break; + } +} + +if (!empty($any_messages)) { + echo '

'; +} + +foreach ( $bulk_counts as $message => $count ) { + if ( $message == 'trashed' && isset( $_REQUEST['ids'] ) ) { + $ids = preg_replace( '/[^0-9,]/', '', sanitize_text_field($_REQUEST['ids'])); + echo '' . esc_html__('Undo') . ' '; + + } elseif (!empty($bulk_messages['post'][$message])) { + echo esc_html($bulk_messages['post'][$message]) . ' '; + } +} + +if (!empty($any_messages)) { + echo '

'; +} + +unset( $messages ); + +if (!empty($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'locked', 'skipped', 'updated', 'approved_count', 'published_count', 'deleted', 'trashed', 'untrashed' ), esc_url(esc_url_raw($_SERVER['REQUEST_URI'])) ); +} +?> + +views(); ?> + +
+ +search_box( 'Search', 'post' ); ?> + + + + + + + + +display(); ?> + +
+ +
+
+ + + +
+ + + * @copyright Copyright (c) 2019 PublishPress. All rights reserved. + * @license GPLv2 or later + * @since 1.0.0 + */ +function rvy_metabox_notification_list() { + global $revisionary; + + $notify_editors = (string) rvy_get_option('pending_rev_notify_admin'); + $notify_author = (string) rvy_get_option('pending_rev_notify_author'); + + if ( ( '1' !== $notify_editors ) && ( '1' !== (string) $notify_author ) ) + return; + + $object_id = rvy_detect_post_id(); + + require_once( dirname(REVISIONARY_FILE) . '/revision-workflow_rvy.php' ); + $result = Rvy_Revision_Workflow_UI::default_notification_recipients($object_id); + + foreach (['default_ids', 'post_publishers', 'publisher_ids'] as $var) { + $$var = $result[$var]; + } + + require_once('agents_checklist_rvy.php'); + + echo("
"); + + if ( $default_ids ) { + RevisionaryAgentsChecklist::agents_checklist( 'user', $post_publishers, 'prev_cc', $default_ids ); + } else { + if ( ( 'always' === $notify_editors ) && $publisher_ids ) + esc_html_e( 'Publishers will be notified (but cannot be selected here).', 'revisionary' ); + else + esc_html_e( 'No email notifications will be sent.', 'revisionary' ); + } + + echo('
'); +} + +/** + * Retrieve formatted date timestamp of a revision (linked to that revisions's page). + * + * @param int|object $revision Revision ID or revision object. + * @param bool $link Optional, default is true. Link to revisions's page? + * @return string i18n formatted datetimestamp or localized 'Current Revision'. + */ +function rvy_post_revision_title( $revision, $link = true, $date_field = 'post_date', $args = array() ) { + global $revisionary; + + $defaults = array( 'post' => false, 'format' => 'list' ); + $args = array_merge( $defaults, (array) $args ); + foreach ( array_keys( $defaults ) as $var ) { $$var = $args[$var]; } + + if ( ! is_object($revision) ) + if ( !$revision = get_post( $revision ) ) + return $revision; + + $public_types = array_keys($revisionary->enabled_post_types); + $public_types []= 'revision'; + + if ( ! in_array( $revision->post_type, $public_types ) ) + return false; + + /* translators: revision date format, see http://php.net/date */ + $datef = _x( 'j F, Y @ g:i a', 'revision date format', 'revisionary' ); + + $date = agp_date_i18n( $datef, strtotime( $revision->$date_field ) ); + + // note: RS filter (un-requiring edit_published/private cap) will be applied to this cap check + + if ( $link ) { + if ('inherit' == $revision->post_status) { + $link = "revision.php?revision=$revision->ID"; + } else { + $link = rvy_preview_url($revision); + } + + $date = "$date"; + } + + $status_obj = get_post_status_object( $revision->post_status ); + + if ( $status_obj && ( $status_obj->public || $status_obj->private ) ) { + $currentf = esc_html__( '%1$s (Current)', 'revisionary' ); + $date = sprintf( $currentf, $date ); + + } elseif ( rvy_post_id($revision->ID) . "-autosave" === $revision->post_name ) { + $autosavef = esc_html__( '%1$s (Autosave)', 'revisionary' ); + $date = sprintf( $autosavef, $date ); + } + + if ( in_array( $revision->post_status, array( 'inherit', 'pending-revision' ) ) && $post && ( 'list' == $format ) && ( 'post_modified' == $date_field ) ) { + if ( $post->post_date != $revision->post_date ) { + $datef = _x( 'j F, Y, g:i a', 'revision schedule date format', 'revisionary' ); + $revision_date = agp_date_i18n( $datef, strtotime( $revision->post_date ) ); + + if ( 'pending-revision' == $revision->post_status ) { + $currentf = esc_html__( '%1$s (Requested publication: %2$s)', 'revisionary' ); + } else { + $currentf = esc_html__( '%1$s (Publish date: %2$s)', 'revisionary' ); + } + + $date = sprintf( $currentf, $date, $revision_date ); + } + } + + return $date; +} + +/** + * Display list of a post's revisions (modified by PublishPress to include view links). + * + * Can output either a UL with edit links or a TABLE with diff interface, and + * restore action links. + * + * Second argument controls parameters: + * (bool) parent : include the parent (the "Current Revision") in the list. + * (string) format : 'list' or 'form-table'. 'list' outputs UL, 'form-table' + * outputs TABLE with UI. + * (int) right : what revision is currently being viewed - used in + * form-table format. + * (int) left : what revision is currently being diffed against right - + * used in form-table format. + * + * @uses wp_get_post_revisions() + * @uses wp_post_revision_title() + * @uses get_edit_post_link() + * @uses get_the_author_meta() + * + * @todo split into two functions (list, form-table) ? + * + * @param int|object $post_id Post ID or post object. + * @param string|array $args See description {@link wp_parse_args()}. + * @return null + */ +function rvy_list_post_revisions( $post_id = 0, $status = '', $args = null ) { + if ( !$post = get_post( $post_id ) ) + return; + + $defaults = array( 'parent' => false, 'right' => false, 'left' => false, 'format' => 'list', 'type' => 'all', 'echo' => true, 'date_field' => '', 'current_id' => 0 ); + $args = wp_parse_args( $args, $defaults ); + + foreach( array_keys( $defaults ) as $var ) { + if ( ! isset( $$var ) ) { + $$var = ( isset( $args[$var] ) ) ? $args[$var] : $defaults[$var]; + } + } + + // link to publish date in Edit Form metaboxes, but modification date in Revisions Manager table + if ( ! $date_field ) { + if ( 'list' == $format ) { + $date_field = 'post_modified'; + $sort_field = $date_field; + } else { + $date_field = 'post_modified'; + $sort_field = 'post_date'; + } + } else { + if ( ! $sort_field ) + $sort_field = $date_field; + } + + global $current_user, $revisionary; + + switch ( $type ) { + case 'autosave' : + if ( !$autosave = wp_get_post_autosave( $post->ID ) ) + return; + $revisions = array( $autosave ); + break; + case 'revision' : // just revisions - remove autosave later + case 'all' : + default : + if ( !$revisions = rvy_get_post_revisions( $post->ID, $status, array( 'orderby' => $sort_field ) ) ) + return; + break; + } + + if ( $parent ) + array_unshift( $revisions, $post ); + + $rows = ''; + $class = ''; + + $can_edit_post = current_user_can('edit_post', $post->ID); + + $hide_others_revisions = ! $can_edit_post && empty($current_user->allcaps['list_others_revisions']) && rvy_get_option('revisor_hide_others_revisions'); + + $count = 0; + $left_checked_done = false; + $right_checked_done = false; + $can_delete_any = false; + + // TODO: should this buffer listed revision IDs instead of post ID ? + if ( defined('RVY_CONTENT_ROLES') ) { + $revisionary->content_roles->add_listed_ids( 'post', $post->post_type, $post->ID ); + } + + foreach ( $revisions as $revision ) { + if ( $status && ( $status != $revision->post_status ) ) // support arg to display only past / pending / future revisions + if ( ('revision' == $revision->post_type) || rvy_in_revision_workflow($revision) ) // but always display current rev + continue; + + if ( 'revision' === $type && wp_is_post_autosave( $revision ) ) + continue; + + if ( $hide_others_revisions && ( ( 'revision' == $revision->post_type ) || rvy_in_revision_workflow($revision) ) && !rvy_is_post_author($revision) ) + continue; + + $date = rvy_post_revision_title( $revision, true, $date_field, compact( 'post', 'format' ) ); + + $name = get_the_author_meta( 'display_name', $revision->post_author ); + + if ( 'form-table' == $format ) { + if ( ! $left_checked_done ) { + if ( $left ) + $left_checked = ( $left == $revision->ID ) ? ' checked="checked"' : ''; + else + $left_checked = ( $right == $revision->ID ) ? '' : ' checked="checked"'; + } + + if ( ! $right_checked_done ) { + if ( $right ) + $right_checked = ( $right == $revision->ID ) ? ' checked="checked"' : ''; + else + $right_checked = $left_checked ? '' : ' checked="checked"'; + } + + $actions = ''; + if ( $revision->ID == $current_id ) + $class = "rvy-revision-row rvy-current-revision"; + elseif ( $class ) + $class = "rvy-revision-row"; + else + $class = "rvy-revision-row alternate"; + + $datef = __awp( 'M j, Y @ g:i a' ); + + $rows .= ""; + + if ( $post->ID != $revision->ID ) { + if ('inherit' == $revision->post_status) { + // @todo: need this case? + $preview_arg = (defined('RVY_PREVIEW_ARG')) ? sanitize_key(constant('RVY_PREVIEW_ARG')) : 'rv_preview'; + $preview_url = add_query_arg($preview_arg, '1', get_post_permalink( $revision->ID ) . '&post_type=revision' ); + } else { + $preview_url = rvy_preview_url($revision, ['post_type' => $post->post_type]); + } + + $rows .= "$date"; + + $rows .= "" + . '' . esc_html__( 'Preview' ) . '' + . ""; + + $rows .= "" . esc_html($name) . ""; + + $rows .= ""; + + if ( $can_edit_post ) { + if ( 'future-revision' == $status ) { + $link = "admin.php?page=rvy-revisions&action=unschedule&revision={$revision->ID}"; + $rows .= '' . esc_html__('Unschedule') . ' | '; + } + + if ('inherit' == $status) { + $link = "admin.php?page=rvy-revisions&action=delete&revision={$revision->ID}"; + + $delete_msg = esc_html__( "The revision will be deleted. Are you sure?", 'revisionary' ); + + $rows .= '' . esc_html(__awp('Delete')) + . ''; + } + } + + $rows .= ''; + } else { + // wp_post_revision_title() returns edit post link for current rev. Convert it to a revisions.php link for viewing here like the rest + if ( $post->ID == $revision->ID ) { + $date = str_replace( "{$post->post_type}.php", 'revision.php', $date ); + $date = str_replace( 'action=edit', '', $date ); + $date = str_replace( 'post=', 'revision=', $date ); + $date = str_replace( '?&', '?', $date ); + $date = str_replace( '?&', '?', $date ); + + $date = str_replace( '&revision=', "&revision_status=$status&revision=", $date ); + $date = str_replace( '&revision=', "&revision_status=$status&revision=", $date ); + } + + $rows .= "$date"; + + $rows .= "" + . 'ID}&mark_current_revision=1")) . '" target="_blank">' . esc_html(__awp( 'Preview' )) . '' + . ""; + + $rows .= "" . esc_html($name) . ""; + $rows .= ""; + } + + + if ( $post->ID != $revision->ID + && ( $can_edit_post || ( ('pending-revision' == $status) && rvy_is_post_author($revision) ) ) // allow submitters to delete their own still-pending revisions + ) { + $rows .= ""; + $can_delete_any = true; + } else + $rows .= ""; + + $rows .= ""; + + if ( $left_checked ) { + $left_checked = ''; + $left_checked_done = true; + } + + if ( $right_checked ) { + $right_checked = ''; + $right_checked_done = true; + } + + } else { + /* translators: post revision: 1: when, 2: author name */ + $rows .= "
  • " . sprintf( _x( '%1$s by %2$s', 'post revision' ), $date, esc_html($name) ) . "
  • "; + } + + $count++; + } + + if ( 'form-table' == $format ) : + if ( $count > 1 ) : + ?> +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + +
    + + +
    + +\n$rows"; // output variables escaped upstream + } + + return $count; + } else + if ($rows) { + return ""; + } else { + return ''; + } + endif; // list or table +} diff --git a/wp-content/plugins/revisionary/admin/revisionary.css b/wp-content/plugins/revisionary/admin/revisionary.css new file mode 100644 index 000000000..a11353590 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/revisionary.css @@ -0,0 +1,836 @@ +/* Revisionary. Copyright (C) 2019, PublishPress + * This file is licensed under the GNU GPL. + */ + + +#submitdiv a.now-timestamp { +margin-left:10px; +} + +/* marker class used to trigger element hiding by javascript */ +.agp_js_hide { +padding: default; +} + +.agp_js_show { +padding: default; +} + +.agp-vspaced_input { +margin-top: 0.2em; +margin-bottom: 0.6em; +} + +.rs-list_horiz { +width: 100%; +clear: both; +float: left; +margin: 0; +padding: 0; +} + +.rs-list_horiz li { +list-style: none; +float: left; +margin: 0; +} + +#rvy-features .rs-form-table { +border: 1px solid #ccc; +margin-top: 0; +background-color: white; +} + +.rs-form-table th { +padding-left: 10px; +} + +.rs-form-table input { +vertical-align: text-bottom; +} + +.rs-blue, .rs-blue a, .rs-blue a:link, .rs-blue a:visited { +color: blue; +} + +.rs-backtan { +background-color: #FFFEEB; +} + +.rs-backgray { +background-color: #d8d8d8; +} + +.rs-backgreen { +background-color: #CDD7BA; +} + +.rs-options { +padding: 0 0.5em 1em 0.5em; +border: 1px solid #ccc; +margin-top:0; +} + +.rs-agents { +background-color: #FFFEEB; +padding: 0 0 0.2em 0.3em; +border: 1px solid #ccc; +margin-top:0; +} + +.rs-agents input { +vertical-align: text-bottom; +} + +.agp-agent { +padding: 0.2em 0.5em 0.2em 0.5em; +} + +.agp-unselected_agent { +border: none; +} + +#wpbody-content .agp-selected_agent { +border-left: 1px solid #ccc; +border-right: 1px solid #ccc; +border-top: 1px solid #ccc; +border-bottom: none; +} + +#wpbody-content .agp-selected_agent a{ +color: black; +text-decoration: none; +font-weight: bold; +} + +.agp-unselected_agent a{ +color: #00019b; +text-decoration: default; +font-weight: normal; +} + +.agp-selected_agent_colorized { +background-color: #FFFEEB; +border-bottom: 1px solid #FFFEEB; +} + +.agp-unselected_agent_colorized { +background: none; +} + +.rs-agents_caption { +margin: 0 0 0 0.75em; +clear:both; +} + +.rs-agents_checkbox { +margin-left: 0; +} + +.rs-agents_filter { +margin: 0 0 0.5em 0; +} + +.rs-agents_list_auto { +margin-top: 0; +margin-bottom: 5px; +padding: 0; +clear: both; +float: left; +width: 100%; +} + +.rs-agents_list_auto li { +list-style: none; +float: left; +margin: 0.3em 1.5em 0.3em 0; +} + +.rs-agents_list_auto input { +margin: 0; +font-size: auto; +padding: 0; +} + +.rs-agents_emsized { +clear: both; +width: 100%; +} + +.rs-agents_emsized ul { +margin: 0 0 1em 0; +padding: 0; +clear: both; +float: left; +width: 100%; +} + +.rs-agents_emsized ul li { +margin: 0.3em 0 0.3em 0; +list-style: none; +float: left; +} + +.rs-agents_emsized ul input { +margin: 0; +font-size: auto; +padding: 0; +} + +.rs-agents_list_7 li { width: 7em; } +.rs-agents_list_8 li { width: 8em; } +.rs-agents_list_9 li { width: 9em; } +.rs-agents_list_10 li { width: 10em; } +.rs-agents_list_11 li { width: 11em; } +.rs-agents_list_12 li { width: 12em; } +.rs-agents_list_13 li { width: 13em; } +.rs-agents_list_14 li { width: 14em; } +.rs-agents_list_15 li { width: 15em; } +.rs-agents_list_16 li { width: 16em; } +.rs-agents_list_17 li { width: 17em; } +.rs-agents_list_18 li { width: 18em; } +.rs-agents_list_19 li { width: 19em; } +.rs-agents_list_20 li { width: 20em; } +.rs-agents_list_21 li { width: 21em; } +.rs-agents_list_22 li { width: 22em; } +.rs-agents_list_23 li { width: 23em; } +.rs-agents_list_24 li { width: 24em; } +.rs-agents_list_25 li { width: 25em; } +.rs-agents_list_26 li { width: 26em; } +.rs-agents_list_27 li { width: 27em; } +.rs-agents_list_28 li { width: 28em; } +.rs-agents_list_29 li { width: 29em; } +.rs-agents_list_30 li { width: 30em; } + +.rs-agents_list_7_5 li { width: 7.5em; } +.rs-agents_list_8_5 li { width: 8.5em; } +.rs-agents_list_9_5 li { width: 9.5em; } +.rs-agents_list_10_5 li { width: 10.5em; } +.rs-agents_list_11_5 li { width: 11.5em; } +.rs-agents_list_12_5 li { width: 12.5em; } +.rs-agents_list_13_5 li { width: 13.5em; } +.rs-agents_list_14_5 li { width: 14.5em; } +.rs-agents_list_15_5 li { width: 15.5em; } +.rs-agents_list_16_5 li { width: 16.5em; } +.rs-agents_list_17_5 li { width: 17.5em; } +.rs-agents_list_18_5 li { width: 18.5em; } +.rs-agents_list_19_5 li { width: 19.5em; } +.rs-agents_list_20_5 li { width: 20.5em; } +.rs-agents_list_21_5 li { width: 21.5em; } +.rs-agents_list_22_5 li { width: 22.5em; } +.rs-agents_list_23_5 li { width: 23.5em; } +.rs-agents_list_24_5 li { width: 24.5em; } +.rs-agents_list_25_5 li { width: 25.5em; } +.rs-agents_list_26_5 li { width: 26.5em; } +.rs-agents_list_27_5 li { width: 27.5em; } +.rs-agents_list_28_5 li { width: 28.5em; } +.rs-agents_list_29_5 li { width: 29.5em; } +.rs-agents_list_30_5 li { width: 30.5em; } + +.rs-subtext { +color: #777; +font-style:italic; +margin-top:2px; +} + +.rs-warning { +color: #b00; +} + +.rs-optiontable { +width: 100%; +} + +#rs-realm_table tr, #realm_adjustments tr, #rs-advanced_table tr { +background-color: #f1f1f1; +border-bottom: 4px solid #FFFEEB; +} + +.rs-backgreen #rs-realm_table tr, .rs-backgreen #realm_adjustments tr, .rs-backgreen #rs-advanced_table tr { +border-bottom: 4px solid #CDD7BA; +} + +.rs-backgray #rs-realm_table tr, .rs-backgray #realm_adjustments tr, .rs-backgray #rs-advanced_table tr { +border-bottom: 4px solid #d8d8d8; +} + +#rs-realm_table tr td, #realm_adjustments tr td, #rs-advanced_table tr td { +padding: 1em 0 1em 0; +} + +#rs-realm_table th, #realm_adjustments th, #rs-advanced_table th { +font-weight: bold; +} + +.rs-form-table tr th span a { +color: #333; +background-color: #eee; +} + +.rs-optionhint { +margin-top: 0.5em; +padding-left: 5px; +} + +.rs-notes { +margin-top: 0.2em; +list-style-type: circle; +} + +.rs-notes li { +margin-bottom: 1em; +margin-left: 1.5em; +} + +.rs-revision_top_action { +font-family: Verdana, Arial, Helvetica, sans-serif; +font-size: 24px; +font-style: normal; +} + +.rs-revision_top_action a, .rs-revision_top_action a:visited, .rs-revision_top_action a:link { +color: #080; +} + +.rs-revision_top_action a:hover { +color: #0c0; +} + +.rs-h3text { +font-size: 1.5em; +font-weight: bold; +} + +.rvy_select_status a { +margin-right: 1em; +} + +.rvy_current_status a { +font-size: 150%; +} + +.rvy-agents-checklist { +padding:0.5em 0 0.5em 0.5em; +} + +#rvy-agents-checklist-spacer { +clear: both; +height: 1px; +} + +.rvy-list-horiz { +margin:5px 0 10px 0; +} + +.rvy-available-agents { +clear: both; +margin-top: 0.1em; +} + +.rvy-cclist { +margin-bottom:0; +} + +.rvy-current-revision { +background-color: #FFFDE9; +box-shadow: 0 0 0 1px #ddd; +} + +.rvy-revision-row { +white-space: nowrap; +} + +.rvy-col1 { +width: 35%; +} +.rvy-col2 { +width: 25%; +} +.rvy-col3 { +width: 10%; +} +.rvy-col4 { +width: 15%; +} +.rvy-col5 { +width: 15%; +} + +.rvy-editor-table { +width: 100%; +clear: both; +margin: 0 0 1em 0; +padding: 0; +} + +.rvy-editor-table h2 { +margin: 0; +} + +span.rvy-restore-link { +margin-left: 2em; +} + +div.rvy-restore-link { +margin-top: 20px; +} + +.rvy-message { +margin-bottom: 0; +} + +.rvy-date-selection { +text-align: right; +padding-top: 1em; +} + +.rvy_revision_edit_secondary_div { +float: right; +margin: 0.5em 0 1em 0; +} + +.rvy-editor { +margin-top: -2em; +} + +.rvy-title-div { +clear: both; +} + +.rvy-postarea { +clear: both; +} + +.rvy-revision-field { +margin: 2em 0 0 0; +} + +.rvy-agents-filter { +width: 99%; +} + +.rvy-editor-table-top { +vertical-align: top; +} + +body.toplevel_page_revisionary-q h1 span.dashicons, +body.revisions_page_revisionary-deletion h1 span.dashicons, +body.revisions_page_revisionary-settings h1 span.dashicons, +body.revisions_page_rvy-net_options h1 span.dashicons, +body.revisions_page_rvy-default_options h1 span.dashicons, +body.revisions_page_revisionary-archive h1 span.dashicons { +padding-top:5px; +} + +body.revisions_page_revisionary-settings div.submit, body.revisions_page_rvy-net_options div.submit, body.revisions_page_rvy-default_options div.submit { +padding-top:0; +} + +body.admin_page_rvy-revisions table.diff td, table.diff th { +max-width: 400px; +} + +body.admin_page_rvy-revisions #title { + font-size: 1.7em; + height: 1.7em; + line-height: 100%; + margin: 1px 0; + outline: medium none; + padding: 3px 8px; + width: 100%; +} + +body.admin_page_rvy-revisions #commentsdiv { +display: none; +} + +table.diff { + width: 100%; +} + +table.diff col.content, table.diff tr td { + width: 50% !important; +} + +table.diff tr { + background-color: transparent; +} + +table.diff td, table.diff th { + font-family: Consolas, Monaco, monospace; + border: none; +} + +table.diff .diff-deletedline del, table.diff .diff-addedline ins { + text-decoration: none; +} + +div.rvy-glance-pending { +padding-bottom: 6px; +} + +span.rvy-revision-pubish-date { +font-style: italic; +} + +div.publishpress-headline {line-height:25px} +span.publishpress-thanks{margin-left:5px;color:#655997;white-space:nowrap} +span.publishpress-thanks,#akmin span.publishpress-thanks a,#akmin span.publishpress-thanks a:visited {color:#655997;font-weight:bold;} + +.rvy-admin-notice { +padding:10px; +line-height:18px; +position:relative; +} +.rvy-admin-notice-plugin { +margin-top:30px; +margin-right:120px; +} +#rvy_dashboard_message, .rvy-admin-notice, .rvy-admin-notice-plugin{ +padding:10px; +} + +div.revisions-controls .author-card input[type="button"] { +padding-bottom:2px; +} + +span.rvy-requested-date { +color: #aaa; +font-style: italic; +} + +.pressshack-admin-wrapper p.submit { +padding-bottom:0; +} + +.pressshack-admin-wrapper .button-primary { +text-shadow: none; +} + +#wpbody-content .pressshack-admin-wrapper > footer > div.pp-rating { +margin-top:5px; +} + +div.revision-q .column-author, div.revision-q .column-date, div.revision-q .column-parent, div.revision-q .column-posts { +width:auto; +} + +#revisions-pro-descript { +border-width: 1px; +border-style: solid; +padding: 5px; +margin: 0 10px 10px 0; +-moz-border-radius: 3px; +-khtml-border-radius: 3px; +-webkit-border-radius: 3px; +border-radius: 3px; +background-color: #ffffe0; +border-color: #e6db55; +} + +#submitdiv_pps #save-action span.spinner { +margin: 2px 2px 0; +} + + +.diff-meta input.edit-revision { +float: right; +margin-left: 6px; +margin-right: 6px; +margin-top: 2px; +} + +.toplevel_page_revisionary-q .pressshack-admin-wrapper a, .revisions_page_revisionary-deletion .pressshack-admin-wrapper a { +color: #2271B1; +} + +.pressshack-admin-wrapper footer a { +color: #655997 !important; +} + +div.components-panel div.revision-submitting { + margin: 6px 0 6px 0; +} + +div.components-panel div.revision-creating { + margin: 15px 0 15px 0; + padding: 6px 0 9px 80px; /* @todo: review this spacing relative to button.revision-created */ +} + +div.components-panel span.ppr-submission-spinner, div.components-panel div.revision-submitting span.spinner { +float: none; +height: 25px !important; +} + +div.components-panel button.revision-approve, +div.components-panel div.revision-created +{ + margin: 0 0 15px 0; +} + +a.revision-approve button.is-primary { + margin-top: 15px; +} + +.edit-post-sidebar .ppr-purple-button.components-button.is-tertiary, +.edit-post-sidebar .ppr-purple-button.components-button.is-secondary { + padding: 0 7px; +} + +div.rvy-revision-created { +text-align: center; +} + +span.revision-created, span.revision-scheduled { +font-weight: bold; +} + +div.components-panel div.revision-created { +font-weight: bold; +text-align: center; +margin: 0; +} + +div.components-panel div.revision-created a.revision-approve { +margin-top: 5px; +} + +div.revision-created-buttons { +margin-top: 5px !important; +margin-bottom: 5px; +} + +button.revision-created { +padding: 0; +} + +#major-publishing-actions div.revision-created-wrapper { +margin-top: 15px !important; +margin-bottom: 20px !important; +} + +#major-publishing-actions a.revision-preview, #major-publishing-actions a.revision-edit, +div.rvy-creation-ui a.revision-preview, div.rvy-creation-ui a.revision-edit +{ +margin-right: 5px !important; +} + +div.edit-post-revision-status { +justify-content: left; +} + +div.edit-post-revision-status span { +width: 35%; +} + +/* +div.edit-post-post-schedule span { +width: 30%; +} +*/ + +div.components-panel a.revision-edit { +text-decoration: underline; +color: #135e96; +font-weight: normal; +text-align: left; +padding: 0 0 0 7px; +} + +button.post-schedule-footnote { +color: black !important; +background-color: white !important; +padding-left: 2px !important; +} + +button.edit-post-post-schedule__toggle { +padding-right: 2px !important; +} + +div.components-panel a.revision-approve{ +text-decoration: none; +margin: 15px 0 0 5px; +} + +.components-button.editor-post-last-revision__title { +height: auto; +} + +/* Classic */ +#submitpost #revision-compare { +margin: 5px 10px 10px 5px; +} + +#submitpost div.rvy-revision-approve { +line-height: 2.1; +} + +#submitpost div.rvy-revision-approve a, #submitpost div.rvy-revision-approve a:link, #submitpost div.rvy-revision-approve a:visited { +color: #070; +font-weight: bold; +} + +/* Primary button in purple requires these 3 classes together for ' + + + '' + + + '
    ' + rvyObjEdit.completedCaption + '
    ' + + + '
    '; + + if (rvyObjEdit.completedURL) { + html = html + ''; + } + + html = html + '' + + '
    ' + + if (rvyObjEdit.scheduleCaption) { + let postStatus = wp.data.select('core/editor').getCurrentPostAttribute('status'); + var publishedStatuses = Object.keys(rvyObjEdit.publishedStatuses).map(function (key) { return rvyObjEdit.publishedStatuses[key]; }); + rvyIsPublished = publishedStatuses.indexOf(postStatus) >= 0; + + if (rvyIsPublished) { + html += '' + + + ''; + } + } + + html += ''; + + var elem = $('div.editor-post-schedule__panel-dropdown').closest('div.editor-post-panel__row'); + + if (!$(elem).length) { + elem = $('div.edit-post-post-schedule'); + } + + $(elem).first().after(html); + + if (rvyCreationDisabled) { + $('button.revision-approve').prop('disabled', 'disabled'); + $('button.revision-schedule').prop('disabled', 'disabled'); + $('a.revision-approve').attr('title', rvyObjEdit.actionDisabledTitle); + $('a.revision-schedule').attr('title', rvyObjEdit.scheduleDisabledTitle); + } else { + $('button.revision-approve').prop('disabled', false); + $('button.revision-schedule').prop('disabled', false); + $('a.revision-approve').attr('title', rvyObjEdit.actionTitle); + $('a.revision-schedule').attr('title', rvyObjEdit.scheduleTitle); + } + + RvyRefreshScheduleButton(); + } + } + var RvyUIInterval = setInterval(RvySubmissionUI, 200); + + function RvyGetRandomInt(max) { + return Math.floor(Math.random() * max); + } + + var rvyCreationDisabled = false; + + $(document).on('click', 'div.postbox-container', function() { + rvyCreationDisabled = true; + $('button.revision-approve').prop('disabled', 'disabled'); + $('button.revision-schedule').prop('disabled', 'disabled'); + $('a.revision-approve').attr('title', rvyObjEdit.actionDisabledTitle); + $('a.revision-schedule').attr('title', rvyObjEdit.scheduleDisabledTitle); + }); + + $(document).on('click', 'button.editor-post-publish-button', function() { + rvyCreationDisabled = false; + $('button.revision-approve').prop('disabled', false); + $('button.revision-schedule').prop('disabled', false); + $('a.revision-approve').attr('title', rvyObjEdit.actionTitle); + $('a.revision-schedule').attr('title', rvyObjEdit.scheduleTitle); + }); + + var rvyIsAutosaveStarted = false; + var rvyIsAutosaveDone = false; + + $(document).on('click', 'button.revision-create', function() { + if ($('a.revision-create').attr('disabled')) { + return; + } + + $('button.revision-create').hide(); + $('div.revision-creating').show(); + $('div.revision-creating span.ppr-submission-spinner').css('visibility', 'visible'); + + if (!wp.data.select('core/editor').isEditedPostDirty()) { + rvyCreateCopy(); + return; + } + + rvyIsAutosaveStarted = false; + rvyIsAutosaveDone = false; + + wp.data.dispatch('core/editor').autosave(); + + var tmrNoAutosave = setTimeout(() => { + if (!rvyIsAutosaveStarted) { + clearInterval(intAutosaveWatch); + rvyCreateCopy(); + } + }, 10000); + + var intAutosaveDoneWatch; + + var intAutosaveWatch = setInterval(() => { + if (wp.data.select('core/editor').isAutosavingPost()) { + rvyIsAutosaveStarted = true; + clearInterval(intAutosaveWatch); + clearTimeout(tmrNoAutosave); + + var tmrAutosaveTimeout = setTimeout(() => { + if (!rvyIsAutosaveDone) { + clearInterval(intAutosaveWatch); + rvyCreateCopy(); + } + }, 10000); + + intAutosaveDoneWatch = setInterval(() => { + if (!wp.data.select('core/editor').isAutosavingPost()) { + rvyIsAutosaveDone = true; + clearInterval(intAutosaveDoneWatch); + clearTimeout(tmrAutosaveTimeout); + rvyCreateCopy(); + } + }, 100); + } + }, 100); + }); + + function rvyCreateCopy() { + var revisionaryCreateDone = function () { + $('.revision-create').hide(); + $('.revision-creating').hide(); + $('.revision-created').show(); + + $('a.revision-approve span.spinner').css('visibility', 'hidden'); + + if (rvyObjEdit.completedURL) { + $('button.revision-created a.revision-preview').attr('href', rvyObjEdit.completedURL); + } else { + $('button.revision-created a.revision-preview').hide(); + } + + $('button.revision-created a.revision-edit').attr('href', rvyObjEdit.completedEditURL); + } + + var revisionaryCreateError = function (data, txtStatus) { + $('div.rvy-creation-ui').html(rvyObjEdit.errorCaption); + } + + var data = {'rvy_ajax_field': 'create_revision', 'rvy_ajax_value': wp.data.select('core/editor').getCurrentPostId(), 'rvy_date_selection': RvyTimeSelection, 'nc': RvyGetRandomInt(99999999)}; + + $.ajax({ + url: rvyObjEdit.ajaxurl, + data: data, + dataType: "html", + success: revisionaryCreateDone, + error: revisionaryCreateError + }); + } + + $(document).on('click', 'button.revision-schedule', function() { + if ($('a.revision-schedule').attr('disabled')) { + return; + } + + $('button.revision-schedule').prop('disabled', true); + + var revisionaryScheduleDone = function () { + $('.revision-schedule').hide(); + $('.revision-scheduled').show(); + + $('button.revision-scheduled a.revision-preview').attr('href', rvyObjEdit.scheduledURL); + $('button.revision-scheduled a.revision-edit').attr('href', rvyObjEdit.scheduledEditURL); + + wp.data.dispatch('core/editor').editPost({date: wp.data.select('core/editor').getCurrentPostAttribute('date')}); + } + + var revisionaryScheduleError = function (data, txtStatus) { + $('div.rvy-creation-ui').html(rvyObjEdit.errorCaption); + } + + var data = {'rvy_ajax_field': 'create_scheduled_revision', 'rvy_ajax_value': wp.data.select('core/editor').getCurrentPostId(), 'rvy_date_selection': RvyTimeSelection, 'nc': RvyGetRandomInt(99999999)}; + + $.ajax({ + url: rvyObjEdit.ajaxurl, + data: data, + dataType: "html", + success: revisionaryScheduleDone, + error: revisionaryScheduleError + }); + }); + + /** + * If date is set to future, change Publish button caption to "Schedule Revision", + * Then set a self-interval to refresh that status once the selected date is no longer future. + * + * If the selected date is already past, change Publish button back to "Update" + */ + var RvySelectedFutureDate = false; + var RvyTimeSelection = ''; + + var RvyRefreshScheduleButton = function() { + var selectedDateHTML = $('button.edit-post-post-schedule__toggle').html(); + + if (! /\d/.test(selectedDateHTML) || !rvyIsPublished) { + RvyTimeSelection = ''; + $('.rvy-creation-ui .revision-schedule').hide(); + $('.rvy-creation-ui .revision-scheduled').hide(); + $('.rvy-creation-ui .revision-creating').hide(); + $('.rvy-creation-ui .revision-created').hide(); + $('.rvy-creation-ui .revision-create').show(); + return; + } + + selectedDateHTML = wp.data.select('core/editor').getEditedPostAttribute('date'); + var selectedDate = new Date( selectedDateHTML ); + + + RvyTimeSelection = selectedDate.getTime(); + var tdiff = RvyTimeSelection - Date.now(); + + RvyTimeSelection = RvyTimeSelection / 1000; // pass seconds to server + + if ((tdiff > 1000)) { + RvySelectedFutureDate = true; + + $('.rvy-creation-ui .revision-create').hide(); + $('.rvy-creation-ui .revision-creating').hide(); + $('.rvy-creation-ui .revision-created').hide(); + $('.rvy-creation-ui .revision-scheduled').hide(); + $('.rvy-creation-ui .revision-schedule').show(); + + } else { + $('.rvy-creation-ui .revision-schedule').hide(); + $('.rvy-creation-ui .revision-scheduled').hide(); + $('.rvy-creation-ui .revision-created').hide(); + $('.rvy-creation-ui .revision-creating').hide(); + $('.rvy-creation-ui .revision-create').show(); + + if ( tdiff <= 0 ) { + if ( RvySelectedFutureDate ) { // If button isn't already recaptioned, don't mess with it or even query for it + RvyTimeSelection = ''; + } + } + } + } + + /** + * Detect date selection by display, then closure of popup dialog + */ + var RvyDetectPublishOptionsDivClosureInterval = false; + var RvyDetectPublishOptionsDiv = function() { + if ( $('div.edit-post-post-schedule__dialog').length ) { + clearInterval( RvyDetectPublishOptionsDivInterval ); + + var RvyDetectPublishOptionsClosure = function() { + if ( ! $('div.edit-post-post-schedule__dialog').length ) { + clearInterval(RvyDetectPublishOptionsDivClosureInterval); + RvyDetectPublishOptionsDivInterval = setInterval(RvyDetectPublishOptionsDiv, 500); + + RvyRefreshScheduleButton(); + } + } + RvyDetectPublishOptionsDivClosureInterval = setInterval(RvyDetectPublishOptionsClosure, 200); + } + } + + var RvyDetectPublishOptionsDivInterval = setInterval(RvyDetectPublishOptionsDiv, 500); +}); diff --git a/wp-content/plugins/revisionary/admin/rvy_post-block-edit.js b/wp-content/plugins/revisionary/admin/rvy_post-block-edit.js new file mode 100644 index 000000000..60ebc6c8b --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_post-block-edit.js @@ -0,0 +1,47 @@ +jQuery(document).ready(function($){if(rvyObjEdit.scheduledRevisionsURL||rvyObjEdit.pendingRevisionsURL){var RvyPendingRevPanel=function(){var ediv='div.edit-post-sidebar ';if(rvyObjEdit.scheduledRevisionsURL&&!$(ediv+'div.edit-post-last-revision__panel a.rvy-scheduled-revisions').length){var sclone=$('div.edit-post-last-revision__panel a:first').clone().addClass('rvy-scheduled-revisions').attr('href',rvyObjEdit.scheduledRevisionsURL).html(rvyObjEdit.scheduledRevisionsCaption);$(ediv+'div.edit-post-last-revision__panel a:last').after(sclone);} +if(rvyObjEdit.pendingRevisionsURL&&!$(ediv+'div.edit-post-last-revision__panel a.rvy-pending-revisions').length){var pclone=$('div.edit-post-last-revision__panel a:first').clone().addClass('rvy-pending-revisions').attr('href',rvyObjEdit.pendingRevisionsURL).html(rvyObjEdit.pendingRevisionsCaption);$(ediv+'div.edit-post-last-revision__panel a:last').after(pclone);} +$('div.edit-post-last-revision__panel').css('height','inherit');} +setInterval(RvyPendingRevPanel,200);} +var rvyIsPublished=false;var RvySubmissionUI=function(){if(rvyObjEdit.ajaxurl&&!$('button.revision-approve').length){var style=(rvyObjEdit.actionCaption=='')?' style="display:none"':'';var html='
    ' ++'' ++'
    '+rvyObjEdit.completedCaption+'
    ' ++'
    ';if(rvyObjEdit.completedURL){html=html+'';} +html=html+'' ++'
    ' +if(rvyObjEdit.scheduleCaption){let postStatus=wp.data.select('core/editor').getCurrentPostAttribute('status');var publishedStatuses=Object.keys(rvyObjEdit.publishedStatuses).map(function(key){return rvyObjEdit.publishedStatuses[key];});rvyIsPublished=publishedStatuses.indexOf(postStatus)>=0;if(rvyIsPublished){html+='' ++'';}} +html+='
    ';var elem=$('div.editor-post-schedule__panel-dropdown').closest('div.editor-post-panel__row');if(!$(elem).length){elem=$('div.edit-post-post-schedule');} +$(elem).first().after(html);if(rvyCreationDisabled){$('button.revision-approve').prop('disabled','disabled');$('button.revision-schedule').prop('disabled','disabled');$('a.revision-approve').attr('title',rvyObjEdit.actionDisabledTitle);$('a.revision-schedule').attr('title',rvyObjEdit.scheduleDisabledTitle);}else{$('button.revision-approve').prop('disabled',false);$('button.revision-schedule').prop('disabled',false);$('a.revision-approve').attr('title',rvyObjEdit.actionTitle);$('a.revision-schedule').attr('title',rvyObjEdit.scheduleTitle);} +RvyRefreshScheduleButton();}} +var RvyUIInterval=setInterval(RvySubmissionUI,200);function RvyGetRandomInt(max){return Math.floor(Math.random()*max);} +var rvyCreationDisabled=false;$(document).on('click','div.postbox-container',function(){rvyCreationDisabled=true;$('button.revision-approve').prop('disabled','disabled');$('button.revision-schedule').prop('disabled','disabled');$('a.revision-approve').attr('title',rvyObjEdit.actionDisabledTitle);$('a.revision-schedule').attr('title',rvyObjEdit.scheduleDisabledTitle);});$(document).on('click','button.editor-post-publish-button',function(){rvyCreationDisabled=false;$('button.revision-approve').prop('disabled',false);$('button.revision-schedule').prop('disabled',false);$('a.revision-approve').attr('title',rvyObjEdit.actionTitle);$('a.revision-schedule').attr('title',rvyObjEdit.scheduleTitle);});var rvyIsAutosaveStarted=false;var rvyIsAutosaveDone=false;$(document).on('click','button.revision-create',function(){if($('a.revision-create').attr('disabled')){return;} +$('button.revision-create').hide();$('div.revision-creating').show();$('div.revision-creating span.ppr-submission-spinner').css('visibility','visible');if(!wp.data.select('core/editor').isEditedPostDirty()){rvyCreateCopy();return;} +rvyIsAutosaveStarted=false;rvyIsAutosaveDone=false;wp.data.dispatch('core/editor').autosave();var tmrNoAutosave=setTimeout(()=>{if(!rvyIsAutosaveStarted){clearInterval(intAutosaveWatch);rvyCreateCopy();}},10000);var intAutosaveDoneWatch;var intAutosaveWatch=setInterval(()=>{if(wp.data.select('core/editor').isAutosavingPost()){rvyIsAutosaveStarted=true;clearInterval(intAutosaveWatch);clearTimeout(tmrNoAutosave);var tmrAutosaveTimeout=setTimeout(()=>{if(!rvyIsAutosaveDone){clearInterval(intAutosaveWatch);rvyCreateCopy();}},10000);intAutosaveDoneWatch=setInterval(()=>{if(!wp.data.select('core/editor').isAutosavingPost()){rvyIsAutosaveDone=true;clearInterval(intAutosaveDoneWatch);clearTimeout(tmrAutosaveTimeout);rvyCreateCopy();}},100);}},100);});function rvyCreateCopy(){var revisionaryCreateDone=function(){$('.revision-create').hide();$('.revision-creating').hide();$('.revision-created').show();$('a.revision-approve span.spinner').css('visibility','hidden');if(rvyObjEdit.completedURL){$('button.revision-created a.revision-preview').attr('href',rvyObjEdit.completedURL);}else{$('button.revision-created a.revision-preview').hide();} +$('button.revision-created a.revision-edit').attr('href',rvyObjEdit.completedEditURL);} +var revisionaryCreateError=function(data,txtStatus){$('div.rvy-creation-ui').html(rvyObjEdit.errorCaption);} +var data={'rvy_ajax_field':'create_revision','rvy_ajax_value':wp.data.select('core/editor').getCurrentPostId(),'rvy_date_selection':RvyTimeSelection,'nc':RvyGetRandomInt(99999999)};$.ajax({url:rvyObjEdit.ajaxurl,data:data,dataType:"html",success:revisionaryCreateDone,error:revisionaryCreateError});} +$(document).on('click','button.revision-schedule',function(){if($('a.revision-schedule').attr('disabled')){return;} +$('button.revision-schedule').prop('disabled',true);var revisionaryScheduleDone=function(){$('.revision-schedule').hide();$('.revision-scheduled').show();$('button.revision-scheduled a.revision-preview').attr('href',rvyObjEdit.scheduledURL);$('button.revision-scheduled a.revision-edit').attr('href',rvyObjEdit.scheduledEditURL);wp.data.dispatch('core/editor').editPost({date:wp.data.select('core/editor').getCurrentPostAttribute('date')});} +var revisionaryScheduleError=function(data,txtStatus){$('div.rvy-creation-ui').html(rvyObjEdit.errorCaption);} +var data={'rvy_ajax_field':'create_scheduled_revision','rvy_ajax_value':wp.data.select('core/editor').getCurrentPostId(),'rvy_date_selection':RvyTimeSelection,'nc':RvyGetRandomInt(99999999)};$.ajax({url:rvyObjEdit.ajaxurl,data:data,dataType:"html",success:revisionaryScheduleDone,error:revisionaryScheduleError});});var RvySelectedFutureDate=false;var RvyTimeSelection='';var RvyRefreshScheduleButton=function(){var selectedDateHTML=$('button.edit-post-post-schedule__toggle').html();if(!/\d/.test(selectedDateHTML)||!rvyIsPublished){RvyTimeSelection='';$('.rvy-creation-ui .revision-schedule').hide();$('.rvy-creation-ui .revision-scheduled').hide();$('.rvy-creation-ui .revision-creating').hide();$('.rvy-creation-ui .revision-created').hide();$('.rvy-creation-ui .revision-create').show();return;} +selectedDateHTML=wp.data.select('core/editor').getEditedPostAttribute('date');var selectedDate=new Date(selectedDateHTML);RvyTimeSelection=selectedDate.getTime();var tdiff=RvyTimeSelection-Date.now();RvyTimeSelection=RvyTimeSelection/1000;if((tdiff>1000)){RvySelectedFutureDate=true;$('.rvy-creation-ui .revision-create').hide();$('.rvy-creation-ui .revision-creating').hide();$('.rvy-creation-ui .revision-created').hide();$('.rvy-creation-ui .revision-scheduled').hide();$('.rvy-creation-ui .revision-schedule').show();}else{$('.rvy-creation-ui .revision-schedule').hide();$('.rvy-creation-ui .revision-scheduled').hide();$('.rvy-creation-ui .revision-created').hide();$('.rvy-creation-ui .revision-creating').hide();$('.rvy-creation-ui .revision-create').show();if(tdiff<=0){if(RvySelectedFutureDate){RvyTimeSelection='';}}}} +var RvyDetectPublishOptionsDivClosureInterval=false;var RvyDetectPublishOptionsDiv=function(){if($('div.edit-post-post-schedule__dialog').length){clearInterval(RvyDetectPublishOptionsDivInterval);var RvyDetectPublishOptionsClosure=function(){if(!$('div.edit-post-post-schedule__dialog').length){clearInterval(RvyDetectPublishOptionsDivClosureInterval);RvyDetectPublishOptionsDivInterval=setInterval(RvyDetectPublishOptionsDiv,500);RvyRefreshScheduleButton();}} +RvyDetectPublishOptionsDivClosureInterval=setInterval(RvyDetectPublishOptionsClosure,200);}} +var RvyDetectPublishOptionsDivInterval=setInterval(RvyDetectPublishOptionsDiv,500);}); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/rvy_post-classic-edit.dev.js b/wp-content/plugins/revisionary/admin/rvy_post-classic-edit.dev.js new file mode 100644 index 000000000..2fbb37e2f --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_post-classic-edit.dev.js @@ -0,0 +1,249 @@ +/** +* Classic Editor Modifications for Revisionary +* +* By Kevin Behrens +* +* Copyright 2021, PublishPress +*/ +jQuery(document).ready( function($) { + var rvyIsPublished = false; + + var RvySubmissionUI = function() { + if (rvyObjEdit.ajaxurl && !$('div.rvy-creation-ui').length) { + var hideStyle = (rvyObjEdit.actionCaption == '') ? ' style="display:none"' : ''; + + var html = '
    ' + + rvyObjEdit.actionCaption + '' + + ''; + + if (rvyObjEdit.scheduleCaption) { + var publishedStatuses = Object.keys(rvyObjEdit.publishedStatuses).map(function (key) { return rvyObjEdit.publishedStatuses[key]; }); + rvyIsPublished = publishedStatuses.indexOf(rvyObjEdit.currentStatus) >= 0; + + if (rvyIsPublished) { + html += '' + + + ''; + } + } + + html += '
    '; + + $('#delete-action').before(html); + } + } + var RvyUIInterval = setInterval(RvySubmissionUI, 100); + + /* + $(document).on('click', 'a.save-timestamp, a.cancel-timestamp', function() { + wp.autosave.server.triggerSave(); + }); + */ + + function RvyGetRandomInt(max) { + return Math.floor(Math.random() * max); + } + + $(document).on('click', 'a.revision-create', function() { + if ($('a.revision-create').attr('disabled')) { + return; + } + + $('a.revision-create').attr('disabled', 'disabled'); + + if (wp.autosave && wp.autosave.server.postChanged()) { + var tmoRevisionSubmit = setTimeout(rvyCopyPost, 5000); // @todo: review + + var intRevisionSubmit = setInterval(function() { + if (!wp.autosave.server.postChanged()) { + clearTimeout(tmoRevisionSubmit); + clearInterval(intRevisionSubmit); + rvyCopyPost(); + } + }, 250); + + wp.autosave.server.triggerSave(); + } else { + rvyCopyPost(); + } + }); + + function rvyCopyPost() { + var revisionaryCreateDone = function () { + $('.revision-create').hide(); + $('.revision-created-wrapper').show(); + + if (rvyObjEdit.completedURL) { + $('div.revision-created-wrapper a.revision-preview').attr('href', rvyObjEdit.completedURL); + } else { + $('div.revision-created-wrapper a.revision-preview').hide(); + } + + $('div.revision-created-wrapper a.revision-edit').attr('href', rvyObjEdit.completedEditURL); + $('a.revision-create').removeAttr('disabled'); + } + + var revisionaryCreateError = function (data, txtStatus) { + $('div.rvy-creation-ui').html(rvyObjEdit.errorCaption); + } + + var data = {'rvy_ajax_field': 'create_revision', 'rvy_ajax_value': rvyObjEdit.postID, 'rvy_date_selection': RvyTimeSelection, 'nc': RvyGetRandomInt(99999999)}; + + $.ajax({ + url: rvyObjEdit.ajaxurl, + data: data, + dataType: "html", + success: revisionaryCreateDone, + error: revisionaryCreateError + }); + } + + $(document).on('click', '#normal-sortables input, #normal-sortables select', function() { + $('a.revision-create').attr('disabled', 'disabled'); + $('a.revision-schedule').attr('disabled', 'disabled'); + }); + + $(document).on('click', 'a.revision-schedule', function() { + if ($('a.revision-schedule').attr('disabled')) { + return; + } + + $('a.revision-schedule').attr('disabled', 'disabled'); + + if (wp.autosave.server.postChanged()) { + wp.autosave.server.triggerSave(); + var approvalDelay = 250; + } else { + var approvalDelay = 1; + } + + var revisionaryScheduleDone = function () { + $('.revision-schedule').hide(); + $('.revision-scheduled-wrapper').show(); + + $('div.revision-scheduled-wrapper a.revision-preview').attr('href', rvyObjEdit.scheduledURL); + $('div.revision-scheduled-wrapper a.revision-edit').attr('href', rvyObjEdit.scheduledEditURL); + + $('a.revision-schedule').removeAttr('disabled'); + } + + var revisionaryScheduleError = function (data, txtStatus) { + $('div.rvy-creation-ui').html(rvyObjEdit.errorCaption); + } + + var tmoSubmit = setInterval(function() { + if (!wp.autosave.server.postChanged()) { + var data = {'rvy_ajax_field': 'create_scheduled_revision', 'rvy_ajax_value': rvyObjEdit.postID, 'rvy_date_selection': RvyTimeSelection, 'nc': RvyGetRandomInt(99999999)}; + + $.ajax({ + url: rvyObjEdit.ajaxurl, + data: data, + dataType: "html", + success: revisionaryScheduleDone, + error: revisionaryScheduleError + }); + + clearInterval(tmoSubmit); + } + }, approvalDelay); + }); + + $(document).on('click', '#post-body-content *, #content_ifr *, #wp-content-editor-container *, #tinymce *, #submitpost, span.revision-created', function() { + RvyRefreshScheduleButton(); + }); + + var $timestampdiv = $('#timestampdiv'); + $timestampdiv.find('.save-timestamp').on( 'click', function( event ) { + RvyRefreshScheduleButton(); + }); + + /** + * If date is set to future, change Publish button caption to "Schedule Revision", + * Then set a self-interval to refresh that status once the selected date is no longer future. + * + * If the selected date is already past, change Publish button back to "Update" + */ + var RvySelectedFutureDate = false; + var RvyTimeSelection = ''; + + var RvyRefreshScheduleButton = function() { + var selectedDateHTML = $('#timestamp').html(); + + if (! /\d/.test(selectedDateHTML) || !rvyIsPublished) { + RvyTimeSelection = ''; + $('.rvy-creation-ui .revision-schedule').hide(); + $('.rvy-creation-ui .revision-scheduled-wrapper').hide(); + $('.rvy-creation-ui .revision-created-wrapper').hide(); + $('.rvy-creation-ui .revision-create').show(); + return; + } + + var dateStr = $('#mm').val() + '/' + $('#jj').val() + '/' + $('#aa').val() + ' ' + $('#hh').val() + ':' + $('#mn').val() + ':00'; + var selectedDate = new Date( dateStr ); + + RvyTimeSelection = selectedDate.getTime(); + var tdiff = RvyTimeSelection - Date.now(); + + RvyTimeSelection = RvyTimeSelection / 1000; // pass seconds to server + + if ((tdiff > 1000)) { + RvySelectedFutureDate = true; + + $('.rvy-creation-ui').show(); + $('.rvy-creation-ui .revision-create').hide(); + $('.rvy-creation-ui .revision-created-wrapper').hide(); + $('.rvy-creation-ui .revision-scheduled-wrapper').hide(); + $('.rvy-creation-ui .revision-schedule').show(); + + $('#publish').hide(); + } else { + + if ('' == rvyObjEdit.actionCaption) { + $('.rvy-creation-ui').hide(); + } + + $('.rvy-creation-ui .revision-schedule').hide(); + $('.rvy-creation-ui .revision-scheduled-wrapper').hide(); + $('.rvy-creation-ui .revision-created-wrapper').hide(); + $('.rvy-creation-ui .revision-create').show(); + + if ( tdiff <= 0 ) { + if ( RvySelectedFutureDate ) { // If button isn't already recaptioned, don't mess with it or even query for it + RvyTimeSelection = ''; + } + } + + $('#publish').val(rvyObjEdit.update); + $('#publish').show(); + } + } + + $(document).on('click', 'a.save-timestamp, a.cancel-timestamp', function() { + RvyRefreshScheduleButton(); + }); +}); diff --git a/wp-content/plugins/revisionary/admin/rvy_post-classic-edit.js b/wp-content/plugins/revisionary/admin/rvy_post-classic-edit.js new file mode 100644 index 000000000..d58dca4ef --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_post-classic-edit.js @@ -0,0 +1,33 @@ +jQuery(document).ready(function($){var rvyIsPublished=false;var RvySubmissionUI=function(){if(rvyObjEdit.ajaxurl&&!$('div.rvy-creation-ui').length){var hideStyle=(rvyObjEdit.actionCaption=='')?' style="display:none"':'';var html='
    ' ++rvyObjEdit.actionCaption+'' ++'';if(rvyObjEdit.scheduleCaption){var publishedStatuses=Object.keys(rvyObjEdit.publishedStatuses).map(function(key){return rvyObjEdit.publishedStatuses[key];});rvyIsPublished=publishedStatuses.indexOf(rvyObjEdit.currentStatus)>=0;if(rvyIsPublished){html+='' ++'';}} +html+='
    ';$('#delete-action').before(html);}} +var RvyUIInterval=setInterval(RvySubmissionUI,100);function RvyGetRandomInt(max){return Math.floor(Math.random()*max);} +$(document).on('click','a.revision-create',function(){if($('a.revision-create').attr('disabled')){return;} +$('a.revision-create').attr('disabled','disabled');if(wp.autosave&&wp.autosave.server.postChanged()){var tmoRevisionSubmit=setTimeout(rvyCopyPost,5000);var intRevisionSubmit=setInterval(function(){if(!wp.autosave.server.postChanged()){clearTimeout(tmoRevisionSubmit);clearInterval(intRevisionSubmit);rvyCopyPost();}},250);wp.autosave.server.triggerSave();}else{rvyCopyPost();}});function rvyCopyPost(){var revisionaryCreateDone=function(){$('.revision-create').hide();$('.revision-created-wrapper').show();if(rvyObjEdit.completedURL){$('div.revision-created-wrapper a.revision-preview').attr('href',rvyObjEdit.completedURL);}else{$('div.revision-created-wrapper a.revision-preview').hide();} +$('div.revision-created-wrapper a.revision-edit').attr('href',rvyObjEdit.completedEditURL);$('a.revision-create').removeAttr('disabled');} +var revisionaryCreateError=function(data,txtStatus){$('div.rvy-creation-ui').html(rvyObjEdit.errorCaption);} +var data={'rvy_ajax_field':'create_revision','rvy_ajax_value':rvyObjEdit.postID,'rvy_date_selection':RvyTimeSelection,'nc':RvyGetRandomInt(99999999)};$.ajax({url:rvyObjEdit.ajaxurl,data:data,dataType:"html",success:revisionaryCreateDone,error:revisionaryCreateError});} +$(document).on('click','#normal-sortables input, #normal-sortables select',function(){$('a.revision-create').attr('disabled','disabled');$('a.revision-schedule').attr('disabled','disabled');});$(document).on('click','a.revision-schedule',function(){if($('a.revision-schedule').attr('disabled')){return;} +$('a.revision-schedule').attr('disabled','disabled');if(wp.autosave.server.postChanged()){wp.autosave.server.triggerSave();var approvalDelay=250;}else{var approvalDelay=1;} +var revisionaryScheduleDone=function(){$('.revision-schedule').hide();$('.revision-scheduled-wrapper').show();$('div.revision-scheduled-wrapper a.revision-preview').attr('href',rvyObjEdit.scheduledURL);$('div.revision-scheduled-wrapper a.revision-edit').attr('href',rvyObjEdit.scheduledEditURL);$('a.revision-schedule').removeAttr('disabled');} +var revisionaryScheduleError=function(data,txtStatus){$('div.rvy-creation-ui').html(rvyObjEdit.errorCaption);} +var tmoSubmit=setInterval(function(){if(!wp.autosave.server.postChanged()){var data={'rvy_ajax_field':'create_scheduled_revision','rvy_ajax_value':rvyObjEdit.postID,'rvy_date_selection':RvyTimeSelection,'nc':RvyGetRandomInt(99999999)};$.ajax({url:rvyObjEdit.ajaxurl,data:data,dataType:"html",success:revisionaryScheduleDone,error:revisionaryScheduleError});clearInterval(tmoSubmit);}},approvalDelay);});$(document).on('click','#post-body-content *, #content_ifr *, #wp-content-editor-container *, #tinymce *, #submitpost, span.revision-created',function(){RvyRefreshScheduleButton();});var $timestampdiv=$('#timestampdiv');$timestampdiv.find('.save-timestamp').on('click',function(event){RvyRefreshScheduleButton();});var RvySelectedFutureDate=false;var RvyTimeSelection='';var RvyRefreshScheduleButton=function(){var selectedDateHTML=$('#timestamp').html();if(!/\d/.test(selectedDateHTML)||!rvyIsPublished){RvyTimeSelection='';$('.rvy-creation-ui .revision-schedule').hide();$('.rvy-creation-ui .revision-scheduled-wrapper').hide();$('.rvy-creation-ui .revision-created-wrapper').hide();$('.rvy-creation-ui .revision-create').show();return;} +var dateStr=$('#mm').val()+'/'+$('#jj').val()+'/'+$('#aa').val()+' '+$('#hh').val()+':'+$('#mn').val()+':00';var selectedDate=new Date(dateStr);RvyTimeSelection=selectedDate.getTime();var tdiff=RvyTimeSelection-Date.now();RvyTimeSelection=RvyTimeSelection/1000;if((tdiff>1000)){RvySelectedFutureDate=true;$('.rvy-creation-ui').show();$('.rvy-creation-ui .revision-create').hide();$('.rvy-creation-ui .revision-created-wrapper').hide();$('.rvy-creation-ui .revision-scheduled-wrapper').hide();$('.rvy-creation-ui .revision-schedule').show();$('#publish').hide();}else{if(''==rvyObjEdit.actionCaption){$('.rvy-creation-ui').hide();} +$('.rvy-creation-ui .revision-schedule').hide();$('.rvy-creation-ui .revision-scheduled-wrapper').hide();$('.rvy-creation-ui .revision-created-wrapper').hide();$('.rvy-creation-ui .revision-create').show();if(tdiff<=0){if(RvySelectedFutureDate){RvyTimeSelection='';}} +$('#publish').val(rvyObjEdit.update);$('#publish').show();}} +$(document).on('click','a.save-timestamp, a.cancel-timestamp',function(){RvyRefreshScheduleButton();});}); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/rvy_revision-block-edit.dev.js b/wp-content/plugins/revisionary/admin/rvy_revision-block-edit.dev.js new file mode 100644 index 000000000..c960c567e --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_revision-block-edit.dev.js @@ -0,0 +1,412 @@ +/** +* Block Editor Modifications for Revisionary +* +* By Kevin Behrens +* +* Copyright 2021, PublishPress +*/ +jQuery(document).ready(function ($) { + function RvyRecaptionElement(btnSelector, btnCaption, btnIcon = '') { + if (rvyObjEdit.disableRecaption) { + return; + } + + if (document.querySelector(btnSelector)) { + document.querySelector(btnSelector).innerText = `${btnCaption}`; + + if (btnIcon) { + document.querySelector(btnSelector).innerHTML = `${btnCaption}`; + } + } + } + + // Update main publish ("Publish" / "Submit Pending") button width and span caption + function RvySetPublishButtonCaption(caption, waitForSaveDraftButton, forceRegen, timeout) { + if ('future' == rvyObjEdit.currentStatus) { + caption = rvyObjEdit.updateCaption; + } + + if (typeof waitForSaveDraftButton == 'undefined') { + waitForSaveDraftButton = false; + } + + if ( ( ! waitForSaveDraftButton || $('button.editor-post-switch-to-draft').filter(':visible').length || $('button.editor-post-save-draft').filter(':visible').length ) && $('button.editor-post-publish-button').length ) { // indicates save operation (or return from Pre-Publish) is done + RvyRecaptionElement('button.editor-post-publish-button', caption); + } + } + + // Force spans to be regenerated following modal settings window access + var RvyDetectPublishOptionsDivClosureInterval = ''; + var RvyDetectPublishOptionsClosure = ''; + var RvyDetectPublishOptionsDiv = function () { + if ($('div.components-modal__header').length) { + clearInterval(RvyDetectPublishOptionsDivInterval); + + if ($('span.pp-recaption-button').first()) { + rvyObjEdit.overrideColor = $('span.pp-recaption-button').first().css('color'); + } + + RvyDetectPublishOptionsClosure = function () { + if (!$('div.components-modal__header').length) { + clearInterval(RvyDetectPublishOptionsDivClosureInterval); + + $('span.pp-recaption-button').hide(); //.addClass('force-regen'); + RvyInitInterval = setInterval(RvyInitializeBlockEditorModifications, 50); + RvyDetectPublishOptionsDivInterval = setInterval(RvyDetectPublishOptionsDiv, 1000); + } + } + RvyDetectPublishOptionsDivClosureInterval = setInterval(RvyDetectPublishOptionsClosure, 200); + } + } + var RvyDetectPublishOptionsDivInterval = setInterval(RvyDetectPublishOptionsDiv, 1000); + + /************* RECAPTION PRE-PUBLISH AND PUBLISH BUTTONS ****************/ + if (typeof rvyObjEdit.publish == 'undefined') { + rvyObjEdit.publishCaptionCurrent = rvyObjEdit.updateCaption; + } else { + rvyObjEdit.publishCaptionCurrent = rvyObjEdit.publish; + } + + // Initialization operations to perform once React loads the relevant elements + var RvyInitializeBlockEditorModifications = function () { + if (($('button.editor-post-publish-button').length || $('button.editor-post-publish-panel__toggle').length) && ($('button.editor-post-switch-to-draft').length || $('button.editor-post-save-draft').length)) { + clearInterval(RvyInitInterval); + + if ($('button.editor-post-publish-panel__toggle').length) { + if (typeof rvyObjEdit.prePublish != 'undefined' && rvyObjEdit.prePublish) { + RvyRecaptionElement('button.editor-post-publish-panel__toggle', rvyObjEdit.prePublish); + } + + // Presence of pre-publish button means publish button is not loaded yet. Start looking for it once Pre-Publish button is clicked. + $(document).on('click', 'button.editor-post-publish-panel__toggle,span.pp-recaption-prepublish-button', function () { + RvySetPublishButtonCaption('', false, true); // nullstring: set caption to value queued in rvyObjEdit.publishCaptionCurrent + }); + } else { + if (typeof rvyObjEdit.publish == 'undefined') { + RvySetPublishButtonCaption(rvyObjEdit.updateCaption, false, true); + } else { + RvySetPublishButtonCaption(rvyObjEdit.publish, false, true); + } + } + + $('select.editor-post-author__select').parent().hide(); + $('button.editor-post-trash').parent().show(); + $('button.editor-post-switch-to-draft').hide(); + + $('div.components-notice-list').hide(); // autosave notice + } + } + var RvyInitInterval = setInterval(RvyInitializeBlockEditorModifications, 50); + + var RvyHideElements = function () { + var ediv = 'div.edit-post-sidebar '; + if ($(ediv + 'div.edit-post-post-visibility,' + ediv + 'div.editor-post-link,' + ediv + 'select.editor-post-author__select:visible,' + ediv + 'div.components-base-control__field input[type="checkbox"]:visible,' + ediv + 'button.editor-post-switch-to-draft,' + ediv + 'button.editor-post-trash').length) { + $(ediv + 'select.editor-post-author__select').parent().hide(); + $(ediv + 'button.editor-post-trash').parent().show(); + $(ediv + 'button.editor-post-switch-to-draft').hide(); + $(ediv + 'div.editor-post-link').parent().hide(); + $(ediv + 'div.components-notice-list').hide(); // autosave notice + + if (!rvyObjEdit.scheduledRevisionsEnabled) { + $(ediv + 'div.edit-post-post-schedule').hide(); + } + + $(ediv + '#publishpress-notifications').hide(); + $('#icl_div').closest('div.edit-post-meta-boxes-area').hide(); + } + if ('future' == rvyObjEdit.currentStatus) { + $('button.editor-post-publish-button').show(); + + } else { + if ($('button.editor-post-publish-button').length && ($('button.editor-post-save-draft:visible').length || $('button.editor-post-saved-stated:visible').length)) { + $('button.editor-post-publish-button').hide(); + } + } + if (($('button.editor-post-publish-button').length || $('button.editor-post-publish-panel__toggle').length) + && ($('button.editor-post-save-draft').filter(':visible').length || $('.is-saved').filter(':visible').length) + ) { + $('button.editor-post-publish-button').hide(); + $('button.editor-post-publish-panel__toggle').hide(); + } else { + if ($('button.editor-post-publish-button').length) { + $('button.editor-post-publish-button').show(); + } else { + $('button.editor-post-publish-panel__toggle').show(); + } + } + + ediv = null; + } + var RvyHideInterval = setInterval(RvyHideElements, 50); + + var RvySubmissionUI = function () { + $('button.edit-post-post-visibility__toggle, div.editor-post-url__panel-dropdown, div.components-checkbox-control').closest("div.editor-post-panel__row").hide(); + + if ($('div.edit-post-sidebar div.edit-post-post-status div.editor-post-panel__row:last').length) { + var refSelector = 'div.edit-post-sidebar div.edit-post-post-status div.editor-post-panel__row:last'; + } else { + if ($('div.edit-post-post-schedule').length) { + var refSelector = 'div.edit-post-post-schedule'; + } else { + var refSelector = 'div.edit-post-post-visibility'; + + if (!$(refSelector).length) { + refSelector = 'div.edit-post-post-status h2'; + } + } + } + + if (rvyObjEdit.ajaxurl && !$('div.edit-post-revision-status').length && $(refSelector).length) { + if ($('div.editor-post-panel__row-label').length) { + var labelOpen = '
    '; + var labelClose = '
    '; + var statusWrapperClass = 'editor-post-panel__row-control'; + } else { + var labelOpen = ''; + var labelClose = ''; + var statusWrapperClass = ''; + } + + var rvyUI = '
    ' + + labelOpen + rvyObjEdit.statusLabel + labelClose; + + if (statusWrapperClass) { + rvyUI += '
    '; + } + + rvyUI += '
    ' + + rvyObjEdit[rvyObjEdit.currentStatus + 'StatusCaption'] + + '
    '; + + if (statusWrapperClass) { + rvyUI += '
    '; + } + + rvyUI += '
    '; + + $(refSelector).before( + rvyUI + ); + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL']) { + var url = rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL']; + } else { + var url = 'javascript:void(0)'; + } + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'ActionCaption']) { + var approveButtonHTML = ''; + var mainDashicon = ''; + + if (rvyObjEdit.canPublish && ('pending' != rvyObjEdit.currentStatus) && ('future' != rvyObjEdit.currentStatus)) { + approveButtonHTML = '' + + ''; + + mainDashicon = 'dashicons-upload'; + } else { + if ('pending' == rvyObjEdit.currentStatus) { + mainDashicon = 'dashicons-yes'; + } else { + mainDashicon = 'dashicons-upload'; + } + } + + var rvyPreviewLink = ''; + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedLinkCaption']) { + rvyPreviewLink = '
    ' + + rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedLinkCaption'] + ''; + } + + $(refSelector).after('
    ' + + '' + + approveButtonHTML + + '' + + '' + + '' + + '
    '); + + $('div.rvy-submission-div').trigger('loaded-ui'); + } + + $('.edit-post-post-schedule__toggle').after(''); + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'DeletionURL']) { + $('button.editor-post-trash').wrap(''); + } + } + + refSelector = null; + url = null; + approveButtonHTML = null; + mainDashicon = null; + rvyPreviewLink = null; + + $('button.post-schedule-footnote').toggle(!/\d/.test($('button.edit-post-post-schedule__toggle').html())); + + $('button.editor-post-trash').parent().css('text-align', 'right'); + } + var RvyUIInterval = setInterval(RvySubmissionUI, 100); + setInterval(function () { + if (rvyObjEdit.deleteCaption && $('button.editor-post-trash').length && ($('button.editor-post-trash').html() != rvyObjEdit.deleteCaption)) { + $('button.editor-post-trash').html(rvyObjEdit.deleteCaption).closest('div').show(); + } + }, 100); + + var redirectCheckSaveDoneInterval = false; + + function rvyDoSubmission() { + rvySubmitCopy(); + } + + function rvyDoApproval() { + setTimeout( + function() { + var redirectCheckSaveDoneInterval = setInterval(function () { + if (!wp.data.select('core/editor').isSavingPost() || $('div.edit-post-header button.is-saved').length) { + clearInterval(redirectCheckSaveDoneInterval); + + if (rvyRedirectURL != '') { + setTimeout( + function() { + window.location.href = rvyRedirectURL; + }, + 5000 + ); + } + } + }, 100); + }, 500 + ); + } + + var rvyRedirectURL = ''; + + $(document).on('click', 'button.revision-approve', function () { + // If autosave approvals are ever enabled, we will need this + var isApproval = $(this).hasClass('rvy-direct-approve'); + var isSubmission = (rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL'] == "") && !isApproval; + + $('button.revision-approve').hide(); + + if (isApproval) { + $('div.revision-approving').show().css('display', 'block'); + $('div.revision-approving span.ppr-submission-spinner').css('visibility', 'visible'); + + if (wp.data.select('core/editor').isEditedPostDirty()) { + wp.data.dispatch('core/editor').savePost(); + } + rvyRedirectURL = $('div.rvy-creation-ui button.rvy-direct-approve').closest('a').attr('href'); + + if (rvyRedirectURL == '') { + rvyRedirectURL = $('div.rvy-creation-ui button.revision-approve').closest('a').attr('href'); + } + } else { + rvyRedirectURL = $('div.rvy-creation-ui a').attr('href'); + } + + if (isSubmission) { + $('div.revision-submitting').show(); + rvyDoSubmission(); + } else { + rvyDoApproval(); + } + + isApproval = null; + isSubmission = null; + + return false; + }); + + function RvyGetRandomInt(max) { + return Math.floor(Math.random() * max); + } + + function rvySubmitCopy() { + var revisionaryCreateDone = function () { + if (wp.data.select('core/editor').isEditedPostDirty()) { + wp.data.dispatch('core/editor').savePost(); + } + + $('.revision-approve').hide(); + $('div.revision-submitting').hide(); + $('.revision-created').show(); + + // @todo: abstract this for other workflows + rvyObjEdit.currentStatus = 'pending'; + $('.rvy-current-status').html(rvyObjEdit[rvyObjEdit.currentStatus + 'StatusCaption']); + $('a.revision-preview').attr('href', rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedURL']).show(); + $('a.revision-edit').attr('href', rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedEditURL']).show(); + } + + $.ajax({ + url: rvyObjEdit.ajaxurl, + data: {'rvy_ajax_field': rvyObjEdit[rvyObjEdit.currentStatus + 'AjaxField'], 'rvy_ajax_value': wp.data.select('core/editor').getCurrentPostId(), 'nc': RvyGetRandomInt(99999999)}, + dataType: "html", + success: revisionaryCreateDone, + error: function (data, txtStatus) { + $('div.rvy-creation-ui').html(rvyObjEdit[rvyObjEdit.currentStatus + 'ErrorCaption']); + } + }); + } + var RvyRecaptionSaveDraft = function () { + if ($('button.editor-post-save-draft:not(.rvy-recaption)').length) { + RvyRecaptionElement('button.editor-post-save-draft:not(.rvy-recaption)', rvyObjEdit.saveRevision); + + $('button.editor-post-save-draft:not(.rvy-recaption)').addClass('rvy-recaption').removeClass('is-tertiary').addClass('is-primary').addClass('ppr-purple-button'); + } + + if (rvyObjEdit.viewURL && ($('.editor-preview-dropdown__toggle').length || $('div.block-editor-post-preview__dropdown').length)) { + var viewPreviewLink = '' + + rvyObjEdit.viewTitle + + ''; + + if (rvyObjEdit.viewTitleExtra && !$('.rvy-revision-preview').length) { + if ($('.editor-preview-dropdown__toggle').length) { + $('.editor-preview-dropdown__toggle').after(''); + } else { + $('div.block-editor-post-preview__dropdown').after('
    '); + } + + $('button.rvy-revision-preview a.ppr-purple-button').html(rvyObjEdit.viewTitleExtra); + } + + if (!$('div.components-menu-group div a.ppr-purple-button').length) { + if ($('.editor-preview-dropdown__button-external svg').length) { + $('.editor-preview-dropdown__button-external:not(.ppr-purple-button)').closest('div.components-dropdown-menu__menu').after('
    ' + viewPreviewLink + '
    '); + } + } + + if (rvyObjEdit.viewCaption) { + RvyRecaptionElement('.editor-preview-dropdown__toggle', rvyObjEdit.viewCaption); + $('.editor-preview-dropdown__toggle:not(.ppr-purple-button)').removeClass('is-tertiary').addClass('is-secondary').addClass('ppr-purple-button'); + } + } + + if (rvyObjEdit.viewTitle) { + $('div.edit-post-header__settings a.rvy-post-preview').attr('title', rvyObjEdit.viewTitle); + } + + if (rvyObjEdit.revisionEdits && $('div.edit-post-sidebar a.editor-post-last-revision__title:visible').length && !$('div.edit-post-sidebar a.editor-post-last-revision__title.rvy-recaption').length) { + $('div.edit-post-sidebar a.editor-post-last-revision__title').html(rvyObjEdit.revisionEdits); + $('div.edit-post-sidebar a.editor-post-last-revision__title').addClass('rvy-recaption'); + } + + newPreviewItem = null; + } + var RvyRecaptionSaveDraftInterval = setInterval(RvyRecaptionSaveDraft, 100); +}); diff --git a/wp-content/plugins/revisionary/admin/rvy_revision-block-edit.js b/wp-content/plugins/revisionary/admin/rvy_revision-block-edit.js new file mode 100644 index 000000000..fb0047bb2 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_revision-block-edit.js @@ -0,0 +1,72 @@ +jQuery(document).ready(function($){function RvyRecaptionElement(btnSelector,btnCaption,btnIcon=''){if(rvyObjEdit.disableRecaption){return;} +if(document.querySelector(btnSelector)){document.querySelector(btnSelector).innerText=`${btnCaption}`;if(btnIcon){document.querySelector(btnSelector).innerHTML=`${btnCaption}`;}}} +function RvySetPublishButtonCaption(caption,waitForSaveDraftButton,forceRegen,timeout){if('future'==rvyObjEdit.currentStatus){caption=rvyObjEdit.updateCaption;} +if(typeof waitForSaveDraftButton=='undefined'){waitForSaveDraftButton=false;} +if((!waitForSaveDraftButton||$('button.editor-post-switch-to-draft').filter(':visible').length||$('button.editor-post-save-draft').filter(':visible').length)&&$('button.editor-post-publish-button').length){RvyRecaptionElement('button.editor-post-publish-button',caption);}} +var RvyDetectPublishOptionsDivClosureInterval='';var RvyDetectPublishOptionsClosure='';var RvyDetectPublishOptionsDiv=function(){if($('div.components-modal__header').length){clearInterval(RvyDetectPublishOptionsDivInterval);if($('span.pp-recaption-button').first()){rvyObjEdit.overrideColor=$('span.pp-recaption-button').first().css('color');} +RvyDetectPublishOptionsClosure=function(){if(!$('div.components-modal__header').length){clearInterval(RvyDetectPublishOptionsDivClosureInterval);$('span.pp-recaption-button').hide();RvyInitInterval=setInterval(RvyInitializeBlockEditorModifications,50);RvyDetectPublishOptionsDivInterval=setInterval(RvyDetectPublishOptionsDiv,1000);}} +RvyDetectPublishOptionsDivClosureInterval=setInterval(RvyDetectPublishOptionsClosure,200);}} +var RvyDetectPublishOptionsDivInterval=setInterval(RvyDetectPublishOptionsDiv,1000);if(typeof rvyObjEdit.publish=='undefined'){rvyObjEdit.publishCaptionCurrent=rvyObjEdit.updateCaption;}else{rvyObjEdit.publishCaptionCurrent=rvyObjEdit.publish;} +var RvyInitializeBlockEditorModifications=function(){if(($('button.editor-post-publish-button').length||$('button.editor-post-publish-panel__toggle').length)&&($('button.editor-post-switch-to-draft').length||$('button.editor-post-save-draft').length)){clearInterval(RvyInitInterval);if($('button.editor-post-publish-panel__toggle').length){if(typeof rvyObjEdit.prePublish!='undefined'&&rvyObjEdit.prePublish){RvyRecaptionElement('button.editor-post-publish-panel__toggle',rvyObjEdit.prePublish);} +$(document).on('click','button.editor-post-publish-panel__toggle,span.pp-recaption-prepublish-button',function(){RvySetPublishButtonCaption('',false,true);});}else{if(typeof rvyObjEdit.publish=='undefined'){RvySetPublishButtonCaption(rvyObjEdit.updateCaption,false,true);}else{RvySetPublishButtonCaption(rvyObjEdit.publish,false,true);}} +$('select.editor-post-author__select').parent().hide();$('button.editor-post-trash').parent().show();$('button.editor-post-switch-to-draft').hide();$('div.components-notice-list').hide();}} +var RvyInitInterval=setInterval(RvyInitializeBlockEditorModifications,50);var RvyHideElements=function(){var ediv='div.edit-post-sidebar ';if($(ediv+'div.edit-post-post-visibility,'+ediv+'div.editor-post-link,'+ediv+'select.editor-post-author__select:visible,'+ediv+'div.components-base-control__field input[type="checkbox"]:visible,'+ediv+'button.editor-post-switch-to-draft,'+ediv+'button.editor-post-trash').length){$(ediv+'select.editor-post-author__select').parent().hide();$(ediv+'button.editor-post-trash').parent().show();$(ediv+'button.editor-post-switch-to-draft').hide();$(ediv+'div.editor-post-link').parent().hide();$(ediv+'div.components-notice-list').hide();if(!rvyObjEdit.scheduledRevisionsEnabled){$(ediv+'div.edit-post-post-schedule').hide();} +$(ediv+'#publishpress-notifications').hide();$('#icl_div').closest('div.edit-post-meta-boxes-area').hide();} +if('future'==rvyObjEdit.currentStatus){$('button.editor-post-publish-button').show();}else{if($('button.editor-post-publish-button').length&&($('button.editor-post-save-draft:visible').length||$('button.editor-post-saved-stated:visible').length)){$('button.editor-post-publish-button').hide();}} +if(($('button.editor-post-publish-button').length||$('button.editor-post-publish-panel__toggle').length)&&($('button.editor-post-save-draft').filter(':visible').length||$('.is-saved').filter(':visible').length)){$('button.editor-post-publish-button').hide();$('button.editor-post-publish-panel__toggle').hide();}else{if($('button.editor-post-publish-button').length){$('button.editor-post-publish-button').show();}else{$('button.editor-post-publish-panel__toggle').show();}} +ediv=null;} +var RvyHideInterval=setInterval(RvyHideElements,50);var RvySubmissionUI=function(){$('button.edit-post-post-visibility__toggle, div.editor-post-url__panel-dropdown, div.components-checkbox-control').closest("div.editor-post-panel__row").hide();if($('div.edit-post-sidebar div.edit-post-post-status div.editor-post-panel__row:last').length){var refSelector='div.edit-post-sidebar div.edit-post-post-status div.editor-post-panel__row:last';}else{if($('div.edit-post-post-schedule').length){var refSelector='div.edit-post-post-schedule';}else{var refSelector='div.edit-post-post-visibility';if(!$(refSelector).length){refSelector='div.edit-post-post-status h2';}}} +if(rvyObjEdit.ajaxurl&&!$('div.edit-post-revision-status').length&&$(refSelector).length){if($('div.editor-post-panel__row-label').length){var labelOpen='
    ';var labelClose='
    ';var statusWrapperClass='editor-post-panel__row-control';}else{var labelOpen='';var labelClose='';var statusWrapperClass='';} +var rvyUI='
    ' ++labelOpen+rvyObjEdit.statusLabel+labelClose;if(statusWrapperClass){rvyUI+='
    ';} +rvyUI+='
    ' ++rvyObjEdit[rvyObjEdit.currentStatus+'StatusCaption'] ++'
    ';if(statusWrapperClass){rvyUI+='
    ';} +rvyUI+='
    ';$(refSelector).before(rvyUI);if(rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL']){var url=rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL'];}else{var url='javascript:void(0)';} +if(rvyObjEdit[rvyObjEdit.currentStatus+'ActionCaption']){var approveButtonHTML='';var mainDashicon='';if(rvyObjEdit.canPublish&&('pending'!=rvyObjEdit.currentStatus)&&('future'!=rvyObjEdit.currentStatus)){approveButtonHTML='' ++'';mainDashicon='dashicons-upload';}else{if('pending'==rvyObjEdit.currentStatus){mainDashicon='dashicons-yes';}else{mainDashicon='dashicons-upload';}} +var rvyPreviewLink='';if(rvyObjEdit[rvyObjEdit.currentStatus+'CompletedLinkCaption']){rvyPreviewLink='
    ' ++rvyObjEdit[rvyObjEdit.currentStatus+'CompletedLinkCaption']+'';} +$(refSelector).after('
    ' ++'' ++approveButtonHTML ++'' ++'' ++'' ++'
    ');$('div.rvy-submission-div').trigger('loaded-ui');} +$('.edit-post-post-schedule__toggle').after('');if(rvyObjEdit[rvyObjEdit.currentStatus+'DeletionURL']){$('button.editor-post-trash').wrap('');}} +refSelector=null;url=null;approveButtonHTML=null;mainDashicon=null;rvyPreviewLink=null;$('button.post-schedule-footnote').toggle(!/\d/.test($('button.edit-post-post-schedule__toggle').html()));$('button.editor-post-trash').parent().css('text-align','right');} +var RvyUIInterval=setInterval(RvySubmissionUI,100);setInterval(function(){if(rvyObjEdit.deleteCaption&&$('button.editor-post-trash').length&&($('button.editor-post-trash').html()!=rvyObjEdit.deleteCaption)){$('button.editor-post-trash').html(rvyObjEdit.deleteCaption).closest('div').show();}},100);var redirectCheckSaveDoneInterval=false;function rvyDoSubmission(){rvySubmitCopy();} +function rvyDoApproval(){setTimeout(function(){var redirectCheckSaveDoneInterval=setInterval(function(){if(!wp.data.select('core/editor').isSavingPost()||$('div.edit-post-header button.is-saved').length){clearInterval(redirectCheckSaveDoneInterval);if(rvyRedirectURL!=''){setTimeout(function(){window.location.href=rvyRedirectURL;},5000);}}},100);},500);} +var rvyRedirectURL='';$(document).on('click','button.revision-approve',function(){var isApproval=$(this).hasClass('rvy-direct-approve');var isSubmission=(rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL']=="")&&!isApproval;$('button.revision-approve').hide();if(isApproval){$('div.revision-approving').show().css('display','block');$('div.revision-approving span.ppr-submission-spinner').css('visibility','visible');if(wp.data.select('core/editor').isEditedPostDirty()){wp.data.dispatch('core/editor').savePost();} +rvyRedirectURL=$('div.rvy-creation-ui button.rvy-direct-approve').closest('a').attr('href');if(rvyRedirectURL==''){rvyRedirectURL=$('div.rvy-creation-ui button.revision-approve').closest('a').attr('href');}}else{rvyRedirectURL=$('div.rvy-creation-ui a').attr('href');} +if(isSubmission){$('div.revision-submitting').show();rvyDoSubmission();}else{rvyDoApproval();} +isApproval=null;isSubmission=null;return false;});function RvyGetRandomInt(max){return Math.floor(Math.random()*max);} +function rvySubmitCopy(){var revisionaryCreateDone=function(){if(wp.data.select('core/editor').isEditedPostDirty()){wp.data.dispatch('core/editor').savePost();} +$('.revision-approve').hide();$('div.revision-submitting').hide();$('.revision-created').show();rvyObjEdit.currentStatus='pending';$('.rvy-current-status').html(rvyObjEdit[rvyObjEdit.currentStatus+'StatusCaption']);$('a.revision-preview').attr('href',rvyObjEdit[rvyObjEdit.currentStatus+'CompletedURL']).show();$('a.revision-edit').attr('href',rvyObjEdit[rvyObjEdit.currentStatus+'CompletedEditURL']).show();} +$.ajax({url:rvyObjEdit.ajaxurl,data:{'rvy_ajax_field':rvyObjEdit[rvyObjEdit.currentStatus+'AjaxField'],'rvy_ajax_value':wp.data.select('core/editor').getCurrentPostId(),'nc':RvyGetRandomInt(99999999)},dataType:"html",success:revisionaryCreateDone,error:function(data,txtStatus){$('div.rvy-creation-ui').html(rvyObjEdit[rvyObjEdit.currentStatus+'ErrorCaption']);}});} +var RvyRecaptionSaveDraft=function(){if($('button.editor-post-save-draft:not(.rvy-recaption)').length){RvyRecaptionElement('button.editor-post-save-draft:not(.rvy-recaption)',rvyObjEdit.saveRevision);$('button.editor-post-save-draft:not(.rvy-recaption)').addClass('rvy-recaption').removeClass('is-tertiary').addClass('is-primary').addClass('ppr-purple-button');} +if(rvyObjEdit.viewURL&&($('.editor-preview-dropdown__toggle').length||$('div.block-editor-post-preview__dropdown').length)){var viewPreviewLink='' ++rvyObjEdit.viewTitle ++'';if(rvyObjEdit.viewTitleExtra&&!$('.rvy-revision-preview').length){if($('.editor-preview-dropdown__toggle').length){$('.editor-preview-dropdown__toggle').after('');}else{$('div.block-editor-post-preview__dropdown').after('
    ');} +$('button.rvy-revision-preview a.ppr-purple-button').html(rvyObjEdit.viewTitleExtra);} +if(!$('div.components-menu-group div a.ppr-purple-button').length){if($('.editor-preview-dropdown__button-external svg').length){$('.editor-preview-dropdown__button-external:not(.ppr-purple-button)').closest('div.components-dropdown-menu__menu').after('
    '+viewPreviewLink+'
    ');}} +if(rvyObjEdit.viewCaption){RvyRecaptionElement('.editor-preview-dropdown__toggle',rvyObjEdit.viewCaption);$('.editor-preview-dropdown__toggle:not(.ppr-purple-button)').removeClass('is-tertiary').addClass('is-secondary').addClass('ppr-purple-button');}} +if(rvyObjEdit.viewTitle){$('div.edit-post-header__settings a.rvy-post-preview').attr('title',rvyObjEdit.viewTitle);} +if(rvyObjEdit.revisionEdits&&$('div.edit-post-sidebar a.editor-post-last-revision__title:visible').length&&!$('div.edit-post-sidebar a.editor-post-last-revision__title.rvy-recaption').length){$('div.edit-post-sidebar a.editor-post-last-revision__title').html(rvyObjEdit.revisionEdits);$('div.edit-post-sidebar a.editor-post-last-revision__title').addClass('rvy-recaption');} +newPreviewItem=null;} +var RvyRecaptionSaveDraftInterval=setInterval(RvyRecaptionSaveDraft,100);}); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.dev.js b/wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.dev.js new file mode 100644 index 000000000..a0a9b1845 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.dev.js @@ -0,0 +1,189 @@ +/** +* Classic Editor Modifications for Revisionary +* +* By Kevin Behrens +* +* Copyright 2021, PublishPress +*/ +jQuery(document).ready( function($) { + var RvySubmissionUI = function() { + var refSelector = '#rvy_compare_button'; + + if (!$(refSelector).length) { + var refSelector = '#submitdiv div.misc-pub-section:last'; + } + + if (!$(refSelector).length) { + var refSelector = '#submitdiv div.curtime'; + } + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'StatusCaption'] && (rvyObjEdit[rvyObjEdit.currentStatus + 'StatusCaption'] != $('#post-status-display').html())) { + $('#post-status-display').html(rvyObjEdit[rvyObjEdit.currentStatus + 'StatusCaption']); + } + + if (rvyObjEdit.ajaxurl && !$('div.rvy-creation-ui').length && $(refSelector).length) { + if (rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL']) { + var url = rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL']; + } else { + var url = 'javascript:void(0)'; + } + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'ActionCaption']) { + var approveButtonHTML = ''; + + if (rvyObjEdit.canPublish && ('pending' != rvyObjEdit.currentStatus) && ('future' != rvyObjEdit.currentStatus)) { + approveButtonHTML = ' ' + + rvyObjEdit['approveCaption'] + '' + } + + var rvyPreviewLink = ''; + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedLinkCaption']) { + rvyPreviewLink = '  ' + + rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedLinkCaption'] + ''; + } + + $(refSelector).after( + '
    ' + + + '' + + rvyObjEdit[rvyObjEdit.currentStatus + 'ActionCaption'] + '' + + + approveButtonHTML + + + '' + + + '
    ' + ); + } + + $('.edit-post-post-schedule__toggle').after(''); + + if (rvyObjEdit[rvyObjEdit.currentStatus + 'DeletionURL']) { + $('a.submitdelete').attr('href', rvyObjEdit[rvyObjEdit.currentStatus + 'DeletionURL']); + } + + $('#publish').hide(); + $('#save-post').val(rvyObjEdit.updateCaption); + + if (rvyObjEdit.deleteCaption) { + $('#submitdiv #submitpost #delete-action a.submitdelete').html(rvyObjEdit.deleteCaption).show(); + } + } + } + var RvyUIInterval = setInterval(RvySubmissionUI, 100); + + $('a.save-timestamp').click(function() { + $('#save-post').val(rvyObjEdit.updateCaption); + $('a.revision-approve, a.rvy-direct-approve').attr('disabled', 'disabled'); + }); + + $(document).on('click', 'a.save-timestamp, a.cancel-timestamp', function() { + wp.autosave.server.triggerSave(); + }); + + function RvyGetRandomInt(max) { + return Math.floor(Math.random() * max); + } + + $(document).on('click', 'div.postbox-container', function() { + $('a.revision-approve').attr('disabled', 'disabled'); + }); + + $(document).on('click', 'a.revision-approve', function() { + if ($('a.revision-approve').attr('disabled')) { + return false; + } + + $('a.revision-approve').attr('disabled', 'disabled'); + + if (wp.autosave.server.postChanged()) { + wp.autosave.server.triggerSave(); + var approvalDelay = 250; + } else { + var approvalDelay = 1; + } + + if (!rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL']) { + var revisionaryCreateDone = function () { + $('a.revision-approve').hide(); + $('.revision-created-wrapper, .revision-created').show(); + + // @todo: abstract this for other workflows + rvyObjEdit.currentStatus = 'pending'; + + $('#post-status-display').html(rvyObjEdit[rvyObjEdit.currentStatus + 'StatusCaption']); + $('a.revision-preview').attr('href', rvyObjEdit[rvyObjEdit.currentStatus + 'CompletedURL']).show(); + } + + var revisionaryCreateError = function (data, txtStatus) { + $('div.rvy-creation-ui').html(rvyObjEdit[rvyObjEdit.currentStatus + 'ErrorCaption']); + } + + var tmoSubmit = setInterval(function() { + if (!wp.autosave.server.postChanged()) { + var data = {'rvy_ajax_field': rvyObjEdit[rvyObjEdit.currentStatus + 'AjaxField'], 'rvy_ajax_value': rvyObjEdit.postID, 'nc': RvyGetRandomInt(99999999)}; + + $.ajax({ + url: rvyObjEdit.ajaxurl, + data: data, + dataType: "html", + success: revisionaryCreateDone, + error: revisionaryCreateError + }); + + clearInterval(tmoSubmit); + } + }, approvalDelay); + } else { + var tmoApproval = setInterval(function() { + if (!wp.autosave.server.postChanged()) { + window.location.href = rvyObjEdit[rvyObjEdit.currentStatus + 'ActionURL']; + + clearInterval(tmoApproval); + } + }, approvalDelay); + + return false; + } + }); + + $(document).on('click', 'a.rvy-direct-approve', function() { + if ($('a.rvy-direct-approve').attr('disabled')) { + return false; + } + + clearInterval(RvyUIInterval); + + $('a.rvy-direct-approve').attr('disabled', 'disabled'); + + if (wp.autosave.server.postChanged()) { + wp.autosave.server.triggerSave(); + var approvalDelay = 250; + } else { + var approvalDelay = 1; + } + + var tmoDirectApproval = setInterval(function() { + if (!wp.autosave.server.postChanged()) { + window.location.href = rvyObjEdit['pendingActionURL']; + + clearInterval(tmoDirectApproval); + } + }, approvalDelay); + + return false; + }); + + $(document).on('click', '#post-body-content *, #content_ifr *, #wp-content-editor-container *, #tinymce *, #submitpost, span.revision-created', function() { + $('.revision-created-wrapper, .revision-created').hide(); + + if (!$('a.rvy-direct-approve').length) { + $('a.revision-approve').html(rvyObjEdit[rvyObjEdit.currentStatus + 'ActionCaption']).show().removeAttr('disabled'); + } + }); +}); diff --git a/wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.js b/wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.js new file mode 100644 index 000000000..60082e392 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/rvy_revision-classic-edit.js @@ -0,0 +1,28 @@ +jQuery(document).ready(function($){var RvySubmissionUI=function(){var refSelector='#rvy_compare_button';if(!$(refSelector).length){var refSelector='#submitdiv div.misc-pub-section:last';} +if(!$(refSelector).length){var refSelector='#submitdiv div.curtime';} +if(rvyObjEdit[rvyObjEdit.currentStatus+'StatusCaption']&&(rvyObjEdit[rvyObjEdit.currentStatus+'StatusCaption']!=$('#post-status-display').html())){$('#post-status-display').html(rvyObjEdit[rvyObjEdit.currentStatus+'StatusCaption']);} +if(rvyObjEdit.ajaxurl&&!$('div.rvy-creation-ui').length&&$(refSelector).length){if(rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL']){var url=rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL'];}else{var url='javascript:void(0)';} +if(rvyObjEdit[rvyObjEdit.currentStatus+'ActionCaption']){var approveButtonHTML='';if(rvyObjEdit.canPublish&&('pending'!=rvyObjEdit.currentStatus)&&('future'!=rvyObjEdit.currentStatus)){approveButtonHTML=' ' ++rvyObjEdit['approveCaption']+''} +var rvyPreviewLink='';if(rvyObjEdit[rvyObjEdit.currentStatus+'CompletedLinkCaption']){rvyPreviewLink='  ' ++rvyObjEdit[rvyObjEdit.currentStatus+'CompletedLinkCaption']+'';} +$(refSelector).after('
    ' ++'' ++rvyObjEdit[rvyObjEdit.currentStatus+'ActionCaption']+'' ++approveButtonHTML ++'' ++'
    ');} +$('.edit-post-post-schedule__toggle').after('');if(rvyObjEdit[rvyObjEdit.currentStatus+'DeletionURL']){$('a.submitdelete').attr('href',rvyObjEdit[rvyObjEdit.currentStatus+'DeletionURL']);} +$('#publish').hide();$('#save-post').val(rvyObjEdit.updateCaption);if(rvyObjEdit.deleteCaption){$('#submitdiv #submitpost #delete-action a.submitdelete').html(rvyObjEdit.deleteCaption).show();}}} +var RvyUIInterval=setInterval(RvySubmissionUI,100);$('a.save-timestamp').click(function(){$('#save-post').val(rvyObjEdit.updateCaption);$('a.revision-approve, a.rvy-direct-approve').attr('disabled','disabled');});$(document).on('click','a.save-timestamp, a.cancel-timestamp',function(){wp.autosave.server.triggerSave();});function RvyGetRandomInt(max){return Math.floor(Math.random()*max);} +$(document).on('click','div.postbox-container',function(){$('a.revision-approve').attr('disabled','disabled');});$(document).on('click','a.revision-approve',function(){if($('a.revision-approve').attr('disabled')){return false;} +$('a.revision-approve').attr('disabled','disabled');if(wp.autosave.server.postChanged()){wp.autosave.server.triggerSave();var approvalDelay=250;}else{var approvalDelay=1;} +if(!rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL']){var revisionaryCreateDone=function(){$('a.revision-approve').hide();$('.revision-created-wrapper, .revision-created').show();rvyObjEdit.currentStatus='pending';$('#post-status-display').html(rvyObjEdit[rvyObjEdit.currentStatus+'StatusCaption']);$('a.revision-preview').attr('href',rvyObjEdit[rvyObjEdit.currentStatus+'CompletedURL']).show();} +var revisionaryCreateError=function(data,txtStatus){$('div.rvy-creation-ui').html(rvyObjEdit[rvyObjEdit.currentStatus+'ErrorCaption']);} +var tmoSubmit=setInterval(function(){if(!wp.autosave.server.postChanged()){var data={'rvy_ajax_field':rvyObjEdit[rvyObjEdit.currentStatus+'AjaxField'],'rvy_ajax_value':rvyObjEdit.postID,'nc':RvyGetRandomInt(99999999)};$.ajax({url:rvyObjEdit.ajaxurl,data:data,dataType:"html",success:revisionaryCreateDone,error:revisionaryCreateError});clearInterval(tmoSubmit);}},approvalDelay);}else{var tmoApproval=setInterval(function(){if(!wp.autosave.server.postChanged()){window.location.href=rvyObjEdit[rvyObjEdit.currentStatus+'ActionURL'];clearInterval(tmoApproval);}},approvalDelay);return false;}});$(document).on('click','a.rvy-direct-approve',function(){if($('a.rvy-direct-approve').attr('disabled')){return false;} +clearInterval(RvyUIInterval);$('a.rvy-direct-approve').attr('disabled','disabled');if(wp.autosave.server.postChanged()){wp.autosave.server.triggerSave();var approvalDelay=250;}else{var approvalDelay=1;} +var tmoDirectApproval=setInterval(function(){if(!wp.autosave.server.postChanged()){window.location.href=rvyObjEdit['pendingActionURL'];clearInterval(tmoDirectApproval);}},approvalDelay);return false;});$(document).on('click','#post-body-content *, #content_ifr *, #wp-content-editor-container *, #tinymce *, #submitpost, span.revision-created',function(){$('.revision-created-wrapper, .revision-created').hide();if(!$('a.rvy-direct-approve').length){$('a.revision-approve').html(rvyObjEdit[rvyObjEdit.currentStatus+'ActionCaption']).show().removeAttr('disabled');}});}); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/admin/settings.js b/wp-content/plugins/revisionary/admin/settings.js new file mode 100644 index 000000000..17b203602 --- /dev/null +++ b/wp-content/plugins/revisionary/admin/settings.js @@ -0,0 +1,15 @@ +jQuery(document).ready(function ($) { + + // Tabs + var $tabsWrapper = $('#publishpress-revisions-settings-tabs'); + $tabsWrapper.find('li').click(function (e) { + e.preventDefault(); + $tabsWrapper.children('li').filter('.nav-tab-active').removeClass('nav-tab-active'); + $(this).addClass('nav-tab-active'); + + var panel = $(this).find('a').first().attr('href'); + + $('table[id^="ppr-"]').hide(); + $(panel).show(); + }); +}); diff --git a/wp-content/plugins/revisionary/classes/PublishPress/Revisionary.php b/wp-content/plugins/revisionary/classes/PublishPress/Revisionary.php new file mode 100644 index 000000000..6e0ed0578 --- /dev/null +++ b/wp-content/plugins/revisionary/classes/PublishPress/Revisionary.php @@ -0,0 +1,96 @@ +load(); + } + + return self::$instance; + } + + private function __construct() + { + + } + + private function load($args = []) + { + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + add_action('admin_init', [$this, 'load_updater']); + } + } + + public function load_updater() { + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + require_once(REVISIONARY_PRO_ABSPATH . '/includes-pro/library/Factory.php'); + $container = \PublishPress\Revisions\Factory::get_container(); + + return $container['edd_container']['update_manager']; + } + } + + public function keyStatus($refresh = false) + { + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + require_once(REVISIONARY_PRO_ABSPATH . '/includes-pro/pro-key.php'); + return _revisionary_key_status($refresh); + } + } + + public function keyActive($refresh = false) + { + return in_array($this->keyStatus($refresh), [true, 'valid', 'expired'], true); + } + + public function getOption($option_basename) { + return ('edd_key' == $option_basename) ? get_site_option('rvy_edd_key') : rvy_get_option($option_basename); + } + + public function updateOption($option_basename, $option_val, $args = []) + { + if ('edd_key' == $option_basename) { + return update_site_option('rvy_edd_key', $option_val); + } else { + $args = (array) $args; + $sitewide = (isset($args['sitewide'])) ? $args['sitewide'] : -1; + return rvy_update_option($option_basename, $option_val, $sitewide); + } + } + + public function deleteOption($option_basename, $args = []) { + if ('edd_key' == $option_basename) { + return delete_site_option('rvy_edd_key'); + } else { + $args = (array) $args; + $sitewide = (isset($args['sitewide'])) ? $args['sitewide'] : -1; + return rvy_delete_option($option_basename, $sitewide); + } + } + + public function getUserRevision($post_id, $args = []) { + global $wpdb, $current_user; + + $args = (array) $args; + $user_id = (!empty($args['user_id'])) ? $args['user_id'] : $current_user->ID; + + if (empty($args['force_query']) && !rvy_get_post_meta($post_id, '_rvy_has_revisions')) { + return false; + } + + $revision_id = $wpdb->get_var( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE comment_count = %d AND post_author = %d AND post_status IN ('pending-revision', 'future-revision') ORDER BY ID DESC LIMIT 1", + $post_id, + $user_id + ) + ); + + return $revision_id; + } +} diff --git a/wp-content/plugins/revisionary/classes/PublishPress/Revisions/PluginCompat.php b/wp-content/plugins/revisionary/classes/PublishPress/Revisions/PluginCompat.php new file mode 100644 index 000000000..0f369ad58 --- /dev/null +++ b/wp-content/plugins/revisionary/classes/PublishPress/Revisions/PluginCompat.php @@ -0,0 +1,178 @@ +doing_rest) { + + function enable_custom_permalinks_workaround($retval) { + add_filter('query', [$this, 'flt_custom_permalinks_query']); + return $retval; + } + + function disable_custom_permalinks_workaround($retval) { + remove_filter('query', [$this, 'flt_custom_permalinks_query']); + return $retval; + } + + add_filter('custom_permalinks_request_ignore', function($retval) { + add_filter('query', [$this, 'flt_custom_permalinks_query']); + return $retval; + }); + + add_filter('cp_remove_like_query', function($retval) { + remove_filter('query', [$this, 'flt_custom_permalinks_query']); + return $retval; + }); + } + + add_filter('authors_default_author', [$this, 'fltAuthorsDefaultAuthor'], 10, 2); + } + + function fltAuthorsDefaultAuthor($default_author, $post) { + if (rvy_in_revision_workflow($post)) { + return false; + } + + return $default_author; + } + + function fltODBCworkaround($data, $postarr) { + // ODBC does not support UPDATE of ID + if (function_exists('get_projectnami_version')) { + unset($data['ID']); + } + + return $data; + } + + function fltPressPermitExceptionClause($clause, $required_operation, $post_type, $args) { + global $revisionary; + + if (empty($revisionary->enabled_post_types[$post_type]) && $revisionary->config_loaded) { + return $clause; + } + + if (('edit' == $required_operation) && in_array($post_type, rvy_get_manageable_types()) + ) { + foreach(['mod', 'src_table', 'logic', 'ids'] as $var) { + if (!empty($args[$var])) { + $$var = $args[$var]; + } else { + return $clause; + } + } + + $revision_base_status_csv = implode("','", array_map('sanitize_key', rvy_revision_base_statuses())); + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + if ('include' == $mod) { + $clause = "(($clause) OR ($src_table.post_status IN ('$revision_base_status_csv') AND $src_table.post_mime_type IN ('$revision_status_csv') AND $src_table.comment_count IN ('" . implode("','", array_map('intval', $ids)) . "')))"; + } elseif ('exclude' == $mod) { + $clause = "(($clause) AND ($src_table.post_mime_type NOT IN ('$revision_status_csv') OR $src_table.comment_count NOT IN ('" . implode("','", array_map('intval', $ids)) . "')))"; + } + } + + return $clause; + } + + // Restore comment_count field (main post ID) on PublishPress editorial comment insertion + function actInsertEditorialCommentPreserveCommentCount($comment) { + global $wpdb; + + if ($comment && !empty($comment->comment_post_ID)) { + if ($_post = get_post($comment->comment_post_ID)) { + if (rvy_in_revision_workflow($_post)) { + $wpdb->update( + $wpdb->posts, + ['comment_count' => rvy_post_id($comment->comment_post_ID)], + ['ID' => $comment->comment_post_ID] + ); + } + } + } + } + + /** + * Filters the list of PublishPress Notification receivers, but triggers only when "Authors of the Content" is selected in Notification settings. + * + * @param array $receivers + * @param WP_Post $workflow + * @param array $args + */ + function flt_publishpress_notification_authors($receivers, $workflow, $args) { + global $current_user; + + if (empty($args['post']) || !rvy_in_revision_workflow($args['post'])) { + return $receivers; + } + + $revision = $args['post']; + $recipient_ids = []; + + if ($revision->post_author != $current_user->ID) { + $recipient_ids []= $revision->post_author; + } + + $post_author = get_post_field('post_author', rvy_post_id($revision->ID)); + + if (!in_array($post_author, [$current_user->ID, $revision->post_author])) { + $recipient_ids []= $post_author; + } + + foreach($recipient_ids as $user_id) { + $channel = get_user_meta($user_id, 'psppno_workflow_channel_' . $workflow->ID, true); + + // If no channel is set yet, use the default one + if (empty($channel)) { + if (!isset($notification_options)) { + // Avoid reference to PublishPress module class, object schema + $notification_options = get_option('publishpress_improved_notifications_options'); + } + + if (!empty($notification_options) && !empty($notification_options->default_channels)) { + if (!empty($notification_options->default_channels[$workflow->ID])) { + $channel = $notification_options->default_channels[$workflow->ID]; + } + } + } + + // @todo: config retrieval method for Slack, other channels + if (!empty($channel) && ('email' == $channel)) { + if ($user = new WP_User($user_id)) { + $receivers []= "{$channel}:{$user->user_email}"; + } + } + } + + return $receivers; + } + + function flt_custom_permalinks_query($query) { + global $wpdb; + + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + if (strpos($query, " WHERE pm.meta_key = 'custom_permalink' ") && strpos($query, "$wpdb->posts AS p")) { + $query = str_replace( + " ORDER BY FIELD(", + " AND p.post_mime_type NOT IN ('$revision_status_csv') ORDER BY FIELD(", + $query + ); + } + + return $query; + } +} diff --git a/wp-content/plugins/revisionary/classes/PublishPress/Revisions/PostPreview.php b/wp-content/plugins/revisionary/classes/PublishPress/Revisions/PostPreview.php new file mode 100644 index 000000000..560212fd8 --- /dev/null +++ b/wp-content/plugins/revisionary/classes/PublishPress/Revisions/PostPreview.php @@ -0,0 +1,25 @@ +ID))) { + $display_name = get_the_author_meta('display_name', $published_author); + } + + add_filter('the_author', [$this, 'fltAuthor'], 15); + } + } + + return $display_name; + } +} diff --git a/wp-content/plugins/revisionary/common/css/pressshack-admin.css b/wp-content/plugins/revisionary/common/css/pressshack-admin.css new file mode 100644 index 000000000..452ce6b8a --- /dev/null +++ b/wp-content/plugins/revisionary/common/css/pressshack-admin.css @@ -0,0 +1,172 @@ +/** + * @package PublishPress + * @author PublishPress + * + * Copyright (c) 2018 PublishPress + * + * ------------------------------------------------------------------------------ + * Based on Edit Flow + * Author: Daniel Bachhuber, Scott Bressler, Mohammad Jangda, Automattic, and + * others + * Copyright (c) 2009-2016 Mohammad Jangda, Daniel Bachhuber, et al. + * ------------------------------------------------------------------------------ + * + * This file is part of PublishPress + * + * PublishPress is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PublishPress is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PublishPress. If not, see . + */ + +.pressshack-admin-wrapper a:link, +.pressshack-admin-wrapper a:visited, +.pressshack-admin-wrapper a:active, +.pressshack-admin-wrapper a:hover { + text-decoration: none; +} + +.pressshack-admin-wrapper a, +.pressshack-admin-wrapper button, +.pressshack-admin-wrapper button::before { + -webkit-transition: all 200ms ease-in-out; + -moz-transition: all 200ms ease-in-out; + -o-transition: all 200ms ease-in-out; + transition: all 200ms ease-in-out; +} + +.pressshack-admin-wrapper a, +.pressshack-admin-wrapper a div, +.pressshack-admin-wrapper a p { + color: #655997; +} + +.pressshack-admin-wrapper a:hover, +.pressshack-admin-wrapper a:focus, +.pressshack-admin-wrapper a:active, +.pressshack-admin-wrapper a:hover div, +.pressshack-admin-wrapper a:focus div, +.pressshack-admin-wrapper a:active div, +.pressshack-admin-wrapper a:hover p, +.pressshack-admin-wrapper a:focus p, +.pressshack-admin-wrapper a:active p, +.pressshack-admin-wrapper a:hover .dashicons:before, +.pressshack-admin-wrapper a:focus .dashicons:before, +.pressshack-admin-wrapper a:active .dashicons:before { + color: #5A4F87; + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + -o-box-shadow: none; +} + +.pressshack-admin-wrapper > header h1 a, +.pressshack-admin-wrapper > header h1 a:hover, +.pressshack-admin-wrapper > header h1 a:focus, +.pressshack-admin-wrapper > header h1 a:active { + color: #23282d; +} + +.pressshack-admin-wrapper .nav-tab-wrapper .nav-tab { + color: inherit; + margin-bottom: -1px; +} + +.pressshack-admin-wrapper .nav-tab-wrapper .nav-tab-active, +.pressshack-admin-wrapper .nav-tab-wrapper .nav-tab:hover, +.pressshack-admin-wrapper .nav-tab-wrapper .nav-tab:active, +.pressshack-admin-wrapper .nav-tab-wrapper .nav-tab:focus { + border-top-color: #655997; + color: #655997; +} + +.pressshack-admin-wrapper > footer { + margin-top: 25px; + text-align: center; +} + +.pressshack-admin-wrapper > footer > div.pp-rating { + font-size: 12px; + margin-bottom: 10px; + margin-top: 30px; +} + +.pressshack-admin-wrapper > footer * { + color: #777; +} + +.pressshack-admin-wrapper > footer > nav ul { + list-style: none; +} + +.pressshack-admin-wrapper > footer > nav ul > li { + display: inline-block; +} + +.pressshack-admin-wrapper > footer > nav ul > li:not(:first-child) { + margin-left: 15px; +} + +.pressshack-admin-wrapper > footer > nav ul > li > a { + font-weight: bold; +} + +.pressshack-admin-wrapper > footer .dashicons.dashicons-star-filled { + line-height: 18px; + font-size: 12px; + width: 12px; + height: 12px; + color: #FFB300; + -webkit-transition: color 200ms ease-in-out; + -moz-transition: color 200ms ease-in-out; + -o-transition: color 200ms ease-in-out; + transition: color 200ms ease-in-out; +} + +.pressshack-admin-wrapper button:not(.notice-dismiss), +.pressshack-admin-wrapper .button:not(.notice-dismiss) { + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + text-shadow: initial; + -webkit-box-shadow: initial; + -moz-box-shadow: initial; + box-shadow: initial; + vertical-align: middle; + line-height: 0; + min-height: 28px; + text-decoration: none; + padding: 15px 10px; + border-width: 1px; + border-style: solid; +} + +.pressshack-admin-wrapper .button:not(.notice-dismiss):hover, +.pressshack-admin-wrapper .button:not(.notice-dismiss):active, +.pressshack-admin-wrapper .button:not(.notice-dismiss):focus { + outline: none; + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pressshack-admin-wrapper .pp-pressshack-logo img { + width: 170px; +} + +/** + * Fremius tweaks + */ + +#piframe, +.fs-secure-notice { + display: none; +} diff --git a/wp-content/plugins/revisionary/common/img/publishpress-logo-icon.png b/wp-content/plugins/revisionary/common/img/publishpress-logo-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3291472d98f23d9068f1eb89ce7a0bfa18f228ee GIT binary patch literal 13364 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 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/revisionary/common/img/publishpress-logo.png b/wp-content/plugins/revisionary/common/img/publishpress-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f1a2bf3208579d598cec2fd30a5f88753493c8 GIT binary patch literal 8898 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 E02J-UcmMzZ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/revisionary/common/img/revisions-wp-logo.jpg b/wp-content/plugins/revisionary/common/img/revisions-wp-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c6e0d934b2fb5a92ab0ab65419cd668b8bdacfb GIT binary patch literal 58556 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ℑ=W~rL7HfvGyrLm^`*fG5ODl2L4U3T9X z6Bd5*f2#O+kX>%BH3Lli9@4h(u1A7QUU3{e*kN zjvl%^rdFOPyQfu1rZ>DPZ`YaB#9eHHMNPl{?Hk6A9ml_C)c<&8|1q%tdEsAi&pC0n za1wtzgRY;XNZCD(HXxMciL`4@+wW*4($k6GrA#U}7*+4IM+^+qZ3OrEZPcIg?`NgZ z!i-V3uwKqT03-sE>j7Qrx$X!|Im`;{da@VbnvHry>~?wovdRdga*7CX(*+|RR|n*I zR?3P$TRSCHP@C1)UA9e(@Js)ekM6gUTfFQzN_m)cMB0%xJ$!D&q0Tk?PDt$p8Jpva z|1z^o;TkI*60M5QV#H{zV?+bL#oHeZ^J0q&-!E&6ZL4k|iJ+(qg!ouYOws6^jhD$j z2&6-cGGEc#fv>#M=`oAJ3*jFu zPqpt0<~mUb6XF$Lob9G#$o%I6^fEfxFE>SH;?jfc>ViJZ`UiejPz1X=^t{*H3(Kuw zd|w;_+Ac=Yr+m|3=hV4ZU$lHz(3;v6Y*I(+RvLG218DS7`Np29vsJmsyq>+oHM*ER z8^a&?fCZ)*kprS5s-38d~-p}ack znbFl*@AD50Jy9Ow6?`&6Jg3YvKvTSvAX!<&8-?GiP zl^Y{D1s;ZS1kO^9SMNtzwChXmn>7i@3lBFtS<0Cz{`m1 z@HiPU`eW^W$%FCyoYirv_1}{t)V0$LEw#% zHG#ELh)HYW7na1Wx7y53_yrwpE$#tYBZQ=2^hbHxPoH>;kzDtL@hN|i=&RX5NddUk;AOpIUMtHru(pYx?P6{I8@^m0n=nW|A95n;Yw%l%9V zm6EmT)ibsO_pFTMj@CKZjCATJB`y{Y8zYeC=4(#X^^#^BMjBdTzF;%kh~@ODF7EUW zO;(`^OS8hqY$rePdE)B!;zThzH4U9oMLuAzVYb+a=Vu&+#qas>aw}Cz*gj_JP%p+7pU*^=MiL-wR;7?hR8%!m(BRouLCR4jn1_J^+wY2jac?bw znG4Sz29CqZ^6Yu&R;T6Wwux`hAnOp|%B4^hAcbdmC4V}js3ccp&V!rv>c|$x*|o(w zyO1iBS`|%>ZlihX@clyc7`_}8|54adoB3cV2=rvL*w6~3sjPEwj;~EWQr_{`#>n*p zU3VKX>>|P3FT3)U8?CZumOP*Deu~+TNy%_rot?GD6aBSvSCO!|sAjn~cTF42*GACV z$hS0RyULUv9wD9quaK8nSfYB2&BTJFex)ZpY%B$XE zj8oFrWHsC?kuT;lc>m-vZq?Jr6HgMdM%x-XA(zVb`;TQH2V{G+%QEnBduUsQr*Jcr zs3II;Xi6LOWM|xFtq+{BE*)&k9iLZFSW;S9A@uca^viXXi|6V?KD0&lwm#xo+XG)) z!wOgS^1lAd>4toXcg5JcC}!g9ZN_UmsF zIi6nspVa=bvtc-4J7?QnaYtu7hy~}m20DVqGY>rll*mg^0Rr({q?J(J<^-EuQF
    yD;v%fl};{Q1^sA1DQ&>ho50(R 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.2.5" + }, + "scripts": { + "build": "ppbuild build", + "build:dir": "ppbuild build-dir", + "build:clean": "ppbuild clean", + "get-version": "ppbuild version", + "gen:mo": "wp i18n make-mo ./languages ./languages --allow-root", + "gen:pot": "wp i18n make-pot . languages/revisionary.pot --domain=revisionary --exclude=dev-workspace,.wordpress-org,.github,dist,tests, --allow-root", + "check:longpath": "longpath .", + "pre-autoload-dump": "composer dumpautoload --working-dir=./lib", + "pre-update-cmd": "composer update --working-dir=./lib", + "pre-install-cmd": "composer install --working-dir=./lib" + }, + "extra": { + "plugin-slug": "revisionary", + "plugin-name": "publishpress-revisions", + "plugin-folder": "revisionary" + } +} diff --git a/wp-content/plugins/revisionary/composer.lock b/wp-content/plugins/revisionary/composer.lock new file mode 100644 index 000000000..0b833a2ef --- /dev/null +++ b/wp-content/plugins/revisionary/composer.lock @@ -0,0 +1,20 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "ecd28b624a6e0cde79e13ac05c09faaf", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=7.2.5" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/wp-content/plugins/revisionary/content-roles_rvy.php b/wp-content/plugins/revisionary/content-roles_rvy.php new file mode 100644 index 000000000..bf1deb529 --- /dev/null +++ b/wp-content/plugins/revisionary/content-roles_rvy.php @@ -0,0 +1,13 @@ + + * @copyright Copyright (c) 2024 PublishPress. All rights reserved. + * @license GPLv2 or later + * @since 1.0.0 + */ + +// Setting scope: For Network installations, which Revisionary options should default to site-wide control? +function rvy_default_options_sitewide() { + $def = array( + 'manage_unsubmitted_capability' => true, + 'copy_posts_capability' => true, + 'revision_statuses_noun_labels' => true, + 'caption_copy_as_edit' => true, + 'pending_revisions' => true, + 'auto_submit_revisions' => true, + 'revise_posts_capability' => true, + 'scheduled_revisions' => true, + 'scheduled_publish_cron' => true, + 'async_scheduled_publish' => true, + 'wp_cron_usage_detected' => false, + 'pending_rev_notify_admin' => true, + 'pending_rev_notify_author' => true, + 'rev_approval_notify_admin' => true, + 'rev_approval_notify_author' => true, + 'rev_approval_notify_revisor' => true, + 'publish_scheduled_notify_admin' => true, + 'publish_scheduled_notify_author' => true, + 'publish_scheduled_notify_revisor' => true, + 'use_notification_buffer' => true, + 'display_hints' => true, + 'revisor_role_add_custom_rolecaps' => true, + 'revisor_lock_others_revisions' => true, + 'revisor_hide_others_revisions' => true, + 'admin_revisions_to_own_posts' => true, + 'require_edit_others_drafts' => true, + 'diff_display_strip_tags' => false, + 'scheduled_revision_update_post_date' => true, + 'scheduled_revision_update_modified_date' => true, + 'pending_revision_update_post_date' => true, + 'pending_revision_update_modified_date' => true, + 'edd_key' => true, + 'revision_preview_links' => true, + 'preview_link_type' => true, + 'preview_link_alternate_preview_arg' => true, + 'home_preview_set_home_flag' => true, + 'compare_revisions_direct_approval' => true, + 'block_editor_extra_preview_button' => true, + 'display_pp_branding' => true, + 'revision_update_notifications' => true, + 'trigger_post_update_actions' => true, + 'copy_revision_comments_to_post' => true, + 'past_revisions_order_by' => true, + 'list_unsubmitted_revisions' => true, + 'rev_publication_delete_ed_comments' => true, + 'deletion_queue' => true, + 'revision_archive_deletion' => true, + 'revision_restore_require_cap' => true, + 'revision_limit_per_post' => true, + ); + + if ( $other_options = array_diff_key( rvy_default_options(), $def ) ) { + $def = array_merge( $def, array_fill_keys( array_keys($other_options), true ) ); + } + + return $def; +} + +// Default values for Revisionary settings +function rvy_default_options() { + $def = array( + 'manage_unsubmitted_capability' => 0, + 'copy_posts_capability' => 0, + 'revision_statuses_noun_labels' => 0, + 'caption_copy_as_edit' => 0, + 'pending_revisions' => 1, + 'auto_submit_revisions' => 0, + 'revise_posts_capability' => 0, + 'scheduled_revisions' => 1, + 'scheduled_publish_cron' => 1, + 'async_scheduled_publish' => 1, + 'wp_cron_usage_detected' => 0, + 'pending_rev_notify_admin' => 1, + 'pending_rev_notify_author' => 1, + 'rev_approval_notify_admin' => 0, + 'rev_approval_notify_author' => 1, + 'rev_approval_notify_revisor' => 1, + 'publish_scheduled_notify_admin' => 1, + 'publish_scheduled_notify_author' => 1, + 'publish_scheduled_notify_revisor' => 1, + 'use_notification_buffer' => 1, + 'display_hints' => 1, + 'revisor_role_add_custom_rolecaps' => 1, + 'revisor_lock_others_revisions' => 1, + 'revisor_hide_others_revisions' => 1, + 'admin_revisions_to_own_posts' => 1, + 'require_edit_others_drafts' => 1, + 'diff_display_strip_tags' => 0, + 'scheduled_revision_update_post_date' => 1, + 'pending_revision_update_post_date' => 0, + 'scheduled_revision_update_modified_date' => 1, + 'pending_revision_update_modified_date' => 0, + 'edd_key' => '', + 'revision_preview_links' => 1, + 'preview_link_type' => 'published_slug', + 'preview_link_alternate_preview_arg' => 1, + 'home_preview_set_home_flag' => 0, + 'compare_revisions_direct_approval' => 0, + 'block_editor_extra_preview_button' => 0, + 'display_pp_branding' => 1, + 'revision_update_notifications' => 0, + 'trigger_post_update_actions' => 0, + 'copy_revision_comments_to_post' => 0, + 'past_revisions_order_by' => '', + 'list_unsubmitted_revisions' => 0, + 'rev_publication_delete_ed_comments' => 0, + 'deletion_queue' => 0, + 'revision_archive_deletion' => 0, + 'revision_restore_require_cap' => 0, + 'revision_limit_per_post' => 0, + ); + + return $def; +} + +function rvy_po_trigger( $string ) { + return $string; +} diff --git a/wp-content/plugins/revisionary/front_rvy.php b/wp-content/plugins/revisionary/front_rvy.php new file mode 100644 index 000000000..40db91216 --- /dev/null +++ b/wp-content/plugins/revisionary/front_rvy.php @@ -0,0 +1,701 @@ +content_roles->is_direct_file_access() ) { + add_filter('posts_request', [$this, 'flt_view_revision'] ); + add_action('template_redirect', [$this, 'act_template_redirect'], 5 ); + } + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + add_filter('the_author', [$this, 'fltAuthor'], 20); + } + + if (!empty($_REQUEST['_ppp'])) { + add_action('template_redirect', [$this, 'actRevisionPreviewRedirect'], 1); + } + + add_filter('posts_results', [$this, 'inherit_status_workaround']); + add_filter('the_posts', [$this, 'undo_inherit_status_workaround']); + + remove_action( 'init', 'register_block_core_post_comments' ); + + do_action('revisionary_front_init'); + } + + function fltGetPostMeta($meta_val, $object_id, $meta_key, $single, $meta_type) { + static $busy; + + if (!empty($busy) || ('post' != $meta_type)) { + return $meta_val; + } + + $busy = true; + + if (wp_is_post_revision($object_id)) { + $unfiltered_meta_val = get_post_meta($object_id, $meta_key, $single); + + if (in_array($unfiltered_meta_val, [null, []])) { + if ($published_post_id = get_post_field('post_parent', $object_id)) { + $published_meta_val = get_post_meta($published_post_id, $meta_key, $single); + + if (null !== $published_meta_val) { + $meta_val = $published_meta_val; + } + } + } + } + + $busy = false; + + return $meta_val; + } + + function fltACFLoadValue($value, $post_id, $field) { + if ((null === $value) + && (rvy_in_revision_workflow($post_id) || wp_is_post_revision($post_id)) + && function_exists('acf_get_value') + ) { + if ($published_post_id = rvy_post_id($post_id)) { + + if (($published_post_id != $post_id) && !rvy_in_revision_workflow($published_post_id)) { + return acf_get_value($published_post_id, $field); + } + } + } + + return $value; + } + + function fltOptionPageOnFront($front_page_id) { + global $post; + + // extra caution and perf optimization for front end execution + if (!empty($post) && is_object($post) && rvy_in_revision_workflow($post) && ($post->comment_count == $front_page_id)) { + return $post->ID; + } + + return $front_page_id; + } + + function fltBodyClass($classes, $css_class) { + if ($this->isHomeRevision()) { + $classes = array_merge(['home'], $classes); + $classes = array_diff($classes, ['blog']); + } + + return $classes; + } + + function actSetQueriedObject(&$query) { + if ($post_id = rvy_detect_post_id()) { + if (rvy_in_revision_workflow($post_id) || wp_is_post_revision($post_id)) { + $query->queried_object = get_post($post_id); + $query->queried_object_id = $post_id; + } + } + } + + function actFlagHomeRevision(&$query) { + if ($this->isHomeRevision() + && ( + !defined('ELEMENTOR_VERSION') + || ( + (empty($_REQUEST['action']) || ('elementor' != $_REQUEST['actions'])) + && empty($_REQUEST['elementor-preview']) + && empty($_REQUEST['elementor_ajax']) + ) + ) + ) { + if (rvy_get_option('home_preview_set_home_flag')) { + $query->is_home = true; + } + + $query->is_front_page = true; + } + } + + private function isHomeRevision() { + if ($post_id = rvy_detect_post_id()) { + if ($published_post_id = rvy_post_id($post_id)) { + if ($published_post_id != $post_id) { + if ( ('page' === get_option( 'show_on_front' )) + && in_array( get_option( 'page_on_front' ), [$published_post_id, $post_id] ) + ) { + return true; + } + } + } + } + + return false; + } + + public function actRevisionPreviewRedirect() { + if (!class_exists('DS_Public_Post_Preview')) { + return; + } + + if ($_post = get_post(rvy_detect_post_id())) { + if (('revision' == $_post->post_type) && ('inherit' == $_post->post_status)) { + if ($url = get_permalink(rvy_post_id($_post->ID))) { + wp_redirect($url); + exit; + } + } + } + } + + public function fltAuthor($display_name) { + if ($_post = get_post(rvy_detect_post_id())) { + if (rvy_in_revision_workflow($_post) || wp_is_post_revision($_post)) { + // we only need this workaround when multiple authors were not successfully stored + if ($authors = get_multiple_authors($_post->ID, false)) { + return $display_name; + } + + if ($authors = get_multiple_authors(rvy_post_id($_post->ID), false)) { + $author_displays = []; + foreach($authors as $author) { + $author_displays []= $author->display_name; + } + + if (in_array($display_name,$author_displays)) { + return $display_name; + } + + return implode(', ', $author_displays); + } + } + } + + return $display_name; + } + + function flt_revision_preview_url($redirect_url, $requested_url) { + remove_filter('redirect_canonical', array($this, 'flt_revision_preview_url'), 10, 2); + return $requested_url; + } + + function flt_view_revision($request) { + global $current_user; + + //WP post/page preview passes this arg + if ( ! empty( $_GET['preview_id'] ) ) { + $published_post_id = (int) $_GET['preview_id']; + + remove_filter( 'posts_request', array( &$this, 'flt_view_revision' ) ); // no infinite recursion! + + if ( $preview = wp_get_post_autosave($published_post_id, $current_user->ID) ) + $request = str_replace( "ID = '$published_post_id'", "ID = '$preview->ID'", $request ); + + add_filter( 'posts_request', array( &$this, 'flt_view_revision' ) ); + + } else { + $revision_id = (isset($_REQUEST['page_id'])) ? (int) $_REQUEST['page_id'] : 0; + + if (!$revision_id) { + $revision_id = rvy_detect_post_id(); + } + + if (!$revision = wp_get_post_revision($revision_id)) { + return $request; + } + + // rvy_list_post_revisions passes these args + if($revision && ('revision' == $revision->post_type)) { + if ($pub_post = get_post($revision->post_parent)) { + if ( $type_obj = get_post_type_object( $pub_post->post_type ) ) { + if (current_user_can('read_post', $revision_id ) || current_user_can('edit_post', $revision_id)) { + $request = str_replace( "post_type = 'post'", "post_type = 'revision'", $request ); + $request = str_replace( "post_type = '{$pub_post->post_type}'", "post_type = 'revision'", $request ); + } + } + } + } + } + + return $request; + } + + // work around WP query_posts behavior (won't allow preview on posts unless status is public, private or protected) + function inherit_status_workaround( $results ) { + global $wp_post_statuses; + + if ( isset( $this->orig_inherit_protected_value ) ) + return $results; + + $this->orig_inherit_protected_value = $wp_post_statuses['inherit']->protected; + + $wp_post_statuses['inherit']->protected = true; + return $results; + } + + function undo_inherit_status_workaround( $results ) { + if ( ! empty( $this->orig_inherit_protected_value ) ) + $wp_post_statuses['inherit']->protected = $this->orig_inherit_protected_value; + + return $results; + } + + // allows for front-end viewing of a revision by those who can edit the current revision (also needed for post preview by users editing for pending revision) + function act_template_redirect() { + if ( is_admin() ) { + return; + } + + if (defined('FL_BUILDER_VERSION') && isset($_REQUEST['fl_builder'])) { + return; + } + + global $wp_query, $revisionary; + if ($wp_query->is_404) { + if (!empty($_REQUEST['base_post'])) { + if ($post = get_post(intval($_REQUEST['base_post']))) { + $url = get_permalink((int) $_REQUEST['base_post']); + wp_redirect($url); + exit; + } + } + } + + if (!empty($_REQUEST['page_id'])) { + $revision_id = (int) $_REQUEST['page_id']; + } elseif (!empty($_REQUEST['p'])) { + $revision_id = (int) $_REQUEST['p']; + } else { + if (!empty($post)) { + $revision_id = $post->ID; + } else { + $revision_id = 0; + } + } + + if ($wp_query->is_404 && !empty($revision_id) && (in_array(get_post_field('post_status', $revision_id), ['future', 'publish']) || defined('REVISIONARY_FORCE_PUBLICATION_REDIRECT'))) { + // Work around timing issue when scheduled revision publication is underway + if ($published_id = get_post_meta($revision_id, '_rvy_base_post_id', true)) { + if ($post = get_post($published_id)) { + if ($type_obj = get_post_type_object($post->post_type)) { + $redirect = ($type_obj && empty($type_obj->public)) ? rvy_admin_url("post.php?action=edit&post=$post->ID") : add_query_arg('mark_current_revision', 1, get_permalink($post->ID)); // published URL + wp_redirect($redirect); + exit; + } + } + } + } + + do_action('revisionary_front', $revision_id); + + global $wpdb; + + if (empty($_REQUEST['mark_current_revision'])) { + if (!$post = $wpdb->get_row( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts WHERE ID = %d", + $revision_id + )) + ) { + if (!$post = wp_get_post_revision($revision_id)) { + return; + } + } + } + + if ((!empty($_REQUEST['mark_current_revision']) || rvy_in_revision_workflow($post) || ('revision' == $post->post_type)) && !isset($_REQUEST['fl_builder'])) { + add_filter('redirect_canonical', array($this, 'flt_revision_preview_url'), 10, 2); + + if (!empty($_REQUEST['mark_current_revision'])) { + global $post; + $published_post_id = (!empty($post)) ? $post->ID : 0; + $revision_id = $published_post_id; + } else { + $published_post_id = rvy_post_id($revision_id); + + do_action('revisionary_preview_load', $revision_id, $published_post_id); + + if (!defined('REVISIONARY_PREVIEW_NO_META_MIRROR') && !class_exists('CWS_PageLinksTo')) { + // For display integrity, copy any missing keys from published post. Note: Any fields missing from revision are left unmodified at revision approval. + revisionary_copy_postmeta($published_post_id, $revision_id, ['empty_target_only' => true]); + } + + if (!defined('REVISIONARY_PREVIEW_NO_TERM_MIRROR')) { + revisionary_copy_terms($published_post_id, $revision_id, ['empty_target_only' => true]); + } + + if (defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION') && !defined('REVISIONARY_DISABLE_MA_PREVIEW_CORRECTION') + && (rvy_in_revision_workflow($post) || wp_is_post_revision($post)) + ) { + $_authors = get_multiple_authors($revision_id); + + if (count($_authors) == 1) { + $_author = reset($_authors); + + if ($_author && empty($_author->ID)) { // @todo: is this still necessary? + $_author = MultipleAuthors\Classes\Objects\Author::get_by_term_id($_author->term_id); + } + } + + // If revision does not have valid multiple authors stored, correct to published post values + if (empty($_authors) || (!empty($_author) && $_author->ID == $post->post_author)) { + if (!$published_authors = wp_get_object_terms($published_post_id, 'author')) { + if ($published_post = get_post($published_post_id)) { + if ($author = MultipleAuthors\Classes\Objects\Author::get_by_user_id((int) $published_post->post_author)) { + $published_authors = [$author]; + } + } + } + + rvy_set_ma_post_authors($revision_id, $published_authors); + } + } + } + + if (empty($post)) { + global $post; + } + + if (empty($post)) { + return; + } + + $datef = __awp( 'M j, Y @ g:i a' ); + $date = agp_date_i18n( $datef, strtotime( $post->post_date ) ); + + $color = '#ccc'; + $class = ''; + $message = ''; + + // This topbar is presently only for those with restore / approve / publish rights + $type_obj = get_post_type_object( $post->post_type ); + + $can_publish = current_user_can('edit_post', $published_post_id); + + $redirect_arg = ( ! empty($_REQUEST['rvy_redirect']) ) ? "&rvy_redirect=" . esc_url_raw($_REQUEST['rvy_redirect']) : ''; + + load_plugin_textdomain('revisionary', false, dirname(plugin_basename(REVISIONARY_FILE)) . '/languages'); + + $published_url = ($published_post_id) ? get_permalink($published_post_id) : ''; + $diff_url = rvy_admin_url("revision.php?revision=$revision_id"); + $queue_url = rvy_admin_url("admin.php?page=revisionary-q&published_post={$published_post_id}&all=1"); + + if ((!rvy_get_option('revisor_hide_others_revisions') && !empty($type_obj) && current_user_can($type_obj->cap->edit_posts)) || current_user_can('read_post', $revision_id)) { + $view_published = ($published_url) + ? sprintf( + apply_filters( + 'revisionary_list_caption', + esc_html__("%sView Queue%s", 'revisionary'), + $post // revision + ), + "", + '' + ) + . sprintf( + apply_filters( + 'revisionary_preview_compare_view_caption', + esc_html__("%sCompare%s%sView Published Post%s", 'revisionary'), + $post // revision + ), + "", + '', + "", + '' + ) + : ''; + } else { // @todo + $view_published = ($published_url) + ? sprintf( + apply_filters( + 'revisionary_preview_view_caption', + esc_html__("%sView Published Post%s", 'revisionary'), + $post // revision + ), + "", + "" + ) + : ''; + } + + if (current_user_can('edit_post', $revision_id)) { + $edit_url = apply_filters('revisionary_preview_edit_url', rvy_admin_url("post.php?action=edit&post=$revision_id"), $revision_id); + $edit_button = "" . esc_html__('Edit', 'revisionary') . ''; + } else { + $edit_button = ''; + } + + if ( in_array( $post->post_mime_type, array( 'draft-revision' ) ) ) { + if ($can_edit = current_user_can('edit_post', $revision_id)) { + $submit_url = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision=$revision_id&action=submit$redirect_arg"), "submit-post_$published_post_id|$revision_id" ); + $publish_url = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision=$revision_id&action=approve$redirect_arg"), "approve-post_$published_post_id|$revision_id" ); + } + } elseif ($can_edit = current_user_can('edit_post', rvy_post_id($revision_id))) { + if ( in_array( $post->post_mime_type, array( 'pending-revision' ) ) ) { + $publish_url = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision=$revision_id&action=approve$redirect_arg"), "approve-post_$published_post_id|$revision_id" ); + + } elseif ( in_array( $post->post_mime_type, array( 'future-revision' ) ) ) { + $publish_url = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision=$revision_id&action=publish$redirect_arg"), "publish-post_$published_post_id|$revision_id" ); + + } elseif ( in_array( $post->post_status, array( 'inherit' ) ) ) { + $publish_url = wp_nonce_url( rvy_admin_url("admin.php?page=rvy-revisions&revision=$revision_id&action=restore$redirect_arg"), "restore-post_$published_post_id|$revision_id" ); + + } else { + $publish_url = ''; + } + } else { + $publish_url = ''; + } + + if (('revision' == $post->post_type) && (get_post_field('post_modified_gmt', $post->post_parent) == get_post_meta($revision_id, '_rvy_published_gmt', true) && empty($_REQUEST['mark_current_revision'])) + ) { + if ($post = get_post($post->post_parent)) { + if ('revision' != $post->post_type && !rvy_in_revision_workflow($post)) { + $url = add_query_arg('mark_current_revision', 1, get_permalink($post->ID)); + wp_redirect($url); + exit; + } + } + } else { + switch ( $post->post_mime_type ) { + case 'draft-revision' : + $class = 'draft'; + $status_obj = get_post_status_object(get_post_field('post_status', rvy_post_id($revision_id))); + + $approve_caption = esc_html__( 'Approve', 'revisionary' ); + + if (!empty($submit_url) && current_user_can("set_revision_pending-revision", $revision_id)) { + $submit_caption = esc_html__( 'Submit', 'revisionary' ); + $publish_button = '' . $submit_caption . ''; + } else { + $publish_button = ''; + } + + if ($can_publish) { + $publish_caption = (!empty($status_obj->public) || !empty($status_obj->private)) ? esc_html__('Publish now', 'revisionary') : $approve_caption; + $publish_button .= ($can_publish) ? '' . $publish_caption . '' : ''; + } + + if (!empty($_REQUEST['elementor-preview'])) { + $message = sprintf( esc_html__('This is a %s. %s %s %s', 'revisionary'), pp_revisions_status_label('draft-revision', 'name'), '', '', ''); + } else { + $message = sprintf( esc_html__('This is a %s. %s %s %s', 'revisionary'), pp_revisions_status_label('draft-revision', 'name'), $view_published, $edit_button, $publish_button ); + } + + break; + + // alternate: no break here; output hidden pending-revision top bar + + case 'pending-revision' : + $approve_caption = esc_html__( 'Approve', 'revisionary' ); + + if ($can_publish && !defined('REVISIONARY_PREVIEW_NO_DECLINE_BUTTON')) { + $decline_url = wp_nonce_url(admin_url("post.php?post=$revision_id&action=decline_revision"), 'decline-revision'); + $decline_button = ($can_publish) ? '' . esc_html__('Decline', 'revisionary') . '' : ''; + } else { + $decline_button = ''; + } + + if ( strtotime( $post->post_date_gmt ) > agp_time_gmt() ) { + $class = 'pending_future'; + $publish_button = ($can_publish) ? '' . $approve_caption . '' : ''; + + if (!empty($_REQUEST['elementor-preview'])) { + $message = sprintf( esc_html__('This is a %s (requested publish date: %s). %s %s %s', 'revisionary'), pp_revisions_status_label('pending-revision', 'name'), $date, '', '', ''); + } else { + $message = sprintf( esc_html__('This is a %s (requested publish date: %s). %s %s %s', 'revisionary'), pp_revisions_status_label('pending-revision', 'name'), $date, $view_published, $edit_button, $publish_button . $decline_button ); + } + } else { + $class = 'pending'; + $status_obj = get_post_status_object(get_post_field('post_status', rvy_post_id($revision_id))); + $publish_caption = (!empty($status_obj->public) || !empty($status_obj->private)) ? esc_html__('Publish now', 'revisionary') : $approve_caption; + $publish_button = ($can_publish) ? '' . $publish_caption . '' : ''; + + if (!empty($_REQUEST['elementor-preview'])) { + $message = sprintf( esc_html__('This is a %s. %s %s %s', 'revisionary'), pp_revisions_status_label('pending-revision', 'name'), '', '', '' ); + } else { + $message = sprintf( esc_html__('This is a %s. %s %s %s', 'revisionary'), pp_revisions_status_label('pending-revision', 'name'), $view_published, $edit_button, $publish_button . $decline_button ); + } + } + + break; + + case 'future-revision' : + $class = 'future'; + + $edit_url = rvy_admin_url("post.php?action=edit&post=$revision_id"); + $publish_button = ($can_publish) ? '' . esc_html__( 'Publish now', 'revisionary' ) . '' : ''; + + if (!empty($_REQUEST['elementor-preview'])) { + $message = sprintf( esc_html__('This is a %s (for publication on %s). %s %s %s', 'revisionary'), pp_revisions_status_label('future-revision', 'name'), $date, '', '', '' ); + } else { + $message = sprintf( esc_html__('This is a %s (for publication on %s). %s %s %s', 'revisionary'), pp_revisions_status_label('future-revision', 'name'), $date, $view_published, $edit_button, $publish_button ); + } + + break; + + case '' : + default: + if (!empty($_REQUEST['mark_current_revision'])) { + $class = 'published'; + + if (!$can_edit) { + $edit_button = ''; + } + + if (!empty($_REQUEST['elementor-preview'])) { + $message = sprintf( esc_html__('This is the Current Revision. %s', 'revisionary'), '' ); + } else { + $message = sprintf( esc_html__('This is the Current Revision. %s', 'revisionary'), $edit_button ); + } + + } elseif ('inherit' == $post->post_status) { + if ( current_user_can('edit_post', $revision_id ) ) { + $class = 'past'; + $date = agp_date_i18n( $datef, strtotime( $post->post_modified ) ); + + if (rvy_get_option('revision_restore_require_cap') + && !current_user_can('administrator') && !is_super_admin() && !current_user_can('restore_revisions')) { + $publish_button = ''; + } else { + $publish_button = ($can_publish) ? '' . esc_html__( 'Restore', 'revisionary' ) . '' : ''; + } + + if (!empty($_REQUEST['elementor-preview'])) { + $message = sprintf( esc_html__('This is a Past Revision (from %s). %s %s', 'revisionary'), $date, '', '' ); + } else { + $message = sprintf( esc_html__('This is a Past Revision (from %s). %s %s', 'revisionary'), $date, $view_published, $publish_button ); + } + } + } + } + + if (defined('REVISIONARY_LEGACY_PREVIEW_OUTPUT')) { + add_action('wp_head', [$this, 'rvyFrontCSS']); + } else { + //add_action('wp_print_scripts', [$this, 'rvyFrontCSS'], 5); + add_action('wp_enqueue_scripts', [$this, 'rvyEnqueueStyle'], 50); + } + + add_action('wp_enqueue_scripts', [$this, 'rvyEnqueuePreviewJS']); + + if (empty($_REQUEST['elementor-preview'])) { + if (apply_filters('revisionary_admin_bar_absolute', !defined('REVISIONARY_PREVIEW_BAR_RELATIVE'))) { + add_action('wp_print_footer_scripts', [$this, 'rvyPreviewJS'], 50); + } + } + + $html = '
    ' . + '
    ' . $message . '
    '; + + if (defined('REVISIONARY_LEGACY_PREVIEW_OUTPUT')) { + new RvyScheduledHtml( $html, 'wp_head', 99 ); // this should be inserted at the top of instead, but currently no way to do it + } else { + new RvyScheduledHtml( $html, 'wp_print_scripts', 99 ); + } + } + } + } + + function rvyFrontCSS() { + echo ''."\n"; + } + + function rvyEnqueueStyle() { + wp_enqueue_style('revisionary-front', esc_url(plugins_url('', REVISIONARY_FILE)) . '/revisionary-front.css', [], PUBLISHPRESS_REVISIONS_VERSION); + } + + function rvyEnqueuePreviewJS() { + wp_enqueue_script('jquery'); + } + + function rvyPreviewJS() { + ?> + + html = $html; + $this->action = $action; + $this->priority = $priority; + + add_action( $action, array( $this, 'echo_html' ), $priority ); + } + + function echo_html() { + echo $this->html; + remove_action( $this->action, array( $this, 'echo_html' ), $this->priority ); + } +} diff --git a/wp-content/plugins/revisionary/functions.php b/wp-content/plugins/revisionary/functions.php new file mode 100644 index 000000000..8601e1ebc --- /dev/null +++ b/wp-content/plugins/revisionary/functions.php @@ -0,0 +1,441 @@ + false]; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + if ( isset( $wpdb->terms ) ) { + if (is_scalar($from_post)) { + $from_post = get_post($from_post); + } + + if (empty($from_post) || empty($from_post->post_type)) { + return; + } + + // Clear default category (added by wp_insert_post). + if (!$empty_target_only || !wp_get_object_terms($target_id, 'category', ['fields' => 'ids'])) { + wp_set_object_terms( $target_id, null, 'category' ); + } + + $post_taxonomies = get_object_taxonomies( $from_post->post_type ); + + // Several plugins just add support to post-formats but don't register post_format taxonomy. + if (!in_array('post_format', $post_taxonomies, true) && post_type_supports($from_post->post_type, 'post-formats')) { + $post_taxonomies[] = 'post_format'; + } + + /** + * Filters the taxonomy excludelist when copying a post. + * + * @param array $taxonomies_blacklist The taxonomy excludelist from the options. + * + * @return array + */ + $taxonomies_blacklist = []; + + $taxonomies_blacklist = apply_filters('revisionary_skip_taxonomies', $taxonomies_blacklist); + + if (defined('POLYLANG_VERSION')) { + if (!empty($args['applying_revision'])) { + $taxonomies_blacklist = array_merge($taxonomies_blacklist, ['language', 'post_translations', 'term_language', 'term_translations', '']); + } + } + + foreach (array_diff($post_taxonomies, $taxonomies_blacklist) as $taxonomy) { + if ($empty_target_only) { + $target_terms = wp_get_object_terms($target_id, $taxonomy, ['fields' => 'ids']); + if (!empty($target_terms)) { + continue; + } + } + + $post_term_slugs = wp_get_object_terms($from_post->ID, $taxonomy, ['fields' => 'slugs', 'orderby' => 'term_order']); + wp_set_object_terms($target_id, $post_term_slugs, $taxonomy); + } + } +} + +/** + * Copies the meta information of a post to another post. + * Based on Yoast Duplicate Post + * + * @param \WP_Post $from_post The source post object. + * @param int $target_id Target post ID. + * @param array $args The options array. + * + * @return void + */ +function revisionary_copy_postmeta($from_post, $to_post_id, $args = []) { + $defaults = ['empty_target_only' => false, 'apply_deletions' => false]; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + if (is_scalar($from_post)) { + $from_post = get_post($from_post); + } + + $source_meta_keys = \get_post_custom_keys( $from_post->ID ); + if ( empty( $source_meta_keys ) ) { + return; + } + + $meta_excludelist = revisionary_unrevisioned_postmeta(); + + $meta_excludelist_string = '(' . implode( ')|(', $meta_excludelist ) . ')'; + if ( strpos( $meta_excludelist_string, '*' ) !== false ) { + $meta_excludelist_string = str_replace( [ '*' ], [ '[a-zA-Z0-9_]*' ], $meta_excludelist_string ); + + $meta_keys = []; + foreach ( $source_meta_keys as $meta_key ) { + if (!in_array($meta_key, $meta_excludelist) + && !preg_match( '#^' . $meta_excludelist_string . '$#', $meta_key ) + ) { + $meta_keys[] = $meta_key; + } + } + } else { + $meta_keys = array_diff( $source_meta_keys, $meta_excludelist ); + } + + $target_meta_keys = (array) \get_post_custom_keys( $to_post_id ); + + $meta_keys = apply_filters('revisionary_create_revision_meta_keys', $meta_keys); + + foreach ( $meta_keys as $meta_key ) { + if ($empty_target_only && !empty($target_meta_keys) && is_array($target_meta_keys)) { + if (in_array($meta_key, $target_meta_keys)) { + continue; + } + } + + $meta_values = \get_post_custom_values( $meta_key, $from_post->ID ); + + if (count($meta_values) > 1) { + delete_post_meta($to_post_id, $meta_key); + + foreach ( $meta_values as $meta_value ) { + $meta_value = maybe_unserialize( $meta_value ); + add_post_meta( $to_post_id, $meta_key, \PublishPress\Revisions\Utils::recursively_slash_strings( $meta_value ) ); + } + } else { + foreach ( $meta_values as $meta_value ) { + $meta_value = maybe_unserialize( $meta_value ); + update_post_meta( $to_post_id, $meta_key, \PublishPress\Revisions\Utils::recursively_slash_strings( $meta_value ) ); + } + } + } + + if (!$empty_target_only && !empty($target_meta_keys) && is_array($target_meta_keys)) { + if ($delete_meta_keys = array_diff($target_meta_keys, $meta_keys, revisionary_unrevisioned_postmeta())) { + $deletable_keys = apply_filters('revisionary_deletable_postmeta_keys', ['_links_to', '_links_to_target']); + } + + foreach($delete_meta_keys as $meta_key) { + if (in_array($meta_key, $deletable_keys) || !empty($args['apply_deletions']) || defined('PP_REVISIONS_APPLY_POSTMETA_DELETION')) { + delete_post_meta($to_post_id, $meta_key); + } + } + } + + $args = array_merge( + $args, + compact('meta_keys', 'source_meta_keys') + ); + + do_action('revisionary_copy_postmeta', $from_post, $to_post_id, $args); +} + +function rvy_revision_base_statuses($args = []) { + $defaults = ['output' => 'names', 'return' => 'array']; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + $arr = array_map('sanitize_key', (array) apply_filters('rvy_revision_base_statuses', ['draft', 'pending', 'future'])); + + if ('object' == $output) { + $status_keys = array_value($arr); + $arr = []; + + foreach($status_keys as $k) { + $arr[$k] = get_post_status_object($k); + } + } + + return ('csv' == $return) ? "'" . implode("','", $arr) . "'" : $arr; +} + +function rvy_revision_statuses($args = []) { + $defaults = ['output' => 'names', 'return' => 'array']; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + $arr = array_map('sanitize_key', (array) apply_filters('rvy_revision_statuses', ['draft-revision', 'pending-revision', 'future-revision'])); + + if ('object' == $output) { + $status_keys = array_value($arr); + $arr = []; + + foreach($status_keys as $k) { + $arr[$k] = get_post_status_object($k); + } + } + + return ('csv' == $return) ? "'" . implode("','", $arr) . "'" : $arr; +} + +function rvy_is_revision_status($post_status) { + return in_array($post_status, rvy_revision_statuses()); +} + +function rvy_in_revision_workflow($post, $args = []) { + if (!empty($post) && is_numeric($post)) { + $post = get_post($post); + } + + if (empty($post) || empty($post->post_mime_type)) { + return false; + } + + $base_statuses = rvy_revision_base_statuses(); + + if (!empty($args['include_trash'])) { + $base_statuses []= 'trash'; + } + + return rvy_is_revision_status($post->post_mime_type) && in_array($post->post_status, $base_statuses) ? $post->post_mime_type : false; +} + +function rvy_post_id($revision_id) { + if ($_post = get_post($revision_id)) { + // if ID passed in is not a revision, return it as is + if (('revision' != $_post->post_type) && !rvy_in_revision_workflow($_post)) { + return $revision_id; + + } elseif ('revision' == $_post->post_type) { + return $_post->post_parent; + + } else { + if (!$_post->comment_count) { + static $busy; + + if (!empty($busy)) { + return; + } + + $busy = true; + $published_id = rvy_get_post_meta( $revision_id, '_rvy_base_post_id', true ); + $busy = false; + + if ($published_id) { + global $wpdb; + $wpdb->update($wpdb->posts, ['comment_count' => $published_id], ['ID' => $revision_id]); + } + } else { + $published_id = $_post->comment_count; + } + } + } + + return (!empty($published_id)) ? $published_id : 0; +} + +// Append a random argument for cache busting +function rvy_nc_url($url, $args = []) { + $nc = (!empty($args['nc'])) ? $args['nc'] : substr(md5(wp_rand(1, 99999999)), 1, 8); + return add_query_arg('nc', $nc, $url); +} + +// Complete an admin URL, appending a random argument for cache busting +function rvy_admin_url($partial_admin_url) { + return rvy_nc_url( admin_url($partial_admin_url) ); +} + +function pp_revisions_plugin_updated($current_version) { + global $wpdb; + + $last_ver = get_option('revisionary_last_version'); + + if (version_compare($last_ver, '3.0.12-rc4', '<')) { + global $wp_version; + + if (class_exists('WpeCommon') || version_compare($wp_version, '5.9', '>=')) { + update_option('rvy_scheduled_publish_cron', 1); // trigger generation of cron schedules for existing scheduled revisions + } + } + + if (version_compare($last_ver, '3.0.5-beta', '<')) { + if ($role = @get_role('revisor')) { + $role->add_cap('list_others_posts'); + $role->add_cap('list_others_pages'); + $role->add_cap('list_published_posts'); + $role->add_cap('list_published_pages'); + $role->add_cap('list_private_posts'); + $role->add_cap('list_private_pages'); + } + } + + if (version_compare($last_ver, '3.0.1', '<')) { + // convert pending / scheduled revisions to v3.0 format + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + $wpdb->query("UPDATE $wpdb->posts SET post_mime_type = post_status WHERE post_status IN ('$revision_status_csv')"); + $wpdb->query("UPDATE $wpdb->posts SET post_status = 'draft', post_mime_type = 'draft-revision' WHERE post_status IN ('draft-revision')"); + $wpdb->query("UPDATE $wpdb->posts SET post_status = 'pending', post_mime_type = 'pending-revision' WHERE post_status IN ('pending-revision')"); + $wpdb->query("UPDATE $wpdb->posts SET post_status = 'pending', post_mime_type = 'future-revision' WHERE post_status IN ('future-revision')"); + } + + if (version_compare($last_ver, '3.0.7-rc4', '<') && !defined('PRESSPERMIT_DEBUG')) { + // delete revisions that were erroneously trashed instead of deleted + $wpdb->query("DELETE FROM $wpdb->posts WHERE post_mime_type IN ('draft-revision', 'pending-revision', 'future-revision') AND post_status = 'trash'"); + } + + if (version_compare($last_ver, '3.0-rc7', '<')) { + if ($role = @get_role('administrator')) { + $role->add_cap('manage_unsubmitted_revisions'); + } + + if ($role = @get_role('revisor')) { + $role->add_cap('upload_files'); + } + } + + if ($current_version != $last_ver) { + require_once( dirname(__FILE__).'/lib/agapetry_wp_core_lib.php'); + require_once(dirname(__FILE__).'/rvy_init.php'); + revisionary_refresh_revision_flags(); + + // mirror to REVISIONARY_VERSION + update_option('revisionary_last_version', $current_version); + + delete_option('revisionary_sent_mail'); + } +} + +function pp_revisions_plugin_activation() { + // force this timestamp to be regenerated, in case something went wrong before + delete_option( 'rvy_next_rev_publish_gmt' ); + + if (!class_exists('RevisionaryActivation')) { + require_once(dirname(__FILE__).'/activation_rvy.php'); + } + + require_once(dirname(__FILE__).'/functions.php'); + + // import from Revisionary 1.x + new RevisionaryActivation(['import_legacy' => true]); + + // convert pending / scheduled revisions to v3.0 format + global $wpdb; + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + if (!defined('REVISIONARY_DISABLE_ACTIVATION_TRASH_QUERY')) { + $results = $wpdb->get_results("SELECT ID, comment_count FROM $wpdb->posts WHERE post_mime_type IN ('draft-revision', 'pending-revision', 'future-revision') AND post_status = 'trash'"); + + $trashed_ids = []; + + foreach ($results as $row) { + $trashed_ids[$row->comment_count] = $row->ID; + } + + $revision_post_ids = $wpdb->get_col("SELECT comment_count FROM $wpdb->posts WHERE post_mime_type IN ('draft-revision', 'pending-revision', 'future-revision')"); + + $id_csv = implode("','", $revision_post_ids); + $deleted_ids = $wpdb->get_col("SELECT post_id FROM $wpdb->postmeta WHERE post_id NOT IN ('" . $id_csv . "') AND meta_key = '_rvy_base_post_id'"); + + foreach (array_merge($trashed_ids, $deleted_ids) as $revision_id) { + delete_post_meta($revision_id, '_rvy_base_post_id', true); + } + + if (get_option('rvy_revision_limit_per_post')) { + foreach (array_keys($trashed_ids) as $post_id) { + if ($post_id) { + revisionary_refresh_postmeta($post_id); + } + } + } + } + + $wpdb->query("UPDATE $wpdb->posts SET post_mime_type = post_status WHERE post_status IN ('$revision_status_csv')"); + $wpdb->query("UPDATE $wpdb->posts SET post_status = 'draft', post_mime_type = 'draft-revision' WHERE post_status IN ('draft-revision')"); + $wpdb->query("UPDATE $wpdb->posts SET post_status = 'pending', post_mime_type = 'pending-revision' WHERE post_status IN ('pending-revision')"); + $wpdb->query("UPDATE $wpdb->posts SET post_status = 'pending', post_mime_type = 'future-revision' WHERE post_status IN ('future-revision')"); +} + +function pp_revisions_plugin_deactivation() { + global $wpdb; + + require_once(dirname(__FILE__).'/functions.php'); + + // Prevents pending / scheduled revisions from being listed as regular drafts / pending posts after plugin is deactivated + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + $wpdb->query("UPDATE $wpdb->posts SET post_status = post_mime_type WHERE post_mime_type IN ('$revision_status_csv')"); + $wpdb->query("UPDATE $wpdb->posts SET post_mime_type = '' WHERE post_mime_type IN ('$revision_status_csv')"); + + if ($timestamp = wp_next_scheduled('rvy_mail_buffer_hook')) { + wp_unschedule_event($timestamp,'rvy_mail_buffer_hook'); + } +} diff --git a/wp-content/plugins/revisionary/includes/CoreAdmin.php b/wp-content/plugins/revisionary/includes/CoreAdmin.php new file mode 100644 index 000000000..a53ebe1ba --- /dev/null +++ b/wp-content/plugins/revisionary/includes/CoreAdmin.php @@ -0,0 +1,134 @@ + 'You\'re using PublishPress Revisions Free. The Pro version has more features and support. %sUpgrade to Pro%s', + 'link' => 'https://publishpress.com/links/revisions-banner', + 'screens' => [ + ['base' => 'toplevel_page_revisionary-q'], + ['base' => 'revisions_page_revisionary-settings'], + ['base' => 'revisions_page_revisionary-archive'], + ['base' => 'toplevel_page_revisionary-archive'], + ] + ]; + + return $settings; + }); + } + + function setUpgradeMenuLink() { + if (!current_user_can('manage_options')) { + return; + } + + $url = 'https://publishpress.com/links/revisions-menu'; + ?> + + + + +
    +
    +
    +
    +
    + sidebarBannerContent();?> +
    +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/wp-content/plugins/revisionary/languages/revisionary-be_BY.po b/wp-content/plugins/revisionary/languages/revisionary-be_BY.po new file mode 100644 index 000000000..6aae57f6d --- /dev/null +++ b/wp-content/plugins/revisionary/languages/revisionary-be_BY.po @@ -0,0 +1,2462 @@ +msgid "" +msgstr "" +"Project-Id-Version: PublishPress Revisions\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-07-01 16:57-0400\n" +"PO-Revision-Date: \n" +"Last-Translator: Kevin Behrens \n" +"Language-Team: Marcis G. \n" +"Language: be_BY\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;_c;__ngettext;_n;rvy_po_trigger;_x;_ex;" +"esc_html__;esc_html_e\n" +"X-Generator: Poedit 3.0.1\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPath-1: admin\n" +"X-Poedit-SearchPath-2: classes\n" +"X-Poedit-SearchPath-3: includes\n" +"X-Poedit-SearchPathExcluded-0: includes-pro\n" + +#: admin/RevisionEditSubmitMetabox.php:60 admin/class-list-table_rvy.php:1181 +#, fuzzy +#| msgid "Current Revision" +msgid "Delete Revision" +msgstr "У вас няма правоў для выдалення рэдакцыі." + +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Move to Trash" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:118 +#: admin/RevisionEditSubmitMetabox.php:121 admin/class-list-table_rvy.php:609 +#: admin/class-list-table_rvy.php:1200 admin/history_rvy.php:1067 +#: admin/history_rvy.php:1162 admin/post-edit_rvy.php:85 +#: admin/post-editor-workflow-ui_rvy.php:48 +#: admin/post-editor-workflow-ui_rvy.php:89 +#: admin/post-editor-workflow-ui_rvy.php:185 admin/revision-ui_rvy.php:260 +msgid "Preview" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:119 admin/post-edit_rvy.php:100 +msgid "View / moderate saved revision" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:122 admin/post-edit_rvy.php:103 +msgid "View saved revision" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:144 +msgid "Status:" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:177 +msgid "M j, Y @ G:i" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:182 +#, fuzzy, php-format +#| msgid "Schedule for:" +msgid "Scheduled for: %s" +msgstr "Запланавана для:" + +#: admin/RevisionEditSubmitMetabox.php:185 +#, fuzzy, php-format +#| msgid "Published on:" +msgid "Publish on: %s" +msgstr "Апублікавана:" + +#: admin/RevisionEditSubmitMetabox.php:188 +#, fuzzy, php-format +#| msgid "Published on:" +msgid "Publish %son approval%s" +msgstr "Апублікавана:" + +#: admin/RevisionEditSubmitMetabox.php:193 admin/admin-posts_rvy.php:187 +#: admin/class-list-table_rvy.php:576 admin/class-list-table_rvy.php:1162 +#: admin/post-editor-workflow-ui_rvy.php:94 +#: admin/post-editor-workflow-ui_rvy.php:186 front_rvy.php:296 +msgid "Edit" +msgstr "" + +#: admin/admin-init_rvy.php:136 admin/admin-init_rvy.php:248 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "" + +#: admin/admin-init_rvy.php:177 +msgid "Sorry, you are not allowed to submit this revision." +msgstr "" + +#: admin/admin-init_rvy.php:213 +#, fuzzy +#| msgid "You do not have permission to delete that revision." +msgid "Sorry, you are not allowed to decline this revision." +msgstr "У вас няма правоў для выдалення рэдакцыі." + +#: admin/admin-init_rvy.php:277 +#, fuzzy +#| msgid "You do not have permission to delete that revision." +msgid "Sorry, you are not allowed to delete this revision." +msgstr "У вас няма правоў для выдалення рэдакцыі." + +#: admin/admin-init_rvy.php:282 +msgid "Error in deleting." +msgstr "" + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "Версія была адноўлена." + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "Рэдакцыя была запланавана для публікацыі." + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "Рэдакцыя была апублікавана." + +#: admin/admin-posts_rvy.php:140 rvy_init.php:488 +#, fuzzy +#| msgid "Revisions" +msgid "Revision" +msgstr "Гэты перагляд быў апублікаваны %s" + +#: admin/admin-posts_rvy.php:157 +#, fuzzy +#| msgid "%1$s Revisions" +msgid "Has Revision" +msgstr "%1$s рэдакцый" + +#: admin/admin-posts_rvy.php:172 admin/admin_rvy.php:213 +#, fuzzy +#| msgid "Revisions" +msgid "Revision Queue" +msgstr "Рэдакцыі" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:227 +msgid "PublishPress Revisions Network Settings" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:229 +#, fuzzy +#| msgid "Revisionary Defaults" +msgid "PublishPress Revisions Network Defaults" +msgstr "Налады Revisionary" + +#: admin/admin_lib-mu_rvy.php:21 +#, fuzzy +#| msgid "Revert to Defaults" +msgid "Network Defaults" +msgstr "Вярнуць да пачатковых" + +#: admin/admin_rvy.php:194 admin/admin_rvy.php:210 +msgid "Revisions" +msgstr "Рэдакцыі" + +#: admin/admin_rvy.php:226 admin/options.php:233 +#, fuzzy +#| msgid "Publish this Pending Revision now." +msgid "PublishPress Revisions Settings" +msgstr "Да публікацыі гэтага Рэдакцыя цяпер." + +#: admin/admin_rvy.php:226 admin/options.php:92 +#, fuzzy +msgid "Settings" +msgstr "Налады захаваны." + +#: admin/admin_rvy.php:233 admin/admin_rvy.php:234 includes/CoreAdmin.php:92 +msgid "Upgrade to Pro" +msgstr "" + +#: admin/admin_rvy.php:306 +#, php-format +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "" + +#: admin/admin_rvy.php:317 +msgid "About" +msgstr "" + +#: admin/admin_rvy.php:319 +msgid "Documentation" +msgstr "" + +#: admin/admin_rvy.php:321 +msgid "Contact" +msgstr "" + +#: admin/agents_checklist_rvy.php:75 +#, php-format +msgid "show current users (%d)" +msgstr "паказаць бягучых карыстачоў (%d)" + +#: admin/agents_checklist_rvy.php:77 +#, php-format +msgid "show eligible users (%d)" +msgstr "паказаць правы карыстачоў (%d)" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "фільтр:" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "абраць" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "не выбіраць" + +#: admin/class-list-table_rvy.php:427 admin/post-editor-workflow-ui_rvy.php:29 +msgid "Status" +msgstr "" + +#: admin/class-list-table_rvy.php:428 +msgid "Post Type" +msgstr "" + +#: admin/class-list-table_rvy.php:438 +#, fuzzy +#| msgid "Schedule Now" +msgid "Schedule" +msgstr "Запланавана для:" + +#: admin/class-list-table_rvy.php:481 admin/class-list-table_rvy.php:1093 +msgid "Y/m/d g:i:s a" +msgstr "" + +#: admin/class-list-table_rvy.php:489 admin/class-list-table_rvy.php:1098 +#: admin/history_rvy.php:980 +#, php-format +msgid "%s ago" +msgstr "" + +#: admin/class-list-table_rvy.php:491 admin/class-list-table_rvy.php:1101 +msgid "Y/m/d g:i a" +msgstr "" + +#: admin/class-list-table_rvy.php:498 +#, fuzzy, php-format +#| msgid "(already scheduled for publication on %s)" +msgid "Scheduled publication: %s" +msgstr "(ужо запланаваны да публікацыі на %s)" + +#: admin/class-list-table_rvy.php:501 +#, fuzzy, php-format +#| msgid "(for publication on %s)" +msgid "Requested publication: %s" +msgstr "(lkz ge,kbrfwbb %s)" + +#: admin/class-list-table_rvy.php:505 +#, fuzzy +#| msgid "Unschedule" +msgid "Missed schedule" +msgstr "Не планаваць" + +#: admin/class-list-table_rvy.php:546 admin/history_rvy.php:779 +msgid "No author" +msgstr "" + +#: admin/class-list-table_rvy.php:588 +#, fuzzy, php-format +#| msgid "View it in Revisions Manager" +msgid "View only revisions of %s" +msgstr "Глядзець гэта ў мэнэджару версій" + +#: admin/class-list-table_rvy.php:589 +#, fuzzy +#| msgid "filter:" +msgid "Filter" +msgstr "фільтр:" + +#: admin/class-list-table_rvy.php:600 admin/class-list-table_rvy.php:608 +#, fuzzy +#| msgid "It will be published on %s" +msgid "View published post" +msgstr "Гэта было апублікавана %s" + +#: admin/class-list-table_rvy.php:601 +#, fuzzy +msgid "View" +msgstr "Глядзець гэта ў мэнэджару версій" + +#: admin/class-list-table_rvy.php:632 +#, fuzzy +#| msgid "Restore this Past Revision" +msgid "Compare Past Revisions" +msgstr "Воостановлено з прошл. рэдакцыі" + +#: admin/class-list-table_rvy.php:633 +msgid "History" +msgstr "" + +#: admin/class-list-table_rvy.php:661 +msgid "Show more details" +msgstr "" + +#: admin/class-list-table_rvy.php:886 +msgid "My Activity" +msgstr "" + +#: admin/class-list-table_rvy.php:894 +#, php-format +msgid "All %s" +msgstr "" + +#: admin/class-list-table_rvy.php:918 front_rvy.php:341 rvy_init.php:309 +#: rvy_init.php:365 +#, fuzzy +msgid "Submit" +msgstr "" +"%1$s Submit a case study%2$s, растлумачыўшы, якім чынам гэтыя ўбудовы " +"дапамогуць вам зрабіць нешта выдатнае і пахвальна." + +#: admin/class-list-table_rvy.php:921 admin/history_rvy.php:1065 +#: front_rvy.php:338 front_rvy.php:359 rvy_init.php:295 rvy_init.php:313 +#: rvy_init.php:352 rvy_init.php:369 rvy_init.php:386 +msgid "Approve" +msgstr "" + +#: admin/class-list-table_rvy.php:922 +msgid "Decline" +msgstr "" + +#: admin/class-list-table_rvy.php:923 +#, fuzzy +#| msgid "Published:" +msgid "Publish" +msgstr "Да публікацыі гэтага Рэдакцыя цяпер." + +#: admin/class-list-table_rvy.php:926 admin/revision-ui_rvy.php:270 +msgid "Unschedule" +msgstr "Не планаваць" + +#: admin/class-list-table_rvy.php:930 admin/post-edit-block-ui_rvy.php:67 +#: admin/post-edit_rvy.php:51 +msgid "Delete Permanently" +msgstr "" + +#: admin/class-list-table_rvy.php:950 +msgid "Filter by category" +msgstr "" + +#: admin/class-list-table_rvy.php:1005 +#, fuzzy +#| msgid "select" +msgid "Select All" +msgstr "абраць" + +#: admin/class-list-table_rvy.php:1081 +#, fuzzy, php-format +#| msgid "“%1$s” (Current Revision)" +msgid "“%s” (Edit)" +msgstr "“%1$s” (Бягучая рэдакцыя)" + +#: admin/class-list-table_rvy.php:1171 rvy_init.php:291 +#, fuzzy +msgid "Copy" +msgstr "Копія" + +#: admin/class-list-table_rvy.php:1182 admin/revision-ui_rvy.php:391 +msgid "Delete" +msgstr "Выдаліць" + +#: admin/class-list-table_rvy.php:1199 +#: admin/post-editor-workflow-ui_rvy.php:185 +#, fuzzy +#| msgid "Pending Revisions" +msgid "Preview Revision" +msgstr "Pending Revisions" + +#: admin/class-list-table_rvy.php:1214 +msgid "Compare Changes" +msgstr "" + +#: admin/class-list-table_rvy.php:1215 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:125 +#: admin/post-edit_rvy.php:139 +msgid "Compare" +msgstr "" + +#: admin/edit-revision-block-ui_rvy.php:20 +msgid "Enable public preview" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:63 +msgid "Publish on approval" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:106 +#, php-format +msgid "Revision updated. %sView Preview%s" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:108 +#, fuzzy +#| msgid "The revision was updated." +msgid "Revision updated." +msgstr "Версія была обнавлена." + +#: admin/history_rvy.php:189 +#, fuzzy, php-format +#| msgid "Revision of “%1$s”" +msgid "Compare %s of \"%s\"" +msgstr "Рэдакцыя “%1$s”" + +#: admin/history_rvy.php:195 +#, fuzzy +#| msgid "Return to Edit Posts" +msgid "Return to editor" +msgstr "Вярнуцца да рэдагавання пастоў" + +#: admin/history_rvy.php:428 admin/history_rvy.php:431 +msgid "(no title)" +msgstr "" + +#: admin/history_rvy.php:528 admin/options.php:710 +#, fuzzy +#| msgid "Publish Date" +msgid "Post Date" +msgstr "Дата публікацыі" + +#: admin/history_rvy.php:529 +msgid "Post Parent" +msgstr "" + +#: admin/history_rvy.php:530 +msgid "Menu Order" +msgstr "" + +#: admin/history_rvy.php:531 +msgid "Comment Status" +msgstr "" + +#: admin/history_rvy.php:532 +msgid "Ping Status" +msgstr "" + +#: admin/history_rvy.php:667 +msgid "Page Template" +msgstr "" + +#: admin/history_rvy.php:670 +#, fuzzy +#| msgid "Features" +msgid "Featured Image" +msgstr "Функцыі" + +#: admin/history_rvy.php:674 +msgid "Beaver Builder Data" +msgstr "" + +#: admin/history_rvy.php:675 +msgid "Beaver Builder Settings" +msgstr "" + +#: admin/history_rvy.php:907 +#, fuzzy +#| msgid "Schedule for:" +msgid "Scheduled for " +msgstr "Рэдакцыя была запланавана для публікацыі." + +#: admin/history_rvy.php:912 +#, fuzzy +msgid "Requested for " +msgstr "Запытаная дата публікацыі: %1$s" + +#: admin/history_rvy.php:917 +#, fuzzy +msgid "Modified " +msgstr "Даце апошняй змены (націсніце, каб прагледзець / аднавіць)" + +#: admin/history_rvy.php:922 +#, php-format +msgid "%s%s ago" +msgstr "" + +#: admin/history_rvy.php:922 +#, php-format +msgid "%s%s from now" +msgstr "" + +#: admin/history_rvy.php:933 +msgid "M j, Y @ g:i a" +msgstr "" + +#: admin/history_rvy.php:934 +msgid "j M @ g:i a" +msgstr "" + +#: admin/history_rvy.php:978 +msgid "M j, Y @ H:i" +msgstr "" + +#: admin/history_rvy.php:979 +msgid "j M @ H:i" +msgstr "" + +#: admin/history_rvy.php:1065 +msgid "Preview / Approve" +msgstr "" + +#: admin/history_rvy.php:1161 +#, fuzzy +#| msgid "Review it here: " +msgid "Preview / Restore" +msgstr "Глядзець гэта тут:" + +#: admin/history_rvy.php:1168 +msgid "Manage" +msgstr "" + +#: admin/history_rvy.php:1169 +msgid "List" +msgstr "" + +#: admin/options.php:92 +#, fuzzy +#| msgid "Option Scope" +msgid "Setting Scope" +msgstr "Опцыя вобласці" + +#: admin/options.php:96 +#, fuzzy +#| msgid "Publish Date" +msgid "Post Types" +msgstr "Дата публікацыі" + +#: admin/options.php:97 +#, fuzzy +#| msgid "Revisor" +msgid "Revisors" +msgstr "Рэвізор" + +#: admin/options.php:98 +#, fuzzy +#| msgid "Revisions" +msgid "Statuses" +msgstr "Рэдакцыі" + +#: admin/options.php:99 +#, fuzzy +#| msgid "Revisionary Options" +msgid "Revision Creation" +msgstr "Опцыі Revisionary" + +#: admin/options.php:100 admin/options.php:111 +#, fuzzy +#| msgid "%s revision was deleted" +msgid "Revision Submission" +msgstr "%s версія была выдалена." + +#: admin/options.php:102 +msgid "Queue" +msgstr "" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "" + +#: admin/options.php:104 +#, fuzzy +#| msgid "Actions" +msgid "Options" +msgstr "Revisionary налады сайта" + +#: admin/options.php:105 +#, fuzzy +#| msgid "Email Notification" +msgid "Notifications" +msgstr "Email апавяшчэнне" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" + +#: admin/options.php:118 +#, php-format +msgid "Additional role capability required to manage %s" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "" + +#: admin/options.php:120 +#, php-format +msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +msgstr "" + +#: admin/options.php:121 admin/options.php:123 +#, php-format +msgid "Enable %s" +msgstr "" + +#: admin/options.php:122 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" + +#: admin/options.php:124 +msgid "Additional role capability required to submit a Change Request" +msgstr "" + +#: admin/options.php:124 +msgid "Additional role capability required to submit a revision" +msgstr "" + +#: admin/options.php:125 +msgid "Editing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:126 +msgid "Listing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:127 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" + +#: admin/options.php:128 +msgid "Also notify on Revision Update" +msgstr "" + +#: admin/options.php:129 +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" + +#: admin/options.php:130 +msgid "Hide html tags on Compare Revisions screen" +msgstr "" + +#: admin/options.php:131 +msgid "Use WP-Cron scheduling" +msgstr "" + +#: admin/options.php:132 +msgid "Asynchronous Publishing" +msgstr "Асінхронная публікацыя" + +#: admin/options.php:133 admin/options.php:134 +#, fuzzy +#| msgid "Publish Date" +msgid "Update Publish Date" +msgstr "Дата публікацыі" + +#: admin/options.php:135 admin/options.php:136 +msgid "Update Modified Date" +msgstr "" + +#: admin/options.php:137 +#, fuzzy, php-format +#| msgid "Email original Author when a Pending Revision is submitted" +msgid "Email original Author when a %s is submitted" +msgstr "Пісаць аўтару, калі версія рэдакцыі адпраўлена" + +#: admin/options.php:138 +#, fuzzy, php-format +#| msgid "Email the original Author when a Pending Revision is approved" +msgid "Email the original Author when a %s is approved" +msgstr "Пісаць аўтару, калі версія рэдакцыі зацверджана" + +#: admin/options.php:139 +#, fuzzy, php-format +#| msgid "Email the Revisor when a Pending Revision is approved" +msgid "Email the Revisor when a %s is approved" +msgstr "Email Рэвізор пры чаканні рэдакцыі зацверджаны" + +#: admin/options.php:140 +#, fuzzy, php-format +#| msgid "Email the original Author when a Scheduled Revision is published" +msgid "Email the original Author when a %s is published" +msgstr "Email аўтара арыгінальнай калі раскладу рэдакцыя публікуецца" + +#: admin/options.php:141 +#, fuzzy, php-format +#| msgid "Email the Revisor when a Scheduled Revision is published" +msgid "Email the Revisor when a %s is published" +msgstr "Email аўтара арыгінальнай калі раскладу публікуецца" + +#: admin/options.php:142 +#, fuzzy +#| msgid "Email Notification" +msgid "Enable notification buffer" +msgstr "Email апавяшчэнне" + +#: admin/options.php:143 +msgid "All custom post types available to Revisors" +msgstr "" + +#: admin/options.php:144 +msgid "Prevent Revisors from editing other user's drafts" +msgstr "" + +#: admin/options.php:145 +msgid "Display Hints" +msgstr "" + +#: admin/options.php:146 +msgid "Show Preview Links" +msgstr "" + +#: admin/options.php:147 +msgid "Preview Link Type" +msgstr "" + +#: admin/options.php:148 +msgid "Approve Button on Compare Revisions screen" +msgstr "" + +#: admin/options.php:149 +#, fuzzy +#| msgid "The revision was published." +msgid "Copy revision comments to published post" +msgstr "Рэдакцыя была апублікавана." + +#: admin/options.php:150 +msgid "Compare Past Revisions ordering:" +msgstr "" + +#: admin/options.php:151 +#, php-format +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" + +#: admin/options.php:152 +msgid "On Revision publication, delete Editorial Comments" +msgstr "" + +#: admin/options.php:158 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Pending Revision is submitted" +msgid "Email designated Publishers when a %s is submitted" +msgstr "Email, прызначаны выдавецтву, калі рэдакцыя ўяўляецца" + +#: admin/options.php:159 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Scheduled Revision is published" +msgid "Email designated Publishers when a %s is published" +msgstr "Email, прызначаны выдавецтву, калі запланаваная рэдакцыя публікуецца" + +#: admin/options.php:160 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Scheduled Revision is published" +msgid "Email designated Publishers when a %s is approved" +msgstr "Email, прызначаны выдавецтву, калі запланаваная рэдакцыя публікуецца" + +#: admin/options.php:162 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Pending Revision is submitted" +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" +"Адпраўляць email рэдактарам і адміністратарам, калі рэдакцыя адпраўляецца" + +#: admin/options.php:163 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Scheduled Revision is published" +msgid "Email Editors and Administrators when a %s is published" +msgstr "" +"Адпраўляць email рэдактарам і адміністратарам, калі запланаваная рэдакцыя " +"публікуецца" + +#: admin/options.php:164 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Scheduled Revision is published" +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" +"Адпраўляць email рэдактарам і адміністратарам, калі запланаваная рэдакцыя " +"публікуецца" + +#: admin/options.php:231 +#, fuzzy +#| msgid "Revisionary Site Options" +msgid "PublishPress Revisions Site Settings" +msgstr "Revisionary налады сайта" + +#: admin/options.php:261 +#, fuzzy +#| msgid "" +#| "These are the default settings for options which can be " +#| "adjusted per-blog." +msgid "" +"These are the default settings for options which can be " +"adjusted per-site." +msgstr "" +"Гэта defaultналады для опцый, якія могуць быць скарэктаваны " +"за блог." + +#: admin/options.php:299 +#, php-format +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" + +#: admin/options.php:300 +#, php-format +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress " +"Revisions settings. %s" +msgstr "" + +#: admin/options.php:302 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" + +#: admin/options.php:312 admin/options.php:314 +#, fuzzy, php-format +#| msgid "Note that %1$s site-wide options%2$s may also be available." +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "Запомніце, што %1$s налады %2$s таксама даступныя." + +#: admin/options.php:335 +msgid "License" +msgstr "" + +#: admin/options.php:385 +msgid "Enable revisions for these Post Types:" +msgstr "" + +#: admin/options.php:431 +#, fuzzy, php-format +msgid "%s capabilities" +msgstr "%s Магчымасці" + +#: admin/options.php:445 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" + +#: admin/options.php:459 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" + +#: admin/options.php:464 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" + +#: admin/options.php:479 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for Approval" +"\", \"Scheduled Revision\"" +msgstr "" + +#: admin/options.php:493 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" + +#: admin/options.php:498 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" + +#: admin/options.php:502 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" + +#: admin/options.php:512 +#, php-format +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" + +#: admin/options.php:534 +#, php-format +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" + +#: admin/options.php:540 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" + +#: admin/options.php:543 admin/options.php:567 +#, php-format +msgid "When a %s is published, update post publish date to current time." +msgstr "" + +#: admin/options.php:546 admin/options.php:570 +#, php-format +msgid "When a %s is published, update post modified date to current time." +msgstr "" + +#: admin/options.php:564 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" +"Калі ў наш час публікуецца паведамленне ці старонка рэдагуецца і будучым " +"усталяваць дату, змены не будуць ужывацца да абранай даты." + +#: admin/options.php:575 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" + +#: admin/options.php:579 +#, fuzzy +#| msgid "" +#| "Publish scheduled revisions asynchronously, via a secondary http request " +#| "from the server. This is normally preferable as it eliminates delay, but " +#| "some servers do not support it." +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" +"Апублікаваць запланаваныя змены ў асінхронным рэжыме, праз другі запыт HTTP " +"ад сервера. Гэта, як правіла, пераважней, бо ўхіляе затрымкі, але некаторыя " +"серверы не падтрымліваюць яго." + +#: admin/options.php:596 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" + +#: admin/options.php:599 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" + +#: admin/options.php:602 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" + +#: admin/options.php:611 +msgid "Regenerate \"post has revision\" flags" +msgstr "" + +#: admin/options.php:626 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators" +msgstr "" + +#: admin/options.php:638 +#, fuzzy +#| msgid "Published on:" +msgid "Published Post Slug" +msgstr "Апублікавана:" + +#: admin/options.php:638 +#, fuzzy +#| msgid "Revisions" +msgid "Revision Slug" +msgstr "Рэдакцыі" + +#: admin/options.php:638 +#, fuzzy +#| msgid "Revisionary" +msgid "Revision ID only" +msgstr "Revisionary" + +#: admin/options.php:649 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" + +#: admin/options.php:659 +msgid "If disabled, Compare screen links to Revision Preview for approval" +msgstr "" + +#: admin/options.php:681 +#, php-format +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" + +#: admin/options.php:691 +msgid "This may improve compatibility with some plugins." +msgstr "" + +#: admin/options.php:710 +msgid "Modification Date" +msgstr "" + +#: admin/options.php:720 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" + +#: admin/options.php:748 admin/options.php:769 +msgid "Never" +msgstr "Ніколі" + +#: admin/options.php:748 admin/options.php:769 +msgid "By default" +msgstr "Па змаўчанні" + +#: admin/options.php:748 admin/options.php:769 +msgid "Always" +msgstr "Заўсёды" + +#: admin/options.php:758 admin/options.php:804 +msgid "select recipients" +msgstr "абраць атрымальнікаў" + +#: admin/options.php:818 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" + +#: admin/options.php:839 +#, fuzzy +#| msgid "Email Notification" +msgid "Notification Buffer" +msgstr "Email апавяшчэнне" + +#: admin/options.php:867 +#, fuzzy +#| msgid "Email Notification" +msgid "Notification Log" +msgstr "Email апавяшчэнне" + +#: admin/options.php:896 +#, fuzzy +#| msgid "Email Notification" +msgid "Purge Notification Buffer" +msgstr "Email апавяшчэнне" + +#: admin/options.php:902 +#, fuzzy +#| msgid "Email Notification" +msgid "Truncate Notification Log" +msgstr "Email апавяшчэнне" + +#: admin/options.php:908 +#, php-format +msgid "Sent in last minute: %d / %d" +msgstr "" + +#: admin/options.php:909 +#, php-format +msgid "Sent in last hour: %d / %d" +msgstr "" + +#: admin/options.php:910 +#, php-format +msgid "Sent in last day: %d / %d" +msgstr "" + +#: admin/options.php:917 +#, php-format +msgid "Seconds until next buffer processing time: %d" +msgstr "" + +#: admin/options.php:926 +msgid "Show Notification Log / Buffer" +msgstr "" + +#: admin/options.php:928 +msgid "Show with message content" +msgstr "" + +#: admin/options.php:939 includes/CoreAdmin.php:89 +msgid "WPML Translation Management" +msgstr "" + +#: admin/options.php:946 +msgid "Sync \"Needs Update\" flags" +msgstr "" + +#: admin/options.php:950 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" + +#: admin/options.php:988 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" + +#: admin/options.php:998 +#, php-format +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "" + +#: admin/options.php:1034 +#, fuzzy, php-format +#| msgid "sitewide control of \"%s\"" +msgid "network-wide control of \"%s\"" +msgstr "па ўсім сайце кантроль \"%s\"" + +#: admin/options.php:1064 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" +"Усе налады ў гэтай форме (у тым ліку па абраных укладках) будзе Аднавіць " +"значэнні па змаўчанні. Вы ўпэўнены?" + +#: admin/post-edit_rvy.php:26 admin/post-edit_rvy.php:71 +#, fuzzy +#| msgid "Current Revision" +msgid "Current Time" +msgstr "Бягучая рэдакцыя" + +#: admin/post-editor-workflow-ui_rvy.php:32 +msgid "(on approval)" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:48 +#: admin/post-editor-workflow-ui_rvy.php:89 +#, fuzzy +#| msgid "Pending Revisions" +msgid "Preview this Revision" +msgstr "Pending Revisions" + +#: admin/post-editor-workflow-ui_rvy.php:50 +msgid "View / Publish" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:50 +msgid "View / Approve" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:53 +msgid "View / Approve saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "Preview / Submit" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Submit" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:56 +msgid "View / Submit saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:64 +msgid "View unsaved changes" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:68 +#, fuzzy, php-format +#| msgid "%1$s Revisions" +msgid "%s%s Revision Edit" +msgstr "%1$s рэдакцый" + +#: admin/post-editor-workflow-ui_rvy.php:80 +msgid "Revision Submission Error" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:101 +#, fuzzy +#| msgid "Revisions" +msgid "Approving the Revision..." +msgstr "Рэдакцыі" + +#: admin/post-editor-workflow-ui_rvy.php:128 rvy_init.php:299 rvy_init.php:317 +#: rvy_init.php:335 rvy_init.php:355 rvy_init.php:372 rvy_init.php:389 +#: rvy_init.php:493 +#, fuzzy +#| msgid "Revisions" +msgid "Update Revision" +msgstr "Рэдакцыі" + +#: admin/post-editor-workflow-ui_rvy.php:186 +#, fuzzy +#| msgid "%1$s Revisions" +msgid "Edit Revision" +msgstr "%1$s рэдакцый" + +#: admin/post-editor-workflow-ui_rvy.php:192 +#, php-format +msgid "Update post before creating %s." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:199 +#, fuzzy +#| msgid "Restore this Past Revision" +msgid "Error Creating Revision" +msgstr "Воостановлено з прошл. рэдакцыі" + +#: admin/post-editor-workflow-ui_rvy.php:201 +#: admin/post-editor-workflow-ui_rvy.php:221 +#, fuzzy +#| msgid "Update »" +msgid "Update" +msgstr "Абнавіць »" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#, php-format +msgid "For custom field changes, edit a scheduled %s." +msgstr "" + +#: admin/revision-action_rvy.php:404 admin/revision-action_rvy.php:489 +#, php-format +msgid "[%s] Revision Approval Notice" +msgstr "[%s] Рэдакцыя сцвярджэнні Апавяшчэнне" + +#: admin/revision-action_rvy.php:405 +#, fuzzy, php-format +#| msgid "A revision to your %1$s \"%2$s\" has been approved." +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "Перагляд вашага %1$s \"%2$s\" быў ухвалены." + +#: admin/revision-action_rvy.php:408 +#, php-format +msgid "The submitter was %1$s." +msgstr "Адпраўнік быў %1$s." + +#: admin/revision-action_rvy.php:412 admin/revision-action_rvy.php:494 +#, php-format +msgid "It will be published on %s" +msgstr "Гэта было апублікавана %s" + +#: admin/revision-action_rvy.php:416 admin/revision-action_rvy.php:498 +#, fuzzy +#| msgid "Review it here: " +msgid "Preview it here: " +msgstr "Глядзець гэта тут:" + +#: admin/revision-action_rvy.php:419 admin/revision-action_rvy.php:501 +msgid "Editor: " +msgstr "" + +#: admin/revision-action_rvy.php:421 admin/revision-action_rvy.php:503 +#: admin/revision-action_rvy.php:1276 admin/revision-action_rvy.php:1301 +#: admin/revision-action_rvy.php:1363 +msgid "View it online: " +msgstr "Глядзець гэта анлайн:" + +#: admin/revision-action_rvy.php:490 +#, php-format +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "Рэвізіі, якую вы, прадстаўленую на %1$s \"%2$s\", была ўхвалена." + +#: admin/revision-action_rvy.php:1272 admin/revision-action_rvy.php:1294 +#, fuzzy, php-format +#| msgid "[%s] Scheduled Revision Publication Notice" +msgid "[%s] %s Publication Notice" +msgstr "[%s] Запланаваныя Апавяшчэнне публікацыі Рэдакцыя" + +#: admin/revision-action_rvy.php:1273 +#, php-format +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "" +"Запланаваны перагляд вы, прадстаўленых на %1$s \"%2$s\" быў апублікаваны." + +#: admin/revision-action_rvy.php:1295 +#, fuzzy, php-format +#| msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "Запланаваны перагляд вашага%1$s \"%2$s\" быў апублікаваны." + +#: admin/revision-action_rvy.php:1298 admin/revision-action_rvy.php:1360 +#, php-format +msgid "It was submitted by %1$s." +msgstr "Было адпраўлена %1$s." + +#: admin/revision-action_rvy.php:1355 +#, fuzzy, php-format +#| msgid "[%s] Scheduled Revision Publication" +msgid "[%s] %s Publication" +msgstr "[%s]Запланаваныя публікацыі Рэдакцыя" + +#: admin/revision-action_rvy.php:1357 +#, fuzzy, php-format +#| msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +msgstr "Запланаваны перагляд %1$s \"%2$s\" быў апублікаваны." + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "" + +#: admin/revision-queue_rvy.php:14 +#, php-format +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "" + +#: admin/revision-queue_rvy.php:46 +#, fuzzy, php-format +#| msgid "%s revision was deleted" +msgid "%s revision submitted." +msgstr "%s версія была выдалена." + +#: admin/revision-queue_rvy.php:47 +#, fuzzy, php-format +#| msgid "The revision was published." +msgid "%s revision declined." +msgstr "Рэдакцыя была апублікавана." + +#: admin/revision-queue_rvy.php:48 +#, fuzzy, php-format +#| msgid "%s revision was deleted" +msgid "%s revision approved." +msgstr "%s версія была выдалена." + +#: admin/revision-queue_rvy.php:49 +#, fuzzy, php-format +#| msgid "The revision was unscheduled." +msgid "%s revision unscheduled." +msgstr "Рэдакцыя была знята з планавання." + +#: admin/revision-queue_rvy.php:50 +#, fuzzy, php-format +#| msgid "The revision was published." +msgid "%s revision published." +msgstr "Рэдакцыя была апублікавана." + +#: admin/revision-queue_rvy.php:51 +#, fuzzy, php-format +#| msgid "%s revision was deleted" +msgid "%s revision permanently deleted." +msgstr "%s версія была выдалена." + +#: admin/revision-queue_rvy.php:93 +#, fuzzy, php-format +#| msgid "%1$s Revisions" +msgid "%s: " +msgstr "%1$s запытаў у %2$s секунд. %3$s MB выкарыстоўваецца." + +#: admin/revision-queue_rvy.php:106 +#, fuzzy, php-format +msgid "of %s" +msgstr "%1$s запытаў у %2$s секунд. %3$s MB выкарыстоўваецца." + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +#, php-format +msgid "%sPost Author: %s" +msgstr "" + +#: admin/revision-queue_rvy.php:121 +#, fuzzy, php-format +#| msgid "Revisions" +msgid "Revision Queue for \"%s\"%s" +msgstr "Рэдакцыі" + +#: admin/revision-queue_rvy.php:123 +#, fuzzy, php-format +#| msgid "Revisions" +msgid "Revision Queue %s" +msgstr "Рэдакцыі" + +#: admin/revision-queue_rvy.php:129 +#, fuzzy, php-format +#| msgid "%1$s Revisions for “%2$s”" +msgid "Search results for \"%s\"" +msgstr "%1$s Рэдакцыя для “%2$s”" + +#: admin/revision-queue_rvy.php:157 +msgid "Undo" +msgstr "" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "" + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "" + +#: admin/revision-ui_rvy.php:73 +msgid "j F, Y @ g:i a" +msgstr "" + +#: admin/revision-ui_rvy.php:92 +#, php-format +msgid "%1$s (Current)" +msgstr "" + +#: admin/revision-ui_rvy.php:96 +#, php-format +msgid "%1$s (Autosave)" +msgstr "" + +#: admin/revision-ui_rvy.php:102 +msgid "j F, Y, g:i a" +msgstr "" + +#: admin/revision-ui_rvy.php:106 +#, php-format +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" + +#: admin/revision-ui_rvy.php:108 +#, fuzzy, php-format +#| msgid "%1$s Revisions (%2$s)" +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "%1$s Рэдакцыі (%2$s)" + +#: admin/revision-ui_rvy.php:260 +#, fuzzy, php-format +#| msgid "Revision of “%1$s”" +msgid "Preview “%s”" +msgstr "Рэдакцыя “%1$s”" + +#: admin/revision-ui_rvy.php:276 +msgid "The revision will be deleted. Are you sure?" +msgstr "Рэдакцыя будзе выдалена. Вы ўпэўнены?" + +#: admin/revision-ui_rvy.php:332 +#, php-format +msgid "%1$s by %2$s" +msgstr "" + +#: admin/revision-ui_rvy.php:369 +msgid "Modified Date" +msgstr "" + +#: admin/revision-ui_rvy.php:373 +msgid "Actions" +msgstr "Дзеянні" + +#: admin/revision-ui_rvy.php:390 +msgid "Bulk Actions" +msgstr "Масавыя дзеянні" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "Не прызначана версія" + +#: admin/revisions.php:56 +msgid "Past" +msgstr "Уставіць" + +#: admin/revisions.php:118 +#, fuzzy, php-format +#| msgid "Revisions" +msgid "Revisions of %s" +msgstr "Рэдакцыі" + +#: admin/revisions.php:144 +msgid "The requested revision does not exist." +msgstr "З просьбай пра перагляд не існуе." + +#: admin/revisions.php:214 +#, fuzzy +#| msgid "%1$s Revisions" +msgid "Past Revisions" +msgstr "%1$s рэдакцый" + +#: admin/revisions.php:227 +#, php-format +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "" + +#: admin/revisions.php:247 +#, php-format +msgid "no %s revisions available." +msgstr "не %s даступных рэдакцый." + +#: front_rvy.php:262 +#, fuzzy, php-format +#| msgid "Revisions" +msgid "%sView Queue%s" +msgstr "Рэдакцыі" + +#: front_rvy.php:271 +#, fuzzy, php-format +#| msgid "It will be published on %s" +msgid "%sCompare%s%sView Published Post%s" +msgstr "Гэта было апублікавана %s" + +#: front_rvy.php:285 +#, fuzzy, php-format +#| msgid "It will be published on %s" +msgid "%sView Published Post%s" +msgstr "Гэта было апублікавана %s" + +#: front_rvy.php:348 front_rvy.php:368 front_rvy.php:378 +#, fuzzy +#| msgid "Publish now." +msgid "Publish now" +msgstr "Публікаваць цяпер" + +#: front_rvy.php:352 front_rvy.php:370 +#, php-format +msgid "This is a %s. %s %s %s" +msgstr "" + +#: front_rvy.php:364 +#, fuzzy, php-format +#| msgid "(already scheduled for publication on %s)" +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "(ужо запланаваны да публікацыі на %s)" + +#: front_rvy.php:379 +#, fuzzy, php-format +#| msgid "(already scheduled for publication on %s)" +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "(ужо запланаваны да публікацыі на %s)" + +#: front_rvy.php:391 +#, fuzzy, php-format +#| msgid "Current Revision" +msgid "This is the Current Revision. %s" +msgstr "Бягучая рэдакцыя" + +#: front_rvy.php:397 +#, fuzzy +#| msgid "Restore Now" +msgid "Restore" +msgstr "аднаўленне" + +#: front_rvy.php:398 +#, php-format +msgid "This is a Past Revision (from %s). %s %s" +msgstr "" + +#: includes/CoreAdmin.php:74 +#, fuzzy +#| msgid "About Revisionary" +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "О Revisionary" + +#: includes/CoreAdmin.php:79 +msgid "Enhance the power of PublishPress Revisions with the Pro version:" +msgstr "" + +#: includes/CoreAdmin.php:82 +msgid "Elementor integration" +msgstr "" + +#: includes/CoreAdmin.php:83 +msgid "Divi Builder integration" +msgstr "" + +#: includes/CoreAdmin.php:84 +msgid "Beaver Builder integration" +msgstr "" + +#: includes/CoreAdmin.php:85 +msgid "WooCommerce: Product Variation revisions" +msgstr "" + +#: includes/CoreAdmin.php:86 +#, fuzzy +#| msgid "Strip html tags out of difference display" +msgid "ACF custom field revision, difference display" +msgstr "Выдаляе HTML-тэгі з розніцы адлюстравання" + +#: includes/CoreAdmin.php:87 +#, fuzzy +#| msgid "Revisions" +msgid "Pods custom field revision" +msgstr "Рэдакцыі" + +#: includes/CoreAdmin.php:88 +#, fuzzy +#| msgid "%1$s Revisions" +msgid "WPML: translate revisions" +msgstr "%1$s рэдакцый" + +#: includes/CoreAdmin.php:99 +#, fuzzy +#| msgid "Publish this Pending Revision now." +msgid "Need PublishPress Revisions Support?" +msgstr "Да публікацыі гэтага Рэдакцыя цяпер." + +#: includes/CoreAdmin.php:104 +msgid "If you need help or have a new feature request, let us know." +msgstr "" + +#: includes/CoreAdmin.php:106 +#, fuzzy +msgid "Request Support" +msgstr "Запытаная дата публікацыі: %1$s" + +#: includes/CoreAdmin.php:115 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" + +#: includes/CoreAdmin.php:117 +msgid "View Knowledge Base" +msgstr "" + +#: lib/debug.php:110 +#, php-format +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "%1$s запытаў у %2$s секунд. %3$s MB выкарыстоўваецца." + +#: revision-creation_rvy.php:172 +msgid "Could not insert revision into the database" +msgstr "" + +#: revision-workflow_rvy.php:157 +#, php-format +msgid "[%s] %s Updated" +msgstr "" + +#: revision-workflow_rvy.php:159 +#, php-format +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "" + +#: revision-workflow_rvy.php:161 +#, fuzzy, php-format +msgid "[%s] %s" +msgstr "" +"Запланаваны перагляд вы, прадстаўленых на %1$s \"%2$s\" быў апублікаваны." + +#: revision-workflow_rvy.php:163 +#, php-format +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "" + +#: revision-workflow_rvy.php:174 +#, fuzzy +#| msgid "Revisions" +msgid "Revision Queue: " +msgstr "Рэдакцыі" + +#: revision-workflow_rvy.php:176 +#, fuzzy, php-format +#| msgid "%1$s Revisions" +msgid "Edit %s: " +msgstr "%1$s рэдакцый" + +#: revisionary.php:85 +msgid "This plugin can be deleted." +msgstr "" + +#: revisionary.php:103 revisionary.php:189 +#, fuzzy, php-format +#| msgid "" +#| "Another copy of Revisionary is already activated (version %1$s in \"%2$s" +#| "\")" +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s: \"%2$s\")" +msgstr "Іншая копія Revisionary ужо актывавана (версія %1$s in \"%2$s\")" + +#: revisionary.php:105 revisionary.php:191 +#, fuzzy, php-format +#| msgid "" +#| "Another copy of Revisionary is already activated (version %1$s in \"%2$s" +#| "\")" +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s)" +msgstr "Іншая копія Revisionary ужо актывавана (версія %1$s in \"%2$s\")" + +#: revisionary.php:210 +#, php-format +msgid "PublishPress Revisions requires PHP version %s or higher." +msgstr "" + +#: revisionary.php:217 +#, php-format +msgid "PublishPress Revisions requires WordPress version %s or higher." +msgstr "" + +#: rvy_init.php:127 +msgid "Every 2 Minutes" +msgstr "" + +#: rvy_init.php:289 rvy_init.php:301 +msgid "Working Copy" +msgstr "" + +#: rvy_init.php:290 +msgid "Create Working Copy" +msgstr "" + +#: rvy_init.php:292 +msgid "Creating Working Copy..." +msgstr "" + +#: rvy_init.php:293 +msgid "Working Copy ready" +msgstr "" + +#: rvy_init.php:294 rvy_init.php:312 +msgid "Approve Changes" +msgstr "" + +#: rvy_init.php:296 rvy_init.php:314 +msgid "Approving Changes..." +msgstr "" + +#: rvy_init.php:297 rvy_init.php:315 rvy_init.php:333 +#, fuzzy +#| msgid "Publish Date" +msgid "Publish Changes" +msgstr "Дата публікацыі" + +#: rvy_init.php:298 rvy_init.php:316 rvy_init.php:334 rvy_init.php:354 +#: rvy_init.php:371 rvy_init.php:388 +#, fuzzy +#| msgid "Revisions" +msgid "Save Revision" +msgstr "Рэдакцыі" + +#: rvy_init.php:300 +msgid "Working Copies" +msgstr "" + +#: rvy_init.php:307 rvy_init.php:319 +msgid "Change Request" +msgstr "" + +#: rvy_init.php:308 +msgid "Submit Change Request" +msgstr "" + +#: rvy_init.php:310 +#, fuzzy +#| msgid "Publish Date" +msgid "Submitting Changes..." +msgstr "Дата публікацыі" + +#: rvy_init.php:311 +#, fuzzy +msgid "Changes Submitted" +msgstr "Пісаць аўтару, калі версія рэдакцыі адпраўлена" + +#: rvy_init.php:318 +msgid "Change Requests" +msgstr "" + +#: rvy_init.php:321 +msgid "Enable Change Requests" +msgstr "" + +#: rvy_init.php:326 rvy_init.php:337 +#, fuzzy +#| msgid "Schedule Now" +msgid "Scheduled Change" +msgstr "Запланаваць цяпер" + +#: rvy_init.php:327 rvy_init.php:328 rvy_init.php:331 rvy_init.php:332 +#, fuzzy +#| msgid "Schedule Now" +msgid "Schedule Changes" +msgstr "Запланаваць цяпер" + +#: rvy_init.php:329 +#, fuzzy +#| msgid "Schedule Now" +msgid "Scheduling Changes..." +msgstr "Запланаваць цяпер" + +#: rvy_init.php:330 +msgid "Changes are Scheduled." +msgstr "" + +#: rvy_init.php:336 +#, fuzzy +#| msgid "Scheduled Revisions" +msgid "Scheduled Changes" +msgstr "Запланаваныя рэдакцыі" + +#: rvy_init.php:346 +#, fuzzy +#| msgid "Revisions" +msgid "Unsubmitted Revision" +msgstr "Рэдакцыі" + +#: rvy_init.php:347 rvy_init.php:348 +#, fuzzy +#| msgid "Revisions" +msgid "New Revision" +msgstr "Рэдакцыі" + +#: rvy_init.php:349 +#, fuzzy +#| msgid "Restore this Past Revision" +msgid "Creating Revision..." +msgstr "Воостановлено з прошл. рэдакцыі" + +#: rvy_init.php:350 +#, fuzzy +#| msgid "The revision was updated." +msgid "The Revision is ready to edit." +msgstr "Версія была обнавлена." + +#: rvy_init.php:350 +#, fuzzy +#| msgid "The revision was updated." +msgid "Revision ready to edit." +msgstr "Версія была обнавлена." + +#: rvy_init.php:351 rvy_init.php:368 rvy_init.php:385 +#, fuzzy +#| msgid "Revisions" +msgid "Approve Revision" +msgstr "Рэдакцыі" + +#: rvy_init.php:353 rvy_init.php:370 rvy_init.php:387 +#, fuzzy +#| msgid "%1$s Revisions" +msgid "Publish Revision" +msgstr "%1$s рэдакцый" + +#: rvy_init.php:356 +#, fuzzy +#| msgid "%1$s Revisions" +msgid "Unsubmitted Revisions" +msgstr "%1$s рэдакцый" + +#: rvy_init.php:357 +#, fuzzy +msgid "Not Submitted" +msgstr "Пісаць аўтару, калі версія рэдакцыі адпраўлена" + +#: rvy_init.php:363 +#, fuzzy +#| msgid "Revisions" +msgid "Submitted Revision" +msgstr "Рэдакцыі" + +#: rvy_init.php:364 rvy_init.php:496 +#, fuzzy +#| msgid "Revisions" +msgid "Submit Revision" +msgstr "Рэдакцыі" + +#: rvy_init.php:366 +msgid "Submitting Revision..." +msgstr "" + +#: rvy_init.php:367 +#, fuzzy +#| msgid "%s revision was deleted" +msgid "The Revision is Submitted" +msgstr "Рэвізіі, якую вы, прадстаўленую на %1$s \"%2$s\", была ўхвалена." + +#: rvy_init.php:367 +#, fuzzy +#| msgid "%s revision was deleted" +msgid "Revision Submitted" +msgstr "Рэвізіі, якую вы, прадстаўленую на %1$s \"%2$s\", была ўхвалена." + +#: rvy_init.php:373 +#, fuzzy +#| msgid "Revisions" +msgid "Submitted Revisions" +msgstr "Рэдакцыі" + +#: rvy_init.php:374 +#, fuzzy +msgid "Submitted" +msgstr "Пісаць аўтару, калі версія рэдакцыі адпраўлена" + +#: rvy_init.php:380 +#, fuzzy +#| msgid "Scheduled Revision Created" +msgid "Scheduled Revision" +msgstr "Ваша мадыфікацыя была захавана ў планоўшчыку версій." + +#: rvy_init.php:381 rvy_init.php:382 +#, fuzzy +#| msgid "Scheduled Revision Created" +msgid "Schedule Revision" +msgstr "Планавальная версія створана." + +#: rvy_init.php:383 +#, fuzzy +#| msgid "Schedule this Pending Revision" +msgid "Scheduling Revision..." +msgstr "Расклад чакае праверкі" + +#: rvy_init.php:384 +#, fuzzy +#| msgid "The revision was unscheduled." +msgid "The Revision is Scheduled" +msgstr "Рэдакцыя была знята з планавання." + +#: rvy_init.php:384 +#, fuzzy +#| msgid "The revision was unscheduled." +msgid "Revision Scheduled" +msgstr "Рэдакцыя была знята з планавання." + +#: rvy_init.php:390 +#, fuzzy +#| msgid "Scheduled Revision Created" +msgid "Scheduled Revisions" +msgstr "Запланаваныя рэдакцыі" + +#: rvy_init.php:391 +#, fuzzy +#| msgid "Schedule Now" +msgid "Scheduled" +msgstr "Рэдакцыя была запланавана для публікацыі." + +#: rvy_init.php:489 +msgid "Revised By" +msgstr "" + +#: rvy_init.php:490 +#, fuzzy +#| msgid "The revision was updated." +msgid "Revision Date" +msgstr "Версія была обнавлена." + +#: rvy_init.php:491 +msgid "Post Author" +msgstr "" + +#: rvy_init.php:492 +#, fuzzy +#| msgid "Published on:" +msgid "Published Post" +msgstr "Апублікавана:" + +#: rvy_init.php:497 +msgid "Submit Changes" +msgstr "" + +#: rvy_init.php:690 rvy_init.php:702 +msgid "Revisor" +msgstr "Рэвізор" + +#: rvy_init.php:1129 +#, fuzzy +#| msgid "Revisionary" +msgid "Revision Workflow" +msgstr "Revisionary" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:212 +msgid "" +"This plugin is outdated. You already have a more recent version installed. " +"Please remove this version." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:243 +#, php-format +msgid "" +"This plugin is not installed in the standard folder. The current path is %s " +"but it is expected to be %s." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:269 +#, php-format +msgid "" +"You have activated multiple instances of %s. Please keep only one activated " +"and remove the others." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:289 +#, php-format +msgid "Please deactivate %s when %s is activated." +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:332 +#, php-format +msgid "" +"Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +"been useful. Please could you quickly leave a 5-star rating on WordPress." +"org? It really does help to keep %1$s growing." +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:342 +msgid "1 week" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:350 +msgid "1 month" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:361 +msgid "3 months" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:615 +#, php-format +msgid "Click here to add your rating for %s" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:621 +msgid "Maybe later" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:626 +msgid "I already did" +msgstr "" + +#: vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php:129 +msgid "Amazing! We are redirecting you to our site..." +msgstr "" + +#, fuzzy +#~| msgid "Publish this Pending Revision now." +#~ msgid "PublishPress Revisions Documentation" +#~ msgstr "Да публікацыі гэтага Рэдакцыя цяпер." + +#, fuzzy +#~| msgid "Schedule Now" +#~ msgid "Save Changes" +#~ msgstr "Захаваць налады" + +#~ msgid "Revert to Defaults" +#~ msgstr "Вярнуць да пачатковых" + +#~ msgid "Apply" +#~ msgstr "Ужыць" + +#, fuzzy, php-format +#~| msgid "%1$s Revisions (%2$s)" +#~ msgid "%1$s (%2$s)" +#~ msgstr "%1$s Рэдакцыі (%2$s)" + +#~ msgid "Email Notification" +#~ msgstr "Email апавяшчэнне" + +#, fuzzy, php-format +#~| msgid "A pending revision to the %1$s \"%2$s\" has been submitted." +#~ msgid "A %s to the %1$s \"%2$s\" has been updated." +#~ msgstr "Якая чакае версія на %1$s \"%2$s\" была адпраўлена." + +#, fuzzy, php-format +#~| msgid "A pending revision to the %1$s \"%2$s\" has been submitted." +#~ msgid "A %s to the %1$s \"%2$s\" has been submitted." +#~ msgstr "Якая чакае версія на %1$s \"%2$s\" была адпраўлена." + +#, fuzzy, php-format +#~| msgid "Revisions" +#~ msgid "%sMy Revisions%s (%s)" +#~ msgstr "Рэдакцыі" + +#, fuzzy +#~| msgid "Privately Published:" +#~ msgid "Preview / Publish" +#~ msgstr "Прыватна апублікавана:" + +#, fuzzy +#~ msgid "view" +#~ msgstr "Глядзець гэта ў мэнэджару версій" + +#, fuzzy, php-format +#~| msgid "Scheduled Revisions" +#~ msgid "%sScheduled Changes: %s" +#~ msgstr "Запланаваныя рэдакцыі" + +#, php-format +#~ msgid "This Revision was Published on %s" +#~ msgstr "Гэты перагляд быў апублікаваны %s" + +#, php-format +#~ msgid "(dated %s)" +#~ msgstr "(датуецца %s)" + +#, php-format +#~ msgid "" +#~ "Revisionary is not compatible with Role Scoper versions prior to %1$s. " +#~ "Please upgrade or deactivate %2$s Role Scoper%3$s." +#~ msgstr "" +#~ "Revisionary не сумяшчальны з версіямі ролі Scoper да%1$s. Абнавіце ці " +#~ "дэактывуйце %2$s Role Scoper%3$s." + +#~ msgid "unselfish, benevolent love, born of the Spirit." +#~ msgstr "бескарыслівая, добразычлівая каханні, народжаным ад Духу." + +#~ msgid "" +#~ "Agapé discerns needs and meets them unselfishly and effectively." +#~ msgstr "" +#~ "Agape выяўляе запатрабаванні і задавальняе іх бескарысліва і эфектыўна." + +#, php-format +#~ msgid "" +#~ "This WordPress plugin is part of my agapé try, a lifelong effort " +#~ "to love God and love people by rightly using the time and abilities He " +#~ "has leant me. As a husband, father, engineer, farmer and/or software " +#~ "developer, I have found this stewardship effort to be often fraught with " +#~ "contradiction. A wise and sustainable balancing of roles has seemed to " +#~ "elude me. Yet I want to keep trying, trusting that if God blesses and " +#~ "multiplies the effort, it will become agapetry, a creative arrangement " +#~ "motivated by benevolent love. A fleeting childlike sketch of the " +#~ "beautiful %1$s chain-breaking agapé%2$s which %3$s Jesus Christ " +#~ "unleashed%4$s so %5$s freely%6$s and aptly on an enslaving, enslaved " +#~ "world." +#~ msgstr "" +#~ "Гэта ўбудова WordPress, гэта частка маёй агапе паспрабаваць, на працягу " +#~ "ўсяго жыцця высілкаў кахаць Бога і кахаць людзей па праве выкарыстання " +#~ "часу і здольнасцяў ён нахіліўся мяне. Як муж, бацька, інжынерам, фермерам " +#~ "і / ці распрацоўніка праграмнага забеспячэння, я знайшоў гэта кіраўніцтва " +#~ "высілкамі, часцяком багатая супярэчнасці. Разумнага і ўстойлівага " +#~ "збалансавання роляў здалося выслізгваць ад мяне. Але я жадаю, каб " +#~ "імкнуцца, мяркуючы, што калі Бог багаслаўляе і памнажае высілкі, яна " +#~ "стане agapetry, творчая кампазіцыя матываваныя добразычлівыя каханні. " +#~ "Мімалётны накід па-дзіцячаму прыгожая%1$s chain-breaking agapé%2$s " +#~ "which %3$s Jesus Christ unleashed%4$s so %5$s freely%6$s and aptly on an " +#~ "enslaving, enslaved world." + +#, php-format +#~ msgid "" +#~ "Although Role Scoper and Revisionary development was a maniacal hermit-" +#~ "like effort, it was only possible because of the clean and flexible %1$s " +#~ "WordPress code base%2$s. My PHP programming skills grew immensely by the " +#~ "good examples set forth there and in plugins such as %3$s NextGen Gallery" +#~ "%4$s. I'm not done learning, and look forward to some real-time " +#~ "cooperation with these and other developers now that my all-consuming " +#~ "quest has reached a stable plateau." +#~ msgstr "" +#~ "Хоць роля Scoper і Revisionary развіцці маніякальна-пустэльнікаў, як " +#~ "высілкі, можна было толькі з-за чыстай і гнуткай %1$s WordPress code base" +#~ "%2$s. My PHP programming skills grew immensely by the good examples set " +#~ "forth there and in plugins such as %3$s NextGen Gallery%4$s. I'm not done " +#~ "learning, and look forward to some real-time cooperation with these and " +#~ "other developers now that my all-consuming quest has reached a stable " +#~ "plateau." + +#, php-format +#~ msgid "" +#~ "Thanks to %1$sAlberto Ramicciotti%2$s for the Italian translation. I do " +#~ "try to be translator-friendly, but any untranslated captions are due to " +#~ "my flurry of recent additions and changes, and will no doubt be updated " +#~ "soon. Now there must be someone else who wants Revisionary in their " +#~ "language..." +#~ msgstr "" +#~ "Дзякуй %1$sAlberto Ramicciotti%2$s на італьянскі пераклад. Я імкнуся быць " +#~ "перакладнікам зразумелы, але любы неперакладзеныя подпісах з-за майго " +#~ "шквал апошніх даданняў і змен, і, несумнеўна, будзе абноўлена хуткім " +#~ "часам. Зараз павінна быць кімсьці яшчэ, хто жадае Revisionary на іх " +#~ "роднай мове ..." + +#, php-format +#~ msgid "" +#~ "Revisionary is open source software released under the %1$s General " +#~ "Public License (GPL)%2$s. Due to limitations, obligations and non-" +#~ "technical aspirations common to most human beings, I will probably never " +#~ "again pursue uncommissioned plugin development on the scale these plugins " +#~ "has required. However, I do plan to provide some free support, correct " +#~ "bugs which emerge and revise the plugin for future WordPress versions. If " +#~ "it adds value to your website or saves you time and money, you can " +#~ "express appreciation in several ways:" +#~ msgstr "" +#~ "Revisionary гэта адкрытае праграмнае забеспячэнне, якое распаўсюджваецца " +#~ "па %1$s General Public License (GPL)%2$s. З-за абмежаванняў, абавязанняў " +#~ "і нетехнических памкненняў, характэрных для большасці чалавечай істоты, " +#~ "я, напэўна, ніколі больш не праводзіць, даручэнні распрацоўкі ўбудоў на " +#~ "маштаб гэтых убудоў патрабуецца. Аднак, я планую забяспечыць вольнае " +#~ "падтрымку, правільныя памылкі, якія ўзнікаюць і перагледзець убудову для " +#~ "будучых версіях WordPress. Калі гэта павялічвае каштоўнасць вашага сайта " +#~ "ці эканоміць Ваш час і грошы, вы можаце выказаць удзячнасць некалькімі " +#~ "спосабамі:" + +#, php-format +#~ msgid "%1$s Submit technical feedback%2$s, including improvement requests." +#~ msgstr "" +#~ "%1$s Тэхнічная зваротная сувязі %2$s, у тым ліку просьбы пра паляпшэнні." + +#, php-format +#~ msgid "" +#~ "%1$s Submit a case study%2$s, explaining how these plugins help you do " +#~ "something excellent and praiseworthy." +#~ msgstr "" +#~ "%1$s Submit a case study%2$s, растлумачыўшы, якім чынам гэтыя ўбудовы " +#~ "дапамогуць вам зрабіць нешта выдатнае і пахвальна." + +#, php-format +#~ msgid "" +#~ "%1$s Localize Revisionary or Role Scoper%2$s to your own language %3$s " +#~ "using poEdit%4$s " +#~ msgstr "" +#~ "%1$s дял лакалізацыі Revisionary ці Role Scoper%2$sна ваша мова %3$s " +#~ "выкарыстоўвайце poEdit%4$s " + +#, php-format +#~ msgid "If the plugin has seriously broadened your CMS horizons, %s" +#~ msgstr "Калі ўбудова мае сур'ёзныя пашырана сістэма кіравання гарызонтаў,%s" + +#, php-format +#~ msgid "" +#~ "If you are an established web developer, %1$s grant me your professional " +#~ "opinion%2$s on how this work stacks up. Might the skills, work ethic and " +#~ "values I express here fit into a development team near you?" +#~ msgstr "" +#~ "Калі Вы вэб-распрацоўнік,%1$s дайце мне ваша меркаванне як адмыслоўца%2$s " +#~ "пра тое, як гэта праца стэкі ўгару. Ці можа навыкі, працоўная этыка і " +#~ "каштоўнасці, я жадаў бы выказаць тут упісваецца ў каманду распрацоўнікаў " +#~ "побач з вамі?" + +#~ msgid "" +#~ "Hire or refer my services to design, redesign or enhance your site - " +#~ "quality care at reasonable rates." +#~ msgstr "" +#~ "Арэнду ці перадаць свае паслугі для праектавання, рэдызайну ці " +#~ "пашырэнні вашага сайта - якасць абслугоўвання па ўмераных коштах." + +#~ msgid "Pending Post" +#~ msgstr "Разгляданы пост" + +#~ msgid "Pending Page" +#~ msgstr "Разгляданая старонка" + +#, php-format +#~ msgid "%1$s Revisionary Support Forum%2$s" +#~ msgstr "%1$s форум падтрымкі Revisionary%2$s" + +#, php-format +#~ msgid "%1$s About Revisionary%2$s" +#~ msgstr "%1$s О Revisionary%2$s" + +#~ msgid "Revisionary Option Defaults" +#~ msgstr "Змаўчанні Revisionary" + +#~ msgid "Return to Edit Pages" +#~ msgstr "Вярнуцца да рэдагавання старонак" + +#~ msgid "" +#~ "Your modification has been saved for editorial review. If approved, it " +#~ "will be published on the date you specified." +#~ msgstr "" +#~ "Вашы змены былі захаваны для рэдакцыйнага агляду. У выпадку сцвярджэння, " +#~ "ён будзе апублікаваны ў дзень, паказаны Вамі." + +#~ msgid "Your modification has been saved for editorial review." +#~ msgstr "Вашы змены былі захаваны для рэдакцыйнага агляду. " + +#~ msgid "" +#~ "Go back to Submit Another revision (possibly for a different publish " +#~ "date)." +#~ msgstr "" +#~ "Вярнуцца Адправіць Іншая версія (магчыма, з іншай датай публікацыі)." + +#~ msgid "" +#~ "Sorry, an error occurred while attempting to save your modification for " +#~ "editorial review!" +#~ msgstr "" +#~ "Выбачыце, адбылася памылка пры спробе захаваць змены рэдакцыйнага агляду!" + +#~ msgid "page" +#~ msgstr "старонка" + +#~ msgid "post" +#~ msgstr "пост" + +#, php-format +#~ msgid "[%s] Pending Revision Notification" +#~ msgstr "[%s] Pending Revision Апавяшчэнне" + +#~ msgid "Pending Revision Created" +#~ msgstr "Якая чакае версія створана" + +#~ msgid "Your modification was saved as a Scheduled Revision." +#~ msgstr "Ваша мадыфікацыя была захавана ў планоўшчыку версій." + +#~ msgid "Go back to Schedule Another revision." +#~ msgstr "Вярнуцца ў спіс іншых версій." + +#~ msgid "Enter additional User Names or IDs (comma-separate)" +#~ msgstr "" +#~ "Увядзіце дадатковыя імёны карыстачоў ці ідэнтыфікатары (адлучаныя коскі)" + +#, php-format +#~ msgid "current users (%d):" +#~ msgstr "бягучыя карыстачы (%d):" + +#, php-format +#~ msgid "eligible users (%d):" +#~ msgstr "правы карыстачоў (%d):" + +#~ msgid "Publishers to Notify of Your Revision" +#~ msgstr "Выдаўцы будуць апавешчаны пра вашу рэдакцыю" + +#~ msgid "Asynchronous Email Processing" +#~ msgstr "Асінхронны email працэс" + +#~ msgid "Revisionary Default Blog Options" +#~ msgstr "Revisionary стандартныя налады блога" + +#~ msgid "Revisionary Blog Options" +#~ msgstr "Revisionary налады блога" + +#~ msgid "These settings will be applied to all blogs." +#~ msgstr "Налады будуць ужыты да ўсіх блогаў" + +#~ msgid "" +#~ "This page enables optional adjustment of Revisionary's " +#~ "features. For most installations, the default settings are fine." +#~ msgstr "" +#~ "Гэта старонка ўключае <апцыянальна>optional карэктоўку функцый " +#~ "Revisionary. Для большасці ўсталёўкі, налады па змаўчанні ў норме." + +#, php-format +#~ msgid "Note that %1$s blog-specific options%2$s may also be available." +#~ msgstr "Запомніце, што %1$s налады %2$s таксама даступныя." + +#~ msgid "" +#~ "Enable some users to submit a revision for an existing published post or " +#~ "page which they cannot otherwise edit. Contributors can submit revisions " +#~ "to their own published content, and users who have the edit_others_ " +#~ "capability (but not edit_published_) can submit revisions to other user's " +#~ "content.

    These Pending Revisions are listed alongside regular " +#~ "pending content, but link to a Revisions management form. There the " +#~ "pending revision can be viewed, compared to other revisions, and approved " +#~ "or deleted by qualified editors. If the submitter set a future publish " +#~ "date, approval schedules delayed publication of the revised content." +#~ msgstr "" +#~ "Уключыць некаторым карыстачам прадставіць перагледжаны варыянт для існых " +#~ "апублікаваў пост ці старонка, на якой яны не могуць інакш кіраваць. " +#~ "Аўтары могуць прадставіць змены ў свае апублікаваныя ўтрыманні, і " +#~ "карыстачоў, якія edit_others_ магчымасць (але не edit_published_) можа " +#~ "прадставіць прапановы пра змены да ўтрымання іншых карыстачоў.

    Гэтыя Да Змены адлюстроўваюцца ў спісе рэгулярных да ўтрымання, але " +#~ "спасылка на форму кіравання рэвізіі. Там у чаканні перагляду могуць быць " +#~ "прагледжаны, у параўнанні з іншымі зменамі, а таксама зацверджаны ці " +#~ "выдалены кваліфікаваных рэдактараў. Калі падавец усталяваць будучым даце " +#~ "публікацыі, сцвярджэнне графікаў затрымку з публікацыяй перагледжаных " +#~ "утрыманне." + +#~ msgid "" +#~ "Send all revision notification emails asynchronously, via a secondary " +#~ "http request from the server." +#~ msgstr "" +#~ "Дасылайце ўсе электронныя апавяшчэнні перагляду асінхронна, з дапамогай " +#~ "другі запыт HTTP ад сервера." + +#~ msgid "" +#~ "Note: \"by default\" means Pending Revision creators can customize email " +#~ "notification recipients before submitting. Eligibile \"Publisher\" email " +#~ "recipients are members of the Pending Revision Monitors group who " +#~ "also have the ability to publish the revision." +#~ msgstr "" +#~ "Нататка:\"by default\" Рэдакцыя сродку Да стваральнікаў могуць наладзіць " +#~ "апавяшчэнні атрымальнікаў перад адпраўкай. Eligibile \"Publisher\" " +#~ "атрымальнікаў уваходных у чаканні Рэдакцыя Маніторы групы, якія " +#~ "таксама маюць магчымасць публікаваць змены." + +#, php-format +#~ msgid "" +#~ "Note: \"by default\" means Pending Revision creators can customize email " +#~ "notification recipients before submitting. For more flexibility in " +#~ "moderation and notification, install the %1$s Role Scoper%2$s plugin." +#~ msgstr "" +#~ "Нататка: \"па змаўчанні\" Рэдакцыя сродку Да стваральнікаў могуць " +#~ "наладзіць апавяшчэнні атрымальнікаў перад адпраўкай. Для большай " +#~ "гнуткасці ва ўмеранасці і абвесткі, усталёўку%1$s Role Scoper%2$s убудовы." + +#~ msgid "Specify which Revisionary Options should be applied site-wide." +#~ msgstr "Пакажыце, якія Revisionary Функцыі павінны ўжывацца на вэб-вузле." + +#~ msgid "" +#~ "Selected options will be controlled site-wide via Site Admin > " +#~ "Role Options; unselected options can be set per-blog via " +#~ "Roles > Options" +#~ msgstr "" +#~ "Абраныя параметры будуць кантралявацца на вэб-вузле з дапамогай " +#~ "Site Admin > Role Options невылучаныя параметры могуць " +#~ "быць усталяваны за блог з дапамогай Roles > Options" + +#~ msgid "Modified Date (click to view/restore)" +#~ msgstr "Даце апошняй змены (націсніце, каб прагледзець / аднавіць)" + +#~ msgid "Modified Date (click to view/approve)" +#~ msgstr "Дата змены (націсніце, каб прагледзець / прыняць)" + +#~ msgid "Modified Date (click to view/publish)" +#~ msgstr "Дата змены (націсніце, каб прагледзець / апублікаваць)" + +#~ msgid "Date as:" +#~ msgstr "Датавана:" + +#~ msgid "Unsaved Date Selection:" +#~ msgstr "Незахаваныя Выбар даты:" + +#, php-format +#~ msgid "Past Revision of “%1$s”" +#~ msgstr "Апошняя рэдакцыя “%1$s”" + +#, php-format +#~ msgid "Pending Revision of “%1$s”" +#~ msgstr "Да перагляду “%1$s”" + +#, php-format +#~ msgid "Scheduled Revision of “%1$s”" +#~ msgstr "Запланаваная рэдакцыя “%1$s”" + +#~ msgid "Publish Now" +#~ msgstr "Публікаваць цяпер" + +#~ msgid "The revision was deleted." +#~ msgstr "Версія была выдалена." + +#~ msgid "To delete the revision, click the link below." +#~ msgstr "Для выдалення рэдакцыі, націсніце ніжэй." + +#, php-format +#~ msgid "Published on: %1$s" +#~ msgstr "Апублікавана: %1$s" + +#, php-format +#~ msgid "Scheduled for: %1$s" +#~ msgstr "Запланавана: %1$s" + +#, php-format +#~ msgid "Requested Publish Date: %1$s" +#~ msgstr "Запытаная дата публікацыі: %1$s" + +#~ msgid "Requested Publish Date: Immediate" +#~ msgstr "Запытаная дата публікацыі: Неадкладна" + +#, php-format +#~ msgid "Modified on: %1$s" +#~ msgstr "Зменена: %1$s" + +#, php-format +#~ msgid "Older: modified %s" +#~ msgstr "Старэй: зменена %s" + +#, php-format +#~ msgid "Newer: modified %s" +#~ msgstr "Навей: зменена %s" + +#~ msgid "These revisions are identical." +#~ msgstr "Гэтыя змены з'яўляюцца ідэнтычнымі." diff --git a/wp-content/plugins/revisionary/languages/revisionary-de_DE.mo b/wp-content/plugins/revisionary/languages/revisionary-de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..c14d04180dae507d7df0af17d0fdbabf3075b884 GIT binary patch literal 27883 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 TW-%Y$6z&WHHn2iG9eVnI\n" +"Language-Team: PublishPress \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_c;__ngettext;_n;rvy_po_trigger;__awp;_x;_ex;" +"esc_html__;esc_html_e\n" +"X-Poedit-Basepath: ..\n" +"X-Generator: Poedit 3.0.1\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPath-1: admin\n" +"X-Poedit-SearchPath-2: classes\n" +"X-Poedit-SearchPath-3: includes\n" +"X-Poedit-SearchPathExcluded-0: includes-pro\n" + +#: admin/RevisionEditSubmitMetabox.php:60 admin/class-list-table_rvy.php:1181 +msgid "Delete Revision" +msgstr "Revision Löschen" + +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Move to Trash" +msgstr "In den Papierkorb legen" + +#: admin/RevisionEditSubmitMetabox.php:118 +#: admin/RevisionEditSubmitMetabox.php:121 admin/class-list-table_rvy.php:609 +#: admin/class-list-table_rvy.php:1200 admin/history_rvy.php:1067 +#: admin/history_rvy.php:1162 admin/post-edit_rvy.php:85 +#: admin/post-editor-workflow-ui_rvy.php:48 +#: admin/post-editor-workflow-ui_rvy.php:89 +#: admin/post-editor-workflow-ui_rvy.php:185 admin/revision-ui_rvy.php:260 +#: admin/revision-ui_rvy.php:302 +msgid "Preview" +msgstr "Voransicht" + +#: admin/RevisionEditSubmitMetabox.php:119 admin/post-edit_rvy.php:100 +msgid "View / moderate saved revision" +msgstr "Ansehen / gespeicherte Revision moderieren" + +#: admin/RevisionEditSubmitMetabox.php:122 admin/post-edit_rvy.php:103 +msgid "View saved revision" +msgstr "Gespeicherte Revision ansehen" + +#: admin/RevisionEditSubmitMetabox.php:144 +msgid "Status:" +msgstr "Status:" + +#: admin/RevisionEditSubmitMetabox.php:177 +msgid "M j, Y @ G:i" +msgstr "M j, Y @ G:i" + +#: admin/RevisionEditSubmitMetabox.php:182 +#, php-format +msgid "Scheduled for: %s" +msgstr "Geplant für: %s" + +#: admin/RevisionEditSubmitMetabox.php:185 +#, php-format +msgid "Publish on: %s" +msgstr "Veröffentlichen am: %s" + +#: admin/RevisionEditSubmitMetabox.php:188 +#, fuzzy, php-format +#| msgid "Publish immediately" +msgid "Publish %son approval%s" +msgstr "Jetzt veröffentlichen" + +#: admin/RevisionEditSubmitMetabox.php:193 admin/admin-posts_rvy.php:187 +#: admin/class-list-table_rvy.php:576 admin/class-list-table_rvy.php:1162 +#: admin/post-editor-workflow-ui_rvy.php:94 +#: admin/post-editor-workflow-ui_rvy.php:186 front_rvy.php:296 +msgid "Edit" +msgstr "Bearbeiten" + +#: admin/admin-init_rvy.php:136 admin/admin-init_rvy.php:248 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "Sie sind nicht befugt diese Revision zu genehmigen." + +#: admin/admin-init_rvy.php:177 +#, fuzzy +#| msgid "Sorry, you are not allowed to delete this revision." +msgid "Sorry, you are not allowed to submit this revision." +msgstr "Sie sind nicht befugt diese Revision zu löschen." + +#: admin/admin-init_rvy.php:213 +#, fuzzy +#| msgid "Sorry, you are not allowed to delete this revision." +msgid "Sorry, you are not allowed to decline this revision." +msgstr "Sie sind nicht befugt diese Revision zu löschen." + +#: admin/admin-init_rvy.php:277 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Sie sind nicht befugt diese Revision zu löschen." + +#: admin/admin-init_rvy.php:282 +msgid "Error in deleting." +msgstr "Fehler beim Löschen." + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "Die Revision wurde wiederhergestellt." + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "Die Veröffentlichung der Revision wurde geplant." + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "Die Revision wurde veröffentlicht." + +#: admin/admin-posts_rvy.php:140 rvy_init.php:488 +msgid "Revision" +msgstr "Revision" + +#: admin/admin-posts_rvy.php:157 +#, fuzzy +#| msgid "Past Revisions" +msgid "Has Revision" +msgstr "Bisherige Revisionen" + +#: admin/admin-posts_rvy.php:172 admin/admin_rvy.php:213 +msgid "Revision Queue" +msgstr "Revision Queue" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:227 +msgid "PublishPress Revisions Network Settings" +msgstr "PublishPress Revisions Netzwerk Einstellungen" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "Netzwerk Einstellungen" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:229 +msgid "PublishPress Revisions Network Defaults" +msgstr "PublishPress Revision Netzwerk Standardeinstellungen" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "Netzwerk Standardeinstellungen" + +#: admin/admin_rvy.php:194 admin/admin_rvy.php:210 +msgid "Revisions" +msgstr "Revisionen" + +#: admin/admin_rvy.php:226 admin/options.php:233 +msgid "PublishPress Revisions Settings" +msgstr "PublishPress Revisions Einstellungen" + +#: admin/admin_rvy.php:226 admin/admin_rvy.php:266 admin/options.php:92 +msgid "Settings" +msgstr "Einstellungen" + +#: admin/admin_rvy.php:233 admin/admin_rvy.php:234 includes/CoreAdmin.php:92 +msgid "Upgrade to Pro" +msgstr "Auf Pro upgraden" + +#: admin/admin_rvy.php:306 +#, php-format +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "" +"Gefällt dir PublishPress %s, dann lass uns eine %s Bewertung da. Danke!" + +#: admin/admin_rvy.php:317 +msgid "About" +msgstr "About" + +#: admin/admin_rvy.php:319 +msgid "Documentation" +msgstr "Dokumentation" + +#: admin/admin_rvy.php:321 +msgid "Contact" +msgstr "Kontakt" + +#: admin/agents_checklist_rvy.php:75 +#, php-format +msgid "show current users (%d)" +msgstr "Momentane Nutzer anzeigen (%d)" + +#: admin/agents_checklist_rvy.php:77 +#, php-format +msgid "show eligible users (%d)" +msgstr "Berechtigte Nutzer anzeigen (%d)" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "Filter:" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "auswählen" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "abwählen" + +#: admin/class-list-table_rvy.php:427 admin/post-editor-workflow-ui_rvy.php:29 +msgid "Status" +msgstr "Status" + +#: admin/class-list-table_rvy.php:428 +msgid "Post Type" +msgstr "Beitragstyp" + +#: admin/class-list-table_rvy.php:438 +msgid "Schedule" +msgstr "Zeitplan" + +#: admin/class-list-table_rvy.php:481 admin/class-list-table_rvy.php:1093 +msgid "Y/m/d g:i:s a" +msgstr "Y/m/d g:i:s a" + +#: admin/class-list-table_rvy.php:489 admin/class-list-table_rvy.php:1098 +#: admin/history_rvy.php:980 +#, php-format +msgid "%s ago" +msgstr "vor %s" + +#: admin/class-list-table_rvy.php:491 admin/class-list-table_rvy.php:1101 +msgid "Y/m/d g:i a" +msgstr "Y/m/d g:i a" + +#: admin/class-list-table_rvy.php:498 +#, php-format +msgid "Scheduled publication: %s" +msgstr "Geplante Veröffentlichung: %s" + +#: admin/class-list-table_rvy.php:501 +#, php-format +msgid "Requested publication: %s" +msgstr "Angefragte Veröffentlichung: %s" + +#: admin/class-list-table_rvy.php:505 +msgid "Missed schedule" +msgstr "Verpasste Planung" + +#: admin/class-list-table_rvy.php:546 admin/history_rvy.php:779 +msgid "No author" +msgstr "Kein Autor" + +#: admin/class-list-table_rvy.php:588 +#, php-format +msgid "View only revisions of %s" +msgstr "Siehe nur Revisionen von %s" + +#: admin/class-list-table_rvy.php:589 +msgid "Filter" +msgstr "Filter" + +#: admin/class-list-table_rvy.php:600 admin/class-list-table_rvy.php:608 +msgid "View published post" +msgstr "Siehe veröffentlichte Beiträge" + +#: admin/class-list-table_rvy.php:601 +msgid "View" +msgstr "Ansehen" + +#: admin/class-list-table_rvy.php:632 +msgid "Compare Past Revisions" +msgstr "Mit bisherigen Revisionen vergleichen" + +#: admin/class-list-table_rvy.php:633 +msgid "History" +msgstr "Historie" + +#: admin/class-list-table_rvy.php:661 +msgid "Show more details" +msgstr "" + +#: admin/class-list-table_rvy.php:886 +msgid "My Activity" +msgstr "" + +#: admin/class-list-table_rvy.php:894 +#, php-format +msgid "All %s" +msgstr "Alle %s" + +#: admin/class-list-table_rvy.php:918 front_rvy.php:341 rvy_init.php:309 +#: rvy_init.php:365 +#, fuzzy +#| msgid "Submitted " +msgid "Submit" +msgstr "Geplante Revision einreichen" + +#: admin/class-list-table_rvy.php:921 admin/history_rvy.php:1065 +#: front_rvy.php:338 front_rvy.php:359 rvy_init.php:295 rvy_init.php:313 +#: rvy_init.php:352 rvy_init.php:369 rvy_init.php:386 +msgid "Approve" +msgstr "Genehmigen" + +#: admin/class-list-table_rvy.php:922 +msgid "Decline" +msgstr "" + +#: admin/class-list-table_rvy.php:923 +msgid "Publish" +msgstr "Veröffentlichen" + +#: admin/class-list-table_rvy.php:926 admin/revision-ui_rvy.php:270 +msgid "Unschedule" +msgstr "Planung streichen" + +#: admin/class-list-table_rvy.php:930 admin/post-edit-block-ui_rvy.php:67 +#: admin/post-edit_rvy.php:51 +msgid "Delete Permanently" +msgstr "Endgültig Löschen" + +#: admin/class-list-table_rvy.php:950 +msgid "Filter by category" +msgstr "Nach Kategorie filtern" + +#: admin/class-list-table_rvy.php:1005 +msgid "Select All" +msgstr "Alle auswählen" + +#: admin/class-list-table_rvy.php:1081 +#, php-format +msgid "“%s” (Edit)" +msgstr "“%s” (Bearbeiten)" + +#: admin/class-list-table_rvy.php:1171 rvy_init.php:291 +#, fuzzy +msgid "Copy" +msgstr "kopieren" + +#: admin/class-list-table_rvy.php:1182 admin/revision-ui_rvy.php:280 +#: admin/revision-ui_rvy.php:391 +msgid "Delete" +msgstr "Löschen" + +#: admin/class-list-table_rvy.php:1199 +#: admin/post-editor-workflow-ui_rvy.php:185 +msgid "Preview Revision" +msgstr "Voransicht der Revision" + +#: admin/class-list-table_rvy.php:1214 +msgid "Compare Changes" +msgstr "Änderungen vergleichen" + +#: admin/class-list-table_rvy.php:1215 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:125 +#: admin/post-edit_rvy.php:139 +#, fuzzy +#| msgid "Compare Changes" +msgid "Compare" +msgstr "Mit bisherigen Revisionen vergleichen" + +#: admin/edit-revision-block-ui_rvy.php:20 +msgid "Enable public preview" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:63 +#, fuzzy +#| msgid "Publish immediately" +msgid "Publish on approval" +msgstr "Jetzt veröffentlichen" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "" +"Vergleich dieser Revision mit der veröffentlichten Kopie oder anderen " +"Revisionen" + +#: admin/edit-revision-classic-ui_rvy.php:106 +#, php-format +msgid "Revision updated. %sView Preview%s" +msgstr "Revision aktualisiert. %sVoransicht%s" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "Revision aktualisiert." + +#: admin/history_rvy.php:189 +#, fuzzy, php-format +#| msgid "Compare %s of “%s”" +msgid "Compare %s of \"%s\"" +msgstr "Vergleiche %s von “%s”" + +#: admin/history_rvy.php:195 +#, fuzzy +#| msgid "← Return to editor" +msgid "Return to editor" +msgstr "← Zurück zum Editor" + +#: admin/history_rvy.php:428 admin/history_rvy.php:431 +msgid "(no title)" +msgstr "(kein Titel)" + +#: admin/history_rvy.php:528 admin/options.php:710 +msgid "Post Date" +msgstr "Beitragsdatum" + +#: admin/history_rvy.php:529 +msgid "Post Parent" +msgstr "Ursprungsbeitrag" + +#: admin/history_rvy.php:530 +msgid "Menu Order" +msgstr "Menü-Reihenfolge" + +#: admin/history_rvy.php:531 +msgid "Comment Status" +msgstr "Kommentar-Status" + +#: admin/history_rvy.php:532 +msgid "Ping Status" +msgstr "Ping Status" + +#: admin/history_rvy.php:667 +msgid "Page Template" +msgstr "Seiten-Template" + +#: admin/history_rvy.php:670 +msgid "Featured Image" +msgstr "Beitragsbild" + +#: admin/history_rvy.php:674 +msgid "Beaver Builder Data" +msgstr "Beaver Builder Daten" + +#: admin/history_rvy.php:675 +msgid "Beaver Builder Settings" +msgstr "Beaver Builder Einstellungen" + +#: admin/history_rvy.php:907 +msgid "Scheduled for " +msgstr "Geplant für " + +#: admin/history_rvy.php:912 +msgid "Requested for " +msgstr "Angefragt für " + +#: admin/history_rvy.php:917 +#, fuzzy +#| msgid "Modified Date" +msgid "Modified " +msgstr "Modifiziertes Datum" + +#: admin/history_rvy.php:922 +#, php-format +msgid "%s%s ago" +msgstr "Vor %s%s" + +#: admin/history_rvy.php:922 +#, php-format +msgid "%s%s from now" +msgstr "Noch %s%s" + +#: admin/history_rvy.php:933 admin/revision-action_rvy.php:411 +#: admin/revision-action_rvy.php:493 admin/revision-ui_rvy.php:245 +#: front_rvy.php:237 +msgid "M j, Y @ g:i a" +msgstr "M j, Y @ g:i a" + +#: admin/history_rvy.php:934 +#, fuzzy +#| msgid "M j, Y @ g:i a" +msgid "j M @ g:i a" +msgstr "M j, Y @ g:i a" + +#: admin/history_rvy.php:978 +msgid "M j, Y @ H:i" +msgstr "M j, Y @ H:i" + +#: admin/history_rvy.php:979 +#, fuzzy +#| msgid "M j, Y @ H:i" +msgid "j M @ H:i" +msgstr "M j, Y @ H:i" + +#: admin/history_rvy.php:1065 +#, fuzzy +#| msgid "Preview / Approval" +msgid "Preview / Approve" +msgstr "Voransicht / Genehmigung" + +#: admin/history_rvy.php:1161 +msgid "Preview / Restore" +msgstr "Voransicht / Wiederherstellen" + +#: admin/history_rvy.php:1168 +msgid "Manage" +msgstr "Verwalten" + +#: admin/history_rvy.php:1169 +msgid "List" +msgstr "Auflisten" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "Bereich festlegen" + +#: admin/options.php:96 +#, fuzzy +#| msgid "Post Type" +msgid "Post Types" +msgstr "Beitragstyp" + +#: admin/options.php:97 +#, fuzzy +#| msgid "Revisor" +msgid "Revisors" +msgstr "Andere Prüfer daran hindern, Entwürfe anderer zu bearbeiten" + +#: admin/options.php:98 +#, fuzzy +#| msgid "Status" +msgid "Statuses" +msgstr "Status" + +#: admin/options.php:99 +#, fuzzy +#| msgid "Revision Options" +msgid "Revision Creation" +msgstr "Revisions-Optionen" + +#: admin/options.php:100 admin/options.php:111 +#, fuzzy +#| msgid "Revision Submission Error" +msgid "Revision Submission" +msgstr "Fehler beim Einreichen der Revision" + +#: admin/options.php:102 +#, fuzzy +msgid "Queue" +msgstr "Revision Queue %s" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "Voransicht / Genehmigung" + +#: admin/options.php:104 +#, fuzzy +#| msgid "Actions" +msgid "Options" +msgstr "Aktionen" + +#: admin/options.php:105 +#, fuzzy +#| msgid "Notification Log" +msgid "Notifications" +msgstr "Benachrichtigungsprotokoll" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" + +#: admin/options.php:118 +#, php-format +msgid "Additional role capability required to manage %s" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "" + +#: admin/options.php:120 +#, php-format +msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +msgstr "" + +#: admin/options.php:121 admin/options.php:123 +#, php-format +msgid "Enable %s" +msgstr "" + +#: admin/options.php:122 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" + +#: admin/options.php:124 +msgid "Additional role capability required to submit a Change Request" +msgstr "" + +#: admin/options.php:124 +msgid "Additional role capability required to submit a revision" +msgstr "" + +#: admin/options.php:125 +msgid "Editing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:126 +msgid "Listing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:127 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" + +#: admin/options.php:128 +msgid "Also notify on Revision Update" +msgstr "" + +#: admin/options.php:129 +#, fuzzy +#| msgid "Revision publication triggers API actions to mimic post update" +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" +"Revisionsveröffentlichung löst API Aktionen aus um Beitragsaktualisierung " +"nachzuahmen" + +#: admin/options.php:130 +#, fuzzy +#| msgid "Approve Button on Compare Revisions screen" +msgid "Hide html tags on Compare Revisions screen" +msgstr "Genehmigungsknopfs bei der Gegenüberstellung der Revisionen" + +#: admin/options.php:131 +msgid "Use WP-Cron scheduling" +msgstr "" + +#: admin/options.php:132 +msgid "Asynchronous Publishing" +msgstr "Asynchrone Veröffentlichung" + +#: admin/options.php:133 admin/options.php:134 +msgid "Update Publish Date" +msgstr "Veröffentlichungsdatum aktualisieren" + +#: admin/options.php:135 admin/options.php:136 +#, fuzzy +#| msgid "Modified Date" +msgid "Update Modified Date" +msgstr "Modifiziertes Datum" + +#: admin/options.php:137 +#, fuzzy, php-format +#| msgid "Email original Author when a Pending Revision is submitted" +msgid "Email original Author when a %s is submitted" +msgstr "" +"Ursprünglichen Autor via E-Mail benachrichtigen wenn eine ausstehende " +"Revision eingereicht wurde" + +#: admin/options.php:138 +#, fuzzy, php-format +#| msgid "Email the original Author when a Pending Revision is approved" +msgid "Email the original Author when a %s is approved" +msgstr "" +"Ursprünglichen Autor via E-Mail benachrichtigen wenn eine ausstehende " +"Revision genehmigt wurde" + +#: admin/options.php:139 +#, fuzzy, php-format +#| msgid "Email the Revisor when a Pending Revision is approved" +msgid "Email the Revisor when a %s is approved" +msgstr "Prüfer via E-Mail benachrichtigen wenn eine Revision genehmigt wurde" + +#: admin/options.php:140 +#, fuzzy, php-format +#| msgid "Email the original Author when a Scheduled Revision is published" +msgid "Email the original Author when a %s is published" +msgstr "" +"Ursprünglichen Autor via E-Mail benachrichtigen wenn eine geplante Revision " +"veröffentlicht wurde" + +#: admin/options.php:141 +#, fuzzy, php-format +#| msgid "Email the Revisor when a Scheduled Revision is published" +msgid "Email the Revisor when a %s is published" +msgstr "" +"Genehmiger via E-Mail benachrichtigen wenn eine geplante Revision " +"veröffentlicht wurde" + +#: admin/options.php:142 +msgid "Enable notification buffer" +msgstr "Aktiviere Benachrichtigungs-Puffer" + +#: admin/options.php:143 +msgid "All custom post types available to Revisors" +msgstr "Alle für Prüfer verfügbaren benutzerdefinierten Beitragstypen" + +#: admin/options.php:144 +#, fuzzy +#| msgid "Prevent Revisors from editing other user's drafts" +msgid "Prevent Revisors from editing other user's drafts" +msgstr "Andere Prüfer daran hindern, Entwürfe anderer zu bearbeiten" + +#: admin/options.php:145 +msgid "Display Hints" +msgstr "Hinweise anzeigen" + +#: admin/options.php:146 +msgid "Show Preview Links" +msgstr "Siehe Voransichts-Links" + +#: admin/options.php:147 +msgid "Preview Link Type" +msgstr "Link-Typ Voransicht" + +#: admin/options.php:148 +msgid "Approve Button on Compare Revisions screen" +msgstr "Genehmigungsknopfs bei der Gegenüberstellung der Revisionen" + +#: admin/options.php:149 +#, fuzzy +#| msgid "The revision was published." +msgid "Copy revision comments to published post" +msgstr "Die Revision wurde veröffentlicht." + +#: admin/options.php:150 +#, fuzzy +#| msgid "Compare Past Revisions" +msgid "Compare Past Revisions ordering:" +msgstr "Mit bisherigen Revisionen vergleichen" + +#: admin/options.php:151 +#, php-format +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" + +#: admin/options.php:152 +msgid "On Revision publication, delete Editorial Comments" +msgstr "" + +#: admin/options.php:158 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Pending Revision is submitted" +msgid "Email designated Publishers when a %s is submitted" +msgstr "" +"Festgelegte Verleger benachrichtigen wenn eine ausstehende Revision " +"eingereicht wurde" + +#: admin/options.php:159 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Scheduled Revision is published" +msgid "Email designated Publishers when a %s is published" +msgstr "" +"Festgelegte Verleger benachrichtigen wenn eine geplante Revision " +"veröffentlicht wurde" + +#: admin/options.php:160 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Pending Revision is approved" +msgid "Email designated Publishers when a %s is approved" +msgstr "" +"Festgelegte Verleger benachrichtigen wenn eine ausstehende Revision " +"genehmigt wurde" + +#: admin/options.php:162 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Pending Revision is submitted" +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" +"Redakteure und Administratoren benachrichtigen wenn eine ausstehende " +"Revision eingereicht wurde" + +#: admin/options.php:163 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Scheduled Revision is published" +msgid "Email Editors and Administrators when a %s is published" +msgstr "" +"Redakteure und Administratoren benachrichtigen wenn eine geplante Revision " +"veröffentlicht wurde" + +#: admin/options.php:164 +#, fuzzy, php-format +#| msgid "Email Editors and Administrators when a Pending Revision is approved" +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" +"Redakteure und Administratoren benachrichtigen wenn eine ausstehende " +"Revision genehmigt wurde" + +#: admin/options.php:231 +msgid "PublishPress Revisions Site Settings" +msgstr "PublishPress Revisions Seiteneinstellungen" + +#: admin/options.php:261 +msgid "" +"These are the default settings for options which can be " +"adjusted per-site." +msgstr "" +"Hier sind Standardeinstellungen für Optionen welche je " +"Seite angepasst werden können." + +#: admin/options.php:299 +#, php-format +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" +"Sie können auch %1$sseitenspezifische Standardeinstellungen%2$s festlegen." + +#: admin/options.php:300 +#, php-format +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress " +"Revisions settings. %s" +msgstr "" +"Verwenden Sie diesen Tab, um netzwerkweite Änderungen an " +"den PublishPress Revisions Einstellungen vorzunehmen %s" + +#: admin/options.php:302 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" +"Hier können Sie den Standardwert für Einstellungen festlegen, welche auf " +"jeder Seite separat festgelegt werden." + +#: admin/options.php:312 admin/options.php:314 +#, php-format +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" +"Beachten Sie, dass %1$snetzwerkweite Einstellungen%2$s auch verfügbar sein " +"könnten." + +#: admin/options.php:335 +msgid "License" +msgstr "" + +#: admin/options.php:385 +msgid "Enable revisions for these Post Types:" +msgstr "" + +#: admin/options.php:431 +#, fuzzy, php-format +msgid "%s capabilities" +msgstr "%s Berechtigungen" + +#: admin/options.php:445 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" + +#: admin/options.php:459 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" +"The Nutzerrolle \"Prüfer\" ist nun verfügbar. Berechtigungen für alle " +"benutzerdefinierten Beitragstypen einbinden?" + +#: admin/options.php:464 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" +"Wenn ausgewählt, wird Nutzern ohne seitenweite Berechtigungen ebenfalls die " +"edit_others_drafts Berechtigung verliehen" + +#: admin/options.php:479 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for Approval" +"\", \"Scheduled Revision\"" +msgstr "" + +#: admin/options.php:493 +#, fuzzy +#| msgid "" +#| "This restriction applies to users who are not full editors for the post " +#| "type. To enable a role, give it the list_others_revisions capability." +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" +"Diese Beschränkung betrifft nur Nutzer die nicht Redakteure für diesen " +"Beitragstyp sind. Um diese Rolle zu aktivieren, geben Sie ihr die " +"list_others_revisions Berechtigung." + +#: admin/options.php:498 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" + +#: admin/options.php:502 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" + +#: admin/options.php:512 +#, php-format +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" + +#: admin/options.php:534 +#, php-format +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" + +#: admin/options.php:540 +#, fuzzy +#| msgid "" +#| "This restriction applies to users who are not full editors for the post " +#| "type. To enable a role, give it the edit_others_revisions capability." +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" +"Diese Beschränkung betrifft nur Nutzer, die nicht Redakteure für diesen " +"Beitragstyp sind. Um diese Rolle zu aktivieren, geben Sie ihr die " +"edit_others_revisions Berechtigung." + +#: admin/options.php:543 admin/options.php:567 +#, fuzzy, php-format +#| msgid "" +#| "When a scheduled revision is published, also update the publish date." +msgid "When a %s is published, update post publish date to current time." +msgstr "" +"Wenn eine geplante Revision veröffentlicht wird, dann aktualisiert sich auch " +"das Veröffentlichungsdatum." + +#: admin/options.php:546 admin/options.php:570 +#, fuzzy, php-format +#| msgid "" +#| "When a scheduled revision is published, also update the publish date." +msgid "When a %s is published, update post modified date to current time." +msgstr "" +"Wenn eine geplante Revision veröffentlicht wird, dann aktualisiert sich auch " +"das Veröffentlichungsdatum." + +#: admin/options.php:564 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" +"Wenn ein aktuell veröffentlichter Beitrag oder eine Seite bearbeitet wird, " +"werden die Änderungen erst an dem ausgewähltem Datum übernommen." + +#: admin/options.php:575 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" + +#: admin/options.php:579 +#, fuzzy +#| msgid "" +#| "Publish scheduled revisions asynchronously, via a secondary http request " +#| "from the server. This is usually best since it eliminates delay, but " +#| "some servers may not support it." +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" +"Geplante Revisionen asynchron veröffentlichen, mit einer zweiten HTTP-" +"Anfrage vom Server. Das ist üblicherweise die beste Optionen, da hier " +"Verzögerungen ausgeschlossen werden. Dieses Feature wird jedoch nicht von " +"allen Servern unterstützt." + +#: admin/options.php:596 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" +"Diese Beschränkung betrifft nur Nutzer, die nicht Redakteure für diesen " +"Beitragstyp sind. Um diese Rolle zu aktivieren, geben Sie ihr die " +"edit_others_revisions Berechtigung." + +#: admin/options.php:599 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" +"Diese Beschränkung betrifft nur Nutzer die nicht Redakteure für diesen " +"Beitragstyp sind. Um diese Rolle zu aktivieren, geben Sie ihr die " +"list_others_revisions Berechtigung." + +#: admin/options.php:602 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" + +#: admin/options.php:611 +msgid "Regenerate \"post has revision\" flags" +msgstr "" + +#: admin/options.php:626 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators" +msgstr "" +"Für Themes, die die Voransicht der Revision blockieren, verstecke die " +"Voranschau-Links vor nicht-Administratoren" + +#: admin/options.php:638 +msgid "Published Post Slug" +msgstr "Veröffentlichter Beitrags-Slug" + +#: admin/options.php:638 +msgid "Revision Slug" +msgstr "Revisions-Slug" + +#: admin/options.php:638 +msgid "Revision ID only" +msgstr "Nur die Revisions-ID" + +#: admin/options.php:649 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" +"Manche Themes und Plugins benötigen möglicherweise einen Revisions-Slug oder " +"einen Revisions-ID Link-Typ, damit das Template richtig lädt und die " +"Eingabefelder richtig dargestellt werden." + +#: admin/options.php:659 +msgid "If disabled, Compare screen links to Revision Preview for approval" +msgstr "" +"Wenn deaktiviert, verlinkt die Vergleichsansicht die Revisions-Voransicht " +"zur Genehmigung" + +#: admin/options.php:681 +#, fuzzy, php-format +#| msgid "" +#| "For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +#| "upgrade to PublishPress Revisions Pro." +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" +"Für Kompatibilität mit ACF, Beamer Builder und WPML, upgraden zu PublishPress Revisions Pro." + +#: admin/options.php:691 +msgid "This may improve compatibility with some plugins." +msgstr "Dies könnte die Kompatibilität mit einigen Plugins verbessern." + +#: admin/options.php:710 +#, fuzzy +#| msgid "Modified Date" +msgid "Modification Date" +msgstr "Modifiziertes Datum" + +#: admin/options.php:720 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "Überschriften für PublishPress Revisions Einstellungen anzeigen" + +#: admin/options.php:748 admin/options.php:769 +msgid "Never" +msgstr "Niemals" + +#: admin/options.php:748 admin/options.php:769 +msgid "By default" +msgstr "Standardmäßig" + +#: admin/options.php:748 admin/options.php:769 +msgid "Always" +msgstr "Immer" + +#: admin/options.php:758 admin/options.php:804 +msgid "select recipients" +msgstr "Empfänger wählen" + +#: admin/options.php:818 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" +"Um Benachrichtigungsfehler zu vermeiden, nutzen Sie den Email-Puffer zum " +"verzögerten Senden von Emails in 1-Minuten, Stunden oder Tages Intervallen" + +#: admin/options.php:839 +msgid "Notification Buffer" +msgstr "Benachrichtigungspuffer" + +#: admin/options.php:867 +msgid "Notification Log" +msgstr "Benachrichtigungsprotokoll" + +#: admin/options.php:896 +msgid "Purge Notification Buffer" +msgstr "Benachrichtigungspuffer löschen" + +#: admin/options.php:902 +msgid "Truncate Notification Log" +msgstr "Benachrichtigungsprotokoll kürzen" + +#: admin/options.php:908 +#, php-format +msgid "Sent in last minute: %d / %d" +msgstr "In letzter Minute gesendet: %d / %d" + +#: admin/options.php:909 +#, php-format +msgid "Sent in last hour: %d / %d" +msgstr "In der letzten Stunde gesendet: %d / %d" + +#: admin/options.php:910 +#, php-format +msgid "Sent in last day: %d / %d" +msgstr "Gestern gesendet: %d / %d" + +#: admin/options.php:917 +#, php-format +msgid "Seconds until next buffer processing time: %d" +msgstr "Sekunden bis zur nächsten Puffer Verarbeitung: %d" + +#: admin/options.php:926 +msgid "Show Notification Log / Buffer" +msgstr "Benachrichtigungs Protokoll / Puffer anzeigen" + +#: admin/options.php:928 +msgid "Show with message content" +msgstr "Nachricht mit Inhalt anzeigen" + +#: admin/options.php:939 includes/CoreAdmin.php:89 +msgid "WPML Translation Management" +msgstr "" + +#: admin/options.php:946 +msgid "Sync \"Needs Update\" flags" +msgstr "" + +#: admin/options.php:950 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" + +#: admin/options.php:988 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" +"Geben Sie an welche PublishPress Revisions Einstellungen netzwerkweiten " +"gelten sollen. Unausgewählte Einstellungen werden seitenweise eingestellt." + +#: admin/options.php:998 +#, php-format +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "" + +#: admin/options.php:1034 +#, php-format +msgid "network-wide control of \"%s\"" +msgstr "netzwerkweite Kontrolle von \"%s\"" + +#: admin/options.php:1064 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" +"Alle die Einstellungen in diesem Formular (auch in die nicht ausgewählten " +"Tabs) werden auf die Standardeinstellungen zurückgesetzt. Sind Sie sicher?" + +#: admin/post-edit_rvy.php:26 admin/post-edit_rvy.php:71 +msgid "Current Time" +msgstr "Aktuelle Zeit" + +#: admin/post-editor-workflow-ui_rvy.php:32 +#, fuzzy +msgid "(on approval)" +msgstr "[%s] Mitteilung zur Revisions-Genehmigung" + +#: admin/post-editor-workflow-ui_rvy.php:48 +#: admin/post-editor-workflow-ui_rvy.php:89 +#, fuzzy +#| msgid "Preview Revision" +msgid "Preview this Revision" +msgstr "Voransicht der Revision" + +#: admin/post-editor-workflow-ui_rvy.php:50 +msgid "View / Publish" +msgstr "Ansehen / Veröffentlichen" + +#: admin/post-editor-workflow-ui_rvy.php:50 +msgid "View / Approve" +msgstr "Ansehen / Genehmigen" + +#: admin/post-editor-workflow-ui_rvy.php:53 +#, fuzzy +#| msgid "View / moderate saved revision" +msgid "View / Approve saved revision" +msgstr "Ansehen / gespeicherte Revision moderieren" + +#: admin/post-editor-workflow-ui_rvy.php:55 +#, fuzzy +#| msgid "Preview it" +msgid "Preview / Submit" +msgstr "Voransicht" + +#: admin/post-editor-workflow-ui_rvy.php:55 +#, fuzzy +#| msgid "View / Publish" +msgid "View / Submit" +msgstr "Ansehen / Veröffentlichen" + +#: admin/post-editor-workflow-ui_rvy.php:56 +#, fuzzy +#| msgid "View / moderate saved revision" +msgid "View / Submit saved revision" +msgstr "Ansehen / gespeicherte Revision moderieren" + +#: admin/post-editor-workflow-ui_rvy.php:64 +msgid "View unsaved changes" +msgstr "Ungesicherte Änderungen ansehen" + +#: admin/post-editor-workflow-ui_rvy.php:68 +#, fuzzy, php-format +#| msgid "Revision Edits: %s" +msgid "%s%s Revision Edit" +msgstr "Revisionsbearbeitungen: %s" + +#: admin/post-editor-workflow-ui_rvy.php:80 +msgid "Revision Submission Error" +msgstr "Fehler beim Einreichen der Revision" + +#: admin/post-editor-workflow-ui_rvy.php:101 +#, fuzzy +#| msgid "Approve Revision" +msgid "Approving the Revision..." +msgstr "Revision genehmigen" + +#: admin/post-editor-workflow-ui_rvy.php:128 rvy_init.php:299 rvy_init.php:317 +#: rvy_init.php:335 rvy_init.php:355 rvy_init.php:372 rvy_init.php:389 +#: rvy_init.php:493 +msgid "Update Revision" +msgstr "Revision aktualisieren" + +#: admin/post-editor-workflow-ui_rvy.php:186 +#, fuzzy +#| msgid "Edit Revision: " +msgid "Edit Revision" +msgstr "Revision bearbeiten: " + +#: admin/post-editor-workflow-ui_rvy.php:192 +#, php-format +msgid "Update post before creating %s." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:199 +#, fuzzy +#| msgid "Pending Revision" +msgid "Error Creating Revision" +msgstr "Ausstehende Revision" + +#: admin/post-editor-workflow-ui_rvy.php:201 +#: admin/post-editor-workflow-ui_rvy.php:221 +msgid "Update" +msgstr "Aktualisieren" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#, php-format +msgid "For custom field changes, edit a scheduled %s." +msgstr "" + +#: admin/revision-action_rvy.php:404 admin/revision-action_rvy.php:489 +#, php-format +msgid "[%s] Revision Approval Notice" +msgstr "[%s] Mitteilung zur Revisions-Genehmigung" + +#: admin/revision-action_rvy.php:405 +#, fuzzy, php-format +#| msgid "A revision to your %1$s \"%2$s\" has been approved." +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "Eine Revision zu %1$s \"%2$s\" wurde genehmigt." + +#: admin/revision-action_rvy.php:408 +#, php-format +msgid "The submitter was %1$s." +msgstr "Eingereicht von %1$s." + +#: admin/revision-action_rvy.php:412 admin/revision-action_rvy.php:494 +#, php-format +msgid "It will be published on %s" +msgstr "Wird veröffentlicht am %s" + +#: admin/revision-action_rvy.php:416 admin/revision-action_rvy.php:498 +msgid "Preview it here: " +msgstr "Voranschau hier: " + +#: admin/revision-action_rvy.php:419 admin/revision-action_rvy.php:501 +msgid "Editor: " +msgstr "Redakteur: " + +#: admin/revision-action_rvy.php:421 admin/revision-action_rvy.php:503 +#: admin/revision-action_rvy.php:1276 admin/revision-action_rvy.php:1301 +#: admin/revision-action_rvy.php:1363 +msgid "View it online: " +msgstr "Online ansehen: " + +#: admin/revision-action_rvy.php:490 +#, php-format +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "" +"Die geplante Revision, die Sie für %1$s \"%2$s\" eingereicht haben, wurde " +"genehmigt." + +#: admin/revision-action_rvy.php:1272 admin/revision-action_rvy.php:1294 +#, fuzzy, php-format +#| msgid "[%s] Scheduled Revision Publication Notice" +msgid "[%s] %s Publication Notice" +msgstr "[%s] Mitteilung zur Veröffentlichung der geplanten Revision" + +#: admin/revision-action_rvy.php:1273 +#, php-format +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "" +"Die geplante Revision, die Sie für %1$s \"%2$s\" eingereicht haben, wurde " +"veröffentlicht." + +#: admin/revision-action_rvy.php:1295 +#, fuzzy, php-format +#| msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "Eine geplante Revision für deinen %1$s \"%2$s\" wurde veröffentlicht." + +#: admin/revision-action_rvy.php:1298 admin/revision-action_rvy.php:1360 +#, php-format +msgid "It was submitted by %1$s." +msgstr "Eingereicht von %1$s." + +#: admin/revision-action_rvy.php:1355 +#, fuzzy, php-format +#| msgid "[%s] Scheduled Revision Publication" +msgid "[%s] %s Publication" +msgstr "[%s] Geplante Revisionsveröffentlichung" + +#: admin/revision-action_rvy.php:1357 +#, fuzzy, php-format +#| msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +msgstr "Eine geplante Revision für %1$s \"%2$s\" wurde veröffentlicht." + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "Sie sind nicht befugt Revisionen zu verwalten." + +#: admin/revision-queue_rvy.php:14 +#, fuzzy, php-format +#| msgid "" +#| "Pending Revisions and Scheduled Revisions are both disabled. See " +#| "Revisions > Settings." +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "" +"Ausstehende und geplante Revisionen sind beide deaktiviert. Siehe Revisionen " +"> Einstellungen." + +#: admin/revision-queue_rvy.php:46 +#, fuzzy, php-format +#| msgid "%s revision published." +msgid "%s revision submitted." +msgstr "%s Revision veröffentlicht." + +#: admin/revision-queue_rvy.php:47 +#, fuzzy, php-format +#| msgid "%s revision published." +msgid "%s revision declined." +msgstr "%s Revision veröffentlicht." + +#: admin/revision-queue_rvy.php:48 +#, php-format +msgid "%s revision approved." +msgstr "%s Revision genehmigt." + +#: admin/revision-queue_rvy.php:49 +#, fuzzy, php-format +#| msgid "%s revision published." +msgid "%s revision unscheduled." +msgstr "%s Revision veröffentlicht." + +#: admin/revision-queue_rvy.php:50 +#, php-format +msgid "%s revision published." +msgstr "%s Revision veröffentlicht." + +#: admin/revision-queue_rvy.php:51 +#, php-format +msgid "%s revision permanently deleted." +msgstr "%s Revision endgültig gelöscht." + +#: admin/revision-queue_rvy.php:93 +#, fuzzy, php-format +#| msgid "Editor: " +msgid "%s: " +msgstr "Dies ist eine geplante Revision (Veröffentlichung am %s). %s %s %s" + +#: admin/revision-queue_rvy.php:106 +#, fuzzy, php-format +msgid "of %s" +msgstr "Dies ist eine geplante Revision (Veröffentlichung am %s). %s %s %s" + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +#, php-format +msgid "%sPost Author: %s" +msgstr "%sBeitrags-Autor%s" + +#: admin/revision-queue_rvy.php:121 +#, fuzzy, php-format +#| msgid "Revision Queue %s" +msgid "Revision Queue for \"%s\"%s" +msgstr "Revision Queue %s" + +#: admin/revision-queue_rvy.php:123 +#, php-format +msgid "Revision Queue %s" +msgstr "Revision Queue %s" + +#: admin/revision-queue_rvy.php:129 +#, fuzzy, php-format +#| msgid "Search results for “%s”" +msgid "Search results for \"%s\"" +msgstr "Suchergebnisse für “%s”" + +#: admin/revision-queue_rvy.php:157 +msgid "Undo" +msgstr "Rückgängig" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "" +"Verleger werden benachrichtigt (aber können hier nicht ausgewählt werden)." + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "E-Mail Benachrichtigungen werden nicht gesendet werden." + +#: admin/revision-ui_rvy.php:73 +#, fuzzy +#| msgid "M j, Y @ g:i a" +msgid "j F, Y @ g:i a" +msgstr "M j, Y @ g:i a" + +#: admin/revision-ui_rvy.php:92 +#, php-format +msgid "%1$s (Current)" +msgstr "%1$s (Aktuell)" + +#: admin/revision-ui_rvy.php:96 +#, php-format +msgid "%1$s (Autosave)" +msgstr "%1$s (automatisch speichern)" + +#: admin/revision-ui_rvy.php:102 +#, fuzzy +#| msgid "M j, Y @ g:i a" +msgid "j F, Y, g:i a" +msgstr "M j, Y @ g:i a" + +#: admin/revision-ui_rvy.php:106 +#, php-format +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" +"%1$s (Angeforderte " +"Veröffentlichung: %2$s)" + +#: admin/revision-ui_rvy.php:108 +#, php-format +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "" +"%1$s (Veröffentlichungsdatum %2$s)" + +#: admin/revision-ui_rvy.php:260 +#, php-format +msgid "Preview “%s”" +msgstr "Voransicht “%s”" + +#: admin/revision-ui_rvy.php:276 +msgid "The revision will be deleted. Are you sure?" +msgstr "Diese Revision wird gelöscht. Sind Sie sicher?" + +#: admin/revision-ui_rvy.php:332 +#, fuzzy, php-format +#| msgid "%1$s %2$s Revision" +msgid "%1$s by %2$s" +msgstr "%1$s %2$s Revision" + +#: admin/revision-ui_rvy.php:369 +msgid "Modified Date" +msgstr "Modifiziertes Datum" + +#: admin/revision-ui_rvy.php:372 +msgid "Author" +msgstr "Autor" + +#: admin/revision-ui_rvy.php:373 +msgid "Actions" +msgstr "Aktionen" + +#: admin/revision-ui_rvy.php:390 +msgid "Bulk Actions" +msgstr "Mehrere Aktionen" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" +"Hinweis: Zum Darstellen von Revisionen, fügen Sie den " +"folgenden Code zu foliopress-wysiwyg hinzu:
      if " +"( strpos( $_SERVER[‚REQUEST_URI‘], ‚admin.php?page=rvy-revisions‘ ) ) return;" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "Keine Revision angegeben." + +#: admin/revisions.php:56 +msgid "Past" +msgstr "Bisher" + +#: admin/revisions.php:57 +msgid "Pending" +msgstr "Ausstehend" + +#: admin/revisions.php:58 rvy_init.php:391 +msgid "Scheduled" +msgstr "Geplant" + +#: admin/revisions.php:118 +#, php-format +msgid "Revisions of %s" +msgstr "Revisionen von %s" + +#: admin/revisions.php:144 +msgid "The requested revision does not exist." +msgstr "The gesuchte Revision existiert nicht." + +#: admin/revisions.php:214 +msgid "Past Revisions" +msgstr "Bisherige Revisionen" + +#: admin/revisions.php:227 +#, fuzzy, php-format +#| msgid "%1$s %2$s Revisions" +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "%1$s %2$s Revisionen" + +#: admin/revisions.php:247 +#, php-format +msgid "no %s revisions available." +msgstr "Keine %s Revisionen verfügbar." + +#: front_rvy.php:262 +#, fuzzy, php-format +#| msgid "View %s" +msgid "%sView Queue%s" +msgstr "Siehe %s" + +#: front_rvy.php:271 +#, fuzzy, php-format +#| msgid "%sCompare%s%sView Published Post%s" +msgid "%sCompare%s%sView Published Post%s" +msgstr "%sVergleichen%s%s Veröffentlichten Beitrag ansehen%s" + +#: front_rvy.php:285 +#, fuzzy, php-format +#| msgid "View published post" +msgid "%sView Published Post%s" +msgstr "Siehe veröffentlichte Beiträge" + +#: front_rvy.php:348 front_rvy.php:368 front_rvy.php:378 +msgid "Publish now" +msgstr "Jetzt veröffentlichen" + +#: front_rvy.php:352 front_rvy.php:370 +#, fuzzy, php-format +#| msgid "This is a Pending Revision. %s %s %s" +msgid "This is a %s. %s %s %s" +msgstr "" +"Dies ist eine ausstehende Revision (vorgesehenes Veröffentlichungsdatum: " +"%s). %s %s %s" + +#: front_rvy.php:364 +#, fuzzy, php-format +#| msgid "This is a Pending Revision (requested publish date: %s). %s %s %s" +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "" +"Dies ist eine ausstehende Revision (vorgesehenes Veröffentlichungsdatum: " +"%s). %s %s %s" + +# ? +#: front_rvy.php:379 +#, fuzzy, php-format +#| msgid "This is a Scheduled Revision (for publication on %s). %s %s %s" +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "Dies ist eine geplante Revision (Veröffentlichung am %s). %s %s %s" + +#: front_rvy.php:391 +#, php-format +msgid "This is the Current Revision. %s" +msgstr "Dies ist die aktuelle Revision. %s" + +#: front_rvy.php:397 +msgid "Restore" +msgstr "Wiederherstellen" + +#: front_rvy.php:398 +#, php-format +msgid "This is a Past Revision (from %s). %s %s" +msgstr "Dies ist eine vergangene Revision (vom %s). %s %s" + +#: includes/CoreAdmin.php:74 +#, fuzzy +#| msgid "About PublishPress Revisions" +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "Über PublishPress Revisionen" + +#: includes/CoreAdmin.php:79 +msgid "Enhance the power of PublishPress Revisions with the Pro version:" +msgstr "" + +#: includes/CoreAdmin.php:82 +msgid "Elementor integration" +msgstr "" + +#: includes/CoreAdmin.php:83 +msgid "Divi Builder integration" +msgstr "" + +#: includes/CoreAdmin.php:84 +#, fuzzy +#| msgid "Beaver Builder Settings" +msgid "Beaver Builder integration" +msgstr "Beaver Builder Einstellungen" + +#: includes/CoreAdmin.php:85 +msgid "WooCommerce: Product Variation revisions" +msgstr "" + +#: includes/CoreAdmin.php:86 +#, fuzzy +#| msgid "Strip html tags out of difference display" +msgid "ACF custom field revision, difference display" +msgstr "HTML Tags aus Gegenüberstellung entfernen" + +#: includes/CoreAdmin.php:87 +#, fuzzy +#| msgid "Submit Revision" +msgid "Pods custom field revision" +msgstr "Revision einreichen" + +#: includes/CoreAdmin.php:88 +#, fuzzy +#| msgid "Past Revisions" +msgid "WPML: translate revisions" +msgstr "Bisherige Revisionen" + +#: includes/CoreAdmin.php:99 +#, fuzzy +#| msgid "PublishPress Revisions Settings" +msgid "Need PublishPress Revisions Support?" +msgstr "PublishPress Revisions Einstellungen" + +#: includes/CoreAdmin.php:104 +msgid "If you need help or have a new feature request, let us know." +msgstr "" + +#: includes/CoreAdmin.php:106 +#, fuzzy +#| msgid "Requested for " +msgid "Request Support" +msgstr "Angefragt für " + +#: includes/CoreAdmin.php:115 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" + +#: includes/CoreAdmin.php:117 +msgid "View Knowledge Base" +msgstr "" + +#: lib/debug.php:110 +#, php-format +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "%1$s Abfragen in %2$s Sekunden. %3$s MB verwendet." + +#: revision-creation_rvy.php:172 +msgid "Could not insert revision into the database" +msgstr "Revision konnte nicht in die Datenbank eingefügt werden" + +#: revision-workflow_rvy.php:157 +#, php-format +msgid "[%s] %s Updated" +msgstr "" + +#: revision-workflow_rvy.php:159 +#, php-format +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "" + +#: revision-workflow_rvy.php:161 +#, fuzzy, php-format +msgid "[%s] %s" +msgstr "Dies ist eine ausstehende Revision. %s %s %s" + +#: revision-workflow_rvy.php:163 +#, php-format +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "Vorschau und Genehmigung: " + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "Revision Queue: " + +#: revision-workflow_rvy.php:176 +#, fuzzy, php-format +#| msgid "Editor: " +msgid "Edit %s: " +msgstr "Redakteur: " + +#: revisionary.php:85 +msgid "This plugin can be deleted." +msgstr "Dieses Plugin kann gelöscht werden." + +#: revisionary.php:103 revisionary.php:189 +#, php-format +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s: \"%2$s\")" +msgstr "" +"Eine weitere Kopie von PublishPress Revisions (oder Revisionary) ist bereits " +"aktiviert (Version %1$s: \"%2$s\")" + +#: revisionary.php:105 revisionary.php:191 +#, php-format +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s)" +msgstr "" +"Eine weitere Kopie von PublishPress Revisions (oder Revisionary) ist bereits " +"aktiviert (Version %1$s)" + +#: revisionary.php:210 +#, php-format +msgid "PublishPress Revisions requires PHP version %s or higher." +msgstr "PublishPress Revisions benötigt PHP Version %s oder höher." + +#: revisionary.php:217 +#, php-format +msgid "PublishPress Revisions requires WordPress version %s or higher." +msgstr "PublishPress Revisions benötigt Wordpress Version %s oder höher." + +#: rvy_init.php:127 +msgid "Every 2 Minutes" +msgstr "" + +#: rvy_init.php:289 rvy_init.php:301 +msgid "Working Copy" +msgstr "" + +#: rvy_init.php:290 +msgid "Create Working Copy" +msgstr "" + +#: rvy_init.php:292 +msgid "Creating Working Copy..." +msgstr "" + +#: rvy_init.php:293 +msgid "Working Copy ready" +msgstr "" + +#: rvy_init.php:294 rvy_init.php:312 +#, fuzzy +#| msgid "Approve saved changes" +msgid "Approve Changes" +msgstr "Gespeicherte Änderungen genehmigen" + +#: rvy_init.php:296 rvy_init.php:314 +#, fuzzy +#| msgid "Approve saved changes" +msgid "Approving Changes..." +msgstr "Gespeicherte Änderungen genehmigen" + +#: rvy_init.php:297 rvy_init.php:315 rvy_init.php:333 +#, fuzzy +#| msgid "Publish now" +msgid "Publish Changes" +msgstr "Jetzt veröffentlichen" + +#: rvy_init.php:298 rvy_init.php:316 rvy_init.php:334 rvy_init.php:354 +#: rvy_init.php:371 rvy_init.php:388 +msgid "Save Revision" +msgstr "Revision speichern" + +#: rvy_init.php:300 +msgid "Working Copies" +msgstr "" + +#: rvy_init.php:307 rvy_init.php:319 +msgid "Change Request" +msgstr "" + +#: rvy_init.php:308 +msgid "Submit Change Request" +msgstr "" + +#: rvy_init.php:310 +#, fuzzy +#| msgid "Compare Changes" +msgid "Submitting Changes..." +msgstr "Änderungen vergleichen" + +#: rvy_init.php:311 +#, fuzzy +#| msgid "Submitted " +msgid "Changes Submitted" +msgstr "Eingereicht " + +#: rvy_init.php:318 +msgid "Change Requests" +msgstr "" + +#: rvy_init.php:321 +#, fuzzy +#| msgid "Enable Pending Revisions" +msgid "Enable Change Requests" +msgstr "Aktiviere ausstehende Revisionen" + +#: rvy_init.php:326 rvy_init.php:337 +#, fuzzy +#| msgid "Scheduled" +msgid "Scheduled Change" +msgstr "Geplant" + +#: rvy_init.php:327 rvy_init.php:328 rvy_init.php:331 rvy_init.php:332 +#, fuzzy +#| msgid "Schedule Revision" +msgid "Schedule Changes" +msgstr "Revision planen" + +#: rvy_init.php:329 +#, fuzzy +#| msgid "Schedule Revision" +msgid "Scheduling Changes..." +msgstr "Revision planen" + +#: rvy_init.php:330 +msgid "Changes are Scheduled." +msgstr "" + +#: rvy_init.php:336 +#, fuzzy +#| msgid "Scheduled" +msgid "Scheduled Changes" +msgstr "Geplant" + +#: rvy_init.php:346 +#, fuzzy +#| msgid "Submit Revision" +msgid "Unsubmitted Revision" +msgstr "Revision einreichen" + +#: rvy_init.php:347 rvy_init.php:348 +#, fuzzy +#| msgid "Save Revision" +msgid "New Revision" +msgstr "Revision speichern" + +#: rvy_init.php:349 +#, fuzzy +#| msgid "Pending Revision" +msgid "Creating Revision..." +msgstr "Ausstehende Revision" + +#: rvy_init.php:350 +#, fuzzy +#| msgid "Revision updated." +msgid "The Revision is ready to edit." +msgstr "Revision aktualisiert." + +#: rvy_init.php:350 +#, fuzzy +#| msgid "Revision updated." +msgid "Revision ready to edit." +msgstr "Revision aktualisiert." + +#: rvy_init.php:351 rvy_init.php:368 rvy_init.php:385 +msgid "Approve Revision" +msgstr "Revision genehmigen" + +#: rvy_init.php:353 rvy_init.php:370 rvy_init.php:387 +msgid "Publish Revision" +msgstr "Revision veröffentlichen" + +#: rvy_init.php:356 +#, fuzzy +#| msgid "Submit Revision" +msgid "Unsubmitted Revisions" +msgstr "Revision einreichen" + +#: rvy_init.php:357 +#, fuzzy +#| msgid "Submitted " +msgid "Not Submitted" +msgstr "Eingereicht " + +#: rvy_init.php:363 +#, fuzzy +#| msgid "Submit Revision" +msgid "Submitted Revision" +msgstr "Revision einreichen" + +#: rvy_init.php:364 rvy_init.php:496 +msgid "Submit Revision" +msgstr "Revision einreichen" + +#: rvy_init.php:366 +#, fuzzy +#| msgid "Submit Revision" +msgid "Submitting Revision..." +msgstr "Revision einreichen" + +#: rvy_init.php:367 +#, fuzzy +#| msgid "%s revision published." +msgid "The Revision is Submitted" +msgstr "" +"Die geplante Revision, die Sie für %1$s \"%2$s\" eingereicht haben, wurde " +"genehmigt." + +#: rvy_init.php:367 +#, fuzzy +#| msgid "%s revision published." +msgid "Revision Submitted" +msgstr "%s Revision veröffentlicht." + +#: rvy_init.php:373 +#, fuzzy +#| msgid "Submit Revision" +msgid "Submitted Revisions" +msgstr "Revision einreichen" + +#: rvy_init.php:374 +#, fuzzy +#| msgid "Submitted " +msgid "Submitted" +msgstr "Eingereicht " + +#: rvy_init.php:380 +msgid "Scheduled Revision" +msgstr "Geplante Revision" + +#: rvy_init.php:381 rvy_init.php:382 +#, fuzzy +#| msgid "Scheduled Revision" +msgid "Schedule Revision" +msgstr "Revision planen" + +#: rvy_init.php:383 +#, fuzzy +#| msgid "Scheduled Revision" +msgid "Scheduling Revision..." +msgstr "Geplante Revision" + +#: rvy_init.php:384 +#, fuzzy +#| msgid "%s revision published." +msgid "The Revision is Scheduled" +msgstr "%s Revision veröffentlicht." + +#: rvy_init.php:384 +#, fuzzy +#| msgid "%s revision published." +msgid "Revision Scheduled" +msgstr "%s Revision veröffentlicht." + +#: rvy_init.php:390 +msgid "Scheduled Revisions" +msgstr "Geplante Revisionen" + +#: rvy_init.php:489 +msgid "Revised By" +msgstr "Überarbeitet von" + +#: rvy_init.php:490 +#, fuzzy +#| msgid "Revision updated." +msgid "Revision Date" +msgstr "Revision aktualisiert." + +#: rvy_init.php:491 +msgid "Post Author" +msgstr "Beitrags-Autor" + +#: rvy_init.php:492 +msgid "Published Post" +msgstr "Veröffentlichter Beitrag" + +#: rvy_init.php:497 +#, fuzzy +#| msgid "Compare Changes" +msgid "Submit Changes" +msgstr "Änderungen vergleichen" + +#: rvy_init.php:690 rvy_init.php:702 +msgid "Revisor" +msgstr "Prüfer" + +#: rvy_init.php:1129 +msgid "Revision Workflow" +msgstr "Revisions Workflow" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:212 +msgid "" +"This plugin is outdated. You already have a more recent version installed. " +"Please remove this version." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:243 +#, php-format +msgid "" +"This plugin is not installed in the standard folder. The current path is %s " +"but it is expected to be %s." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:269 +#, php-format +msgid "" +"You have activated multiple instances of %s. Please keep only one activated " +"and remove the others." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:289 +#, php-format +msgid "Please deactivate %s when %s is activated." +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:332 +#, php-format +msgid "" +"Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +"been useful. Please could you quickly leave a 5-star rating on WordPress." +"org? It really does help to keep %1$s growing." +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:342 +msgid "1 week" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:350 +msgid "1 month" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:361 +msgid "3 months" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:615 +#, php-format +msgid "Click here to add your rating for %s" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:621 +msgid "Maybe later" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:626 +msgid "I already did" +msgstr "" + +#: vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php:129 +msgid "Amazing! We are redirecting you to our site..." +msgstr "" + +#, fuzzy, php-format +#~| msgid "" +#~| "Revisionary is now PublishPress Revisions! Note the new " +#~| "Revisions menu and %sRevision Queue%s screen, where Pending and " +#~| "Scheduled Revisions are listed. %s" +#~ msgid "" +#~ "Revisionary is now PublishPress Revisions! Note the new " +#~ "Revisions menu and %sRevision Queue%s screen, where Revisions are listed. " +#~ "%s" +#~ msgstr "" +#~ "Revisionary ist nun PublishPress Revisions! Im Revisions-" +#~ "Menü und am %sRevision Queue%s Screen werden ausstehende und geplante " +#~ "Revisionen aufgelistet. %s" + +#~ msgid "Dismiss" +#~ msgstr "Ausblenden" + +#~ msgid "PublishPress Revisions Documentation" +#~ msgstr "PublishPress Revisions Dokumentation" + +#~ msgid "Contact the PublishPress team" +#~ msgstr "Kontaktiere das PublishPress Team" + +#~ msgid "Filter by date" +#~ msgstr "Nach Datum filtern" + +#~ msgid "All dates" +#~ msgstr "Alle Daten" + +#, fuzzy +#~| msgid "Approve saved changes" +#~ msgid "Save Changes" +#~ msgstr "Einstellungen speichern" + +#~ msgid "Revert to Defaults" +#~ msgstr "Zurück auf Standardeinstellungen" + +#~ msgid "Apply" +#~ msgstr "Übernehmen" + +#, php-format +#~ msgid "%1$s (%2$s)" +#~ msgstr "%1$s (%2$s)" + +#~ msgid "" +#~ "This revision is very new, preview may not be synchronized with theme." +#~ msgstr "" +#~ "Diese Revision ist neu, die Voransicht ist eventuell noch nicht mit dem " +#~ "Theme synchronisiert." + +#~ msgid "Reload" +#~ msgstr "Neuladen" + +#~ msgid "Role Definition" +#~ msgstr "Rollendefinition" + +#, fuzzy +#~| msgid "Revision Slug" +#~ msgid "Revision Statuses" +#~ msgstr "Revisions-Slug" + +#~ msgid "Email Notification" +#~ msgstr "Email-Benachrichtigungen" + +#~ msgid "Update »" +#~ msgstr "Aktualisieren »" + +#, fuzzy, php-format +#~| msgid "A pending revision to the %1$s \"%2$s\" has been submitted." +#~ msgid "A %s to the %1$s \"%2$s\" has been updated." +#~ msgstr "Eine ausstehende Revision zu %1$s \"%2$s\" wurde eingereicht." + +#, fuzzy, php-format +#~| msgid "Submission" +#~ msgid "[%s] %s Submission" +#~ msgstr "Einreichung" + +#, fuzzy, php-format +#~| msgid "A pending revision to the %1$s \"%2$s\" has been submitted." +#~ msgid "A %s to the %1$s \"%2$s\" has been submitted." +#~ msgstr "Eine ausstehende Revision zu %1$s \"%2$s\" wurde eingereicht." + +#, php-format +#~ msgid "" +#~ "For more details on setting up PublishPress Revisions, %sread this guide" +#~ "%s." +#~ msgstr "" +#~ "Für mehr Details zum Aufsetzen von PublishPress Revisions, %slesen Sie " +#~ "diese Anleitung%s." + +#, php-format +#~ msgid "" +#~ "Welcome to PublishPress Revisions! Here's how it " +#~ "works:%s
  • \"Contributors\" can submit revisions to their published " +#~ "posts.
  • \"Revisors\" can submit revisions to posts and pages " +#~ "published by others.
  • \"Authors\", \"Editors\" and \"Administrators" +#~ "\" can approve revisions or schedule their own revisions.
  • %s%s%s" +#~ msgstr "" +#~ "Willkommen bei PublishPress Revisions! So funktioniert " +#~ "es:%s
  • \"Mitwirkende\" können Revisionen ihrer veröffentlichten Posts " +#~ "erstellen.
  • \"Prüfer\" können Revisionen zu Beiträgen und Seiten, " +#~ "die von anderen veröffentlicht wurden
  • \"Autoren\", \"Redakteure\" " +#~ "und \"Administratoren\" können Revisionen genehmigen oder ihre eigenen " +#~ "planen.
  • %s%s%s" + +#~ msgid "Submission" +#~ msgstr "Einreichung" + +#, fuzzy, php-format +#~| msgid "%sMy Revisions%s(%s)" +#~ msgid "%sMy Copies & Changes%s (%s)" +#~ msgstr "%sMeine Revisionen%s(%s)" + +#, fuzzy, php-format +#~| msgid "Revisions: %s" +#~ msgid "%sMy Revisions%s (%s)" +#~ msgstr "%sMeine Revisionen%s(%s)" + +#, php-format +#~ msgid "%sMy Published Posts%s(%s)" +#~ msgstr "%sMeine veröffentlichten Beiträge%s (%s)" + +#, fuzzy +#~| msgid "Submit Scheduled Revision" +#~ msgid "Submit Change Schedule" +#~ msgstr "Geplante Revision einreichen" + +#, php-format +#~ msgid "Edit %s Revision" +#~ msgstr "%s Revision bearbeiten" + +#, fuzzy +#~| msgid "View / Publish" +#~ msgid "Preview / Publish" +#~ msgstr "Ansehen / Veröffentlichen" + +#, fuzzy +#~| msgid "Preview" +#~ msgid "view" +#~ msgstr "Ansehen" + +#, fuzzy, php-format +#~| msgid "List" +#~ msgid "%sList%s" +#~ msgstr "Auflisten" + +#, fuzzy +#~| msgid "Enable Scheduled Revisions" +#~ msgid "Enable Scheduled Changes" +#~ msgstr "Aktiviere geplante Revisionen" + +#, fuzzy +#~| msgid "" +#~| "When a scheduled revision is published, also update the publish date." +#~ msgid "" +#~ "When a scheduled change is published, update post publish date to current " +#~ "time." +#~ msgstr "" +#~ "Wenn eine geplante Revision veröffentlicht wird, dann aktualisiert sich " +#~ "auch das Veröffentlichungsdatum." + +#, fuzzy +#~| msgid "" +#~| "When a scheduled revision is published, also update the publish date." +#~ msgid "" +#~ "When a scheduled change is published, update post modified date to " +#~ "current time." +#~ msgstr "" +#~ "Wenn eine geplante Revision veröffentlicht wird, dann aktualisiert sich " +#~ "auch das Veröffentlichungsdatum." + +#, fuzzy, php-format +#~| msgid "%sScheduled Revisions: %s" +#~ msgid "%sScheduled Changes: %s" +#~ msgstr "%sGeplante Revisionen: %s" + +#, fuzzy +#~| msgid "Approve saved changes" +#~ msgid "View / Approve saved changes" +#~ msgstr "Gespeicherte Änderungen genehmigen" + +#, fuzzy +#~| msgid "View unsaved changes" +#~ msgid "View / Submit saved changes" +#~ msgstr "Ungesicherte Änderungen ansehen" + +#, php-format +#~ msgid "" +#~ " %s Revision Edit" +#~ msgstr "" +#~ " %s " +#~ "Revisionsbearbeitung" + +#, fuzzy, php-format +#~| msgid "" +#~| " %s Pending Revision" +#~ msgid "" +#~ " %s Change Request" +#~ msgstr "" +#~ " %s Ausstehende " +#~ "Revision" + +#, fuzzy, php-format +#~| msgid "" +#~| " %s Scheduled " +#~| "Revision" +#~ msgid "" +#~ " %s Scheduled Change" +#~ msgstr "" +#~ " %s Geplante " +#~ "Revision" + +#, php-format +#~ msgid "%sView Published Post%s" +#~ msgstr "%s Veröffentlichten Beitrag ansehen%s" + +#, fuzzy, php-format +#~| msgid "This is a Pending Revision. %s %s %s" +#~ msgid "This is a Working Copy. %s %s %s" +#~ msgstr "Dies ist eine ausstehende Revision. %s %s %s" + +#~ msgid "" +#~ "Autosave disabled when editing a published post/page to create a pending " +#~ "revision." +#~ msgstr "" +#~ "Automatisches Speichern ist deaktiviert während der Bearbeitung eines " +#~ "veröffentlichten Beitrags, um eine ausstehende Revision erstellen zu " +#~ "können." + +#~ msgid "Sorry, an error occurred while attempting to submit your revision!" +#~ msgstr "Ein Fehler ist aufgetreten beim dem Einreichen der Revision!" + +#~ msgid "Pending Revision Created" +#~ msgstr "Ausstehende Revision erstellt" + +#~ msgid "Sorry, an error occurred while attempting to schedule your revision!" +#~ msgstr "" +#~ "Ein Problem ist aufgetreten während dem Versuch die Revision zu planen!" + +#~ msgid "Revision Scheduling Error" +#~ msgstr "Revision-Planungs Fehler" + +#~ msgid "Scheduled Revision Created" +#~ msgstr "Geplante Revision erstellt" + +#, php-format +#~ msgid "Invalid taxonomy: %s" +#~ msgstr "Ungültige Taxonomy: %s" + +#~ msgid "Invalid page template." +#~ msgstr "Ungültiges Seiten Template." + +#, php-format +#~ msgid "[%s] Pending Revision Notification" +#~ msgstr "[%s] Ausstehende Revisions-Nachricht" + +#~ msgid "Sorry, an error occurred while attempting to save your revision." +#~ msgstr "Ein Problem ist aufgetreten während dem Speichern ihrer Revision." + +#~ msgid "Your modification was saved as a Scheduled Revision." +#~ msgstr "Ihre Änderungen wurden als geplante Revision übernommen." + +#~ msgid "Keep editing the revision" +#~ msgstr "Revision weiter bearbeiten" + +#~ msgid "Go back to schedule another revision" +#~ msgstr "Zurück gehen um eine weitere Revision zu planen" + +#~ msgid "View Revision Queue" +#~ msgstr "Revision Queue ansehen" + +#~ msgid "Your modification has been saved for editorial review." +#~ msgstr "Ihre Änderungen wurden zur redaktionellen Prüfung gespeichert." + +#~ msgid "" +#~ "If approved by an editor, it will be published on the date you specified." +#~ msgstr "" +#~ "Wenn durch einen Redakteur genehmigt, wird sie an dem spezifizierten " +#~ "Datum veröffentlicht." + +#~ msgid "It will be published when an editor approves it." +#~ msgstr "Sie wird veröffentlicht wenn ein Redakteur sie genehmigt." + +#~ msgid "Go back to submit another revision" +#~ msgstr "Zurück gehen um eine andere Revision zu erstellen" + +#~ msgid "Return to Edit Posts" +#~ msgstr "Zurück zu: Beiträge bearbeiten" + +#~ msgid "Return to Edit Pages" +#~ msgstr "Zurück zu: Seiten bearbeiten" + +#, php-format +#~ msgid "Return to Edit %s" +#~ msgstr "Zurück zu: %s bearbeiten" + +#~ msgid "Invalid featured media ID." +#~ msgstr "Ungültige Beitragsbild ID." + +#~ msgid "Pending Revisions" +#~ msgstr "Ausstehende Revisionen" + +#, php-format +#~ msgid "Published on: %s" +#~ msgstr "Veröffentlicht am: %s" + +#, php-format +#~ msgid "Schedule for: %s" +#~ msgstr "Geplant für: %s" + +#~ msgid "Save as Pending Revision" +#~ msgstr "Als ausstehende Revision speichern" + +#~ msgid "Do not publish current changes yet, but save to Revision Queue" +#~ msgstr "" +#~ "Momentane Änderungen noch nicht veröffentlichen, aber in der Revision " +#~ "Queue einreihen" + +#, php-format +#~ msgid "%s (revision)" +#~ msgstr "%s (Revision)" + +#~ msgid "Enter additional User Names or IDs (comma-separate)" +#~ msgstr "Zusätzliche Nutzernamen oder IDs eingeben (kommagetrennt)" + +#~ msgid "Publishers to Notify of Your Revision" +#~ msgstr "Von deiner Revision zu benachrichtigende Verleger" + +#~ msgid "Prevent Revisors from editing others' revisions" +#~ msgstr "Hindern sie Prüfer daran, die Revisionen anderer zu bearbeiten" + +#~ msgid "Prevent Revisors from viewing others' revisions" +#~ msgstr "Hindern sie Prüfer daran, die Revisionen anderer zu ansehen" + +#, php-format +#~ msgid "" +#~ "Enable Contributors to submit revisions to their own published content. " +#~ "Revisors and users who have the edit_others (but not edit_published) " +#~ "capability for the post type can submit revisions to other user's " +#~ "content. These Pending Revisions are listed in %sRevision Queue%s." +#~ msgstr "" +#~ "Mitwirkenden erlauben Revisionen für ihre eigenen veröffentlichten " +#~ "Inhalte einzureichen. Prüfer und Nutzer, die die edit_others (aber nicht " +#~ "edit_published) Berechtigung für den Beitragstyp haben, können Revisionen " +#~ "der Inhalte anderer Nutzer einreichen. Diese ausstehenden Revisionen sind " +#~ "in der %sRevision Queue%s aufgelistet." + +#~ msgid "When a pending revision is published, also update the publish date." +#~ msgstr "" +#~ "Wenn eine ausstehende Revision veröffentlicht wird, dann aktualisiere " +#~ "auch das Veröffentlichungsdatum." + +#~ msgid "" +#~ "Note: \"by default\" means Pending Revision creators can customize email " +#~ "notification recipients before submitting. Eligibile \"Publisher\" email " +#~ "recipients are members of the Pending Revision Monitors group who " +#~ "also have the ability to publish the revision. If not " +#~ "explicitly defined, the Monitors group is all users with a primary WP " +#~ "role of Administrator or Editor." +#~ msgstr "" +#~ "Beachten Sie: \"Standardmäßig\" bedeutet, dass Ersteller ausstehender " +#~ "Revisionen Email-Benachrichtigungen vor dem Senden bearbeiten können. " +#~ "Berechtigte \"Verleger\" Email-Empfänger sind Mitglieder der Gruppe zur " +#~ "Überwachung ausstehender Revisionen, welche ebenfalls " +#~ "die Berechtigung besitzt die Revision zu veröffentlichen. Wenn nicht " +#~ "explizit definiert, besteht die Überwachungsgruppe aus primären WP " +#~ "Nutzerrollen wie Administratoren oder Redakteuren." + +#, php-format +#~ msgid "" +#~ "Note: \"by default\" means Pending Revision creators can customize email " +#~ "notification recipients before submitting. For more flexibility in " +#~ "moderation and notification, install the %1$s PressPermit Pro%2$s plugin." +#~ msgstr "" +#~ "Beachten Sie: \"Standardmäßig\" bedeutet, dass Ersteller ausstehender " +#~ "Revisionen Email-Benachrichtigungen vor dem Senden bearbeiten können. Für " +#~ "mehr Flexibilität bei der Moderation und Benachrichtigung, installieren " +#~ "sie das %1$s PressPermit Pro%2$s Plugin." + +#~ msgid "Do not schedule current changes yet, but save to Revision Queue" +#~ msgstr "Noch nicht speichern, aber in Revision Queue einreihen" + +#~ msgid "Workflow…" +#~ msgstr "Workflow…" + +#, php-format +#~ msgid "%sPending Revisions: %s" +#~ msgstr "%sAusstehende Revisionen: %s" + +#, php-format +#~ msgid "Your site is configured to keep only the last %s revisions." +#~ msgstr "" +#~ "Diese Seite ist konfiguriert nur die letzten %s Revisionen zu behalten." + +#, php-format +#~ msgid "Save as %s" +#~ msgstr "Speichern als %s" + +#~ msgid "Preview Changes" +#~ msgstr "Vorausschau der Änderungen" + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "Cancel" +#~ msgstr "Abbrechen" + +#~ msgid "Visibility:" +#~ msgstr "Sichtbarkeit:" + +#~ msgid "Public, Sticky" +#~ msgstr "Öffentlich, Stick" + +#~ msgid "Public" +#~ msgstr "Öffentlich" + +#, php-format +#~ msgid "%s, Sticky" +#~ msgstr "%s, Sticky" diff --git a/wp-content/plugins/revisionary/languages/revisionary-en_US.mo b/wp-content/plugins/revisionary/languages/revisionary-en_US.mo new file mode 100644 index 0000000000000000000000000000000000000000..f27c77f15a1801f4a5da2511869ed9bffaa4e458 GIT binary patch literal 831 zcmaJ;!H&}~5G{gJZgA!>NE~)09MW_Pi$hnarHfYEifG#+ZkC%2i6ONu+u61svcI?A zg43v*OTm)m8NYe+=Gl+0UOe>tdgk|Qzuz{AU+>!EaK3!r>yai;jrxt5BR4tufyN3Y zDWvtf61GeYS_^l0FPdu`+@V&+k-05IPR4a%$x=}WX52cmG+f$>J7p-`dWM8CmIkGT z&wrZqi*9@Bre~O`&6VfLqUHsXCGri0sVo{%I9o~KFo%WX4()j`znM?F(fVN&Oq6se zz2;sc1&2HLURPYm1hSGFi*B@9UX#nNu9@u@8Zwoc%7rW_T&{%+((g+$G02^FN4|PB z3UL$Cbu(T9Rn`vU%N}tW~_9Z%2S_0?9|8HqUNro5QhHt8%i|or?%t4AdJGkM`kKh z-LJ&qF!Zjrnhe8_2mI&;xyj1ZcO;ST*$FK=pihD48zE1EF@>z+)}lQL4=4zkRdxOk Y{DMLy)~Be`-GP=ja~)d{ZB)?v3+`SB=l}o! literal 0 HcmV?d00001 diff --git a/wp-content/plugins/revisionary/languages/revisionary-en_US.po b/wp-content/plugins/revisionary/languages/revisionary-en_US.po new file mode 100644 index 000000000..b86734f72 --- /dev/null +++ b/wp-content/plugins/revisionary/languages/revisionary-en_US.po @@ -0,0 +1,1917 @@ +msgid "" +msgstr "" +"Project-Id-Version: PublishPress Revisions\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-06-29 15:20-0400\n" +"PO-Revision-Date: 2023-06-29 15:20-0400\n" +"Last-Translator: Kevin Behrens \n" +"Language-Team: English (United States)\n" +"Language: en_US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_c;__ngettext;_n;rvy_po_trigger;__awp;_x;_ex;" +"esc_html__;esc_html_e\n" +"X-Poedit-Basepath: ..\n" +"X-Generator: Poedit 3.0.1\n" +"X-Loco-Version: 2.5.2; wp-5.7.1\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPath-1: admin\n" +"X-Poedit-SearchPath-2: classes\n" +"X-Poedit-SearchPath-3: includes\n" +"X-Poedit-SearchPath-4: lib\n" +"X-Poedit-SearchPathExcluded-0: includes-pro\n" + +#: admin/RevisionEditSubmitMetabox.php:62 +#: admin/class-list-table-archive.php:706 admin/class-list-table_rvy.php:1284 +msgid "Delete Revision" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:64 +msgid "Move to Trash" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:124 +#: admin/RevisionEditSubmitMetabox.php:127 +#: admin/class-list-table-archive.php:738 admin/class-list-table_rvy.php:702 +#: admin/class-list-table_rvy.php:1303 admin/history_rvy.php:1072 +#: admin/history_rvy.php:1167 admin/post-edit_rvy.php:98 +#: admin/post-editor-workflow-ui_rvy.php:51 +#: admin/post-editor-workflow-ui_rvy.php:91 +#: admin/post-editor-workflow-ui_rvy.php:187 admin/revision-ui_rvy.php:260 +#: admin/revision-ui_rvy.php:302 +msgid "Preview" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:125 admin/post-edit_rvy.php:113 +msgid "View / moderate saved revision" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:128 admin/post-edit_rvy.php:116 +msgid "View saved revision" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:150 +msgid "Status:" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:183 +msgid "M j, Y @ G:i" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:188 +#, php-format +msgid "Scheduled for: %s" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:191 +#, php-format +msgid "Publish on: %s" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:194 +#, php-format +msgid "Publish %son approval%s" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:199 admin/admin-posts_rvy.php:189 +#: admin/class-list-table_rvy.php:669 admin/class-list-table_rvy.php:1265 +#: admin/post-editor-workflow-ui_rvy.php:96 +#: admin/post-editor-workflow-ui_rvy.php:188 front_rvy.php:312 +msgid "Edit" +msgstr "" + +#: admin/admin-init_rvy.php:136 admin/admin-init_rvy.php:250 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "" + +#: admin/admin-init_rvy.php:177 +msgid "Sorry, you are not allowed to submit this revision." +msgstr "" + +#: admin/admin-init_rvy.php:215 +msgid "Sorry, you are not allowed to decline this revision." +msgstr "" + +#: admin/admin-init_rvy.php:279 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "" + +#: admin/admin-init_rvy.php:284 +msgid "Error in deleting." +msgstr "" + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "" + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "" + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "" + +#: admin/admin-posts_rvy.php:142 admin/class-list-table-archive.php:387 +#: rvy_init.php:544 +msgid "Revision" +msgstr "" + +#: admin/admin-posts_rvy.php:159 +msgid "Has Revision" +msgstr "" + +#: admin/admin-posts_rvy.php:174 admin/admin_rvy.php:244 +msgid "Revision Queue" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:230 +msgid "PublishPress Revisions Network Settings" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:232 +msgid "PublishPress Revisions Network Defaults" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "" + +#: admin/admin_rvy.php:121 +#, php-format +msgid "" +"Scheduled Revisions are not available because WP-Cron is disabled on this " +"site. See %sRevisions > Settings > Scheduled Revisions%s." +msgstr "" + +#: admin/admin_rvy.php:225 admin/admin_rvy.php:241 +msgid "Revisions" +msgstr "" + +#: admin/admin_rvy.php:249 admin/admin_rvy.php:250 +#: admin/revision-archive_rvy.php:38 +#, fuzzy +msgid "Revision Archive" +msgstr + +#: admin/admin_rvy.php:269 admin/options.php:236 +msgid "PublishPress Revisions Settings" +msgstr "" + +#: admin/admin_rvy.php:269 admin/admin_rvy.php:309 admin/options.php:92 +msgid "Settings" +msgstr "" + +#: admin/admin_rvy.php:276 admin/admin_rvy.php:277 includes/CoreAdmin.php:90 +msgid "Upgrade to Pro" +msgstr "" + +#: admin/admin_rvy.php:349 +#, php-format +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "" + +#: admin/admin_rvy.php:360 +msgid "About" +msgstr "" + +#: admin/admin_rvy.php:362 +msgid "Documentation" +msgstr "" + +#: admin/admin_rvy.php:364 +msgid "Contact" +msgstr "" + +#: admin/agents_checklist_rvy.php:75 +#, php-format +msgid "show current users (%d)" +msgstr "" + +#: admin/agents_checklist_rvy.php:77 +#, php-format +msgid "show eligible users (%d)" +msgstr "" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "" + +#: admin/class-list-table-archive.php:157 +#, fuzzy, php-format +msgid "Revision Author: %s" +msgstr + +#: admin/class-list-table-archive.php:174 +#, php-format +msgid "Post Author: %s" +msgstr "" + +#: admin/class-list-table-archive.php:197 admin/revision-queue_rvy.php:129 +#, php-format +msgid "Search results for \"%s\"" +msgstr "" + +#: admin/class-list-table-archive.php:388 +msgid "Count" +msgstr "" + +#: admin/class-list-table-archive.php:389 admin/class-list-table_rvy.php:521 +msgid "Post Type" +msgstr "" + +#: admin/class-list-table-archive.php:390 rvy_init.php:545 +msgid "Revised By" +msgstr "" + +#: admin/class-list-table-archive.php:391 rvy_init.php:546 +#, fuzzy +msgid "Revision Date" +msgstr + +#: admin/class-list-table-archive.php:392 +msgid "Method" +msgstr "" + +#: admin/class-list-table-archive.php:393 +msgid "Approved By" +msgstr "" + +#: admin/class-list-table-archive.php:394 +msgid "Published Date" +msgstr "" + +#: admin/class-list-table-archive.php:395 +msgid "Published Author" +msgstr "" + +#: admin/class-list-table-archive.php:423 +msgid "just now" +msgstr "" + +#: admin/class-list-table-archive.php:426 +#, php-format +msgid "%s minutes ago" +msgstr "" + +#: admin/class-list-table-archive.php:431 +#, php-format +msgid "%s hours ago" +msgstr "" + +#: admin/class-list-table-archive.php:523 +msgid "Scheduled Rev." +msgstr "" + +#: admin/class-list-table-archive.php:528 +#: admin/class-list-table-archive.php:533 +msgid "Submitted Rev." +msgstr "" + +#: admin/class-list-table-archive.php:535 +msgid "Direct Edit" +msgstr "" + +#: admin/class-list-table-archive.php:589 +#: admin/class-list-table-archive.php:750 admin/class-list-table_rvy.php:682 +msgid "Filter" +msgstr "" + +#: admin/class-list-table-archive.php:596 +msgid "Reset Filters" +msgstr "" + +#: admin/class-list-table-archive.php:619 +msgid "All post types" +msgstr "" + +#: admin/class-list-table-archive.php:655 +msgid "All" +msgstr "" + +#: admin/class-list-table-archive.php:669 +#, fuzzy +msgid "My Revisions" +msgstr + +#: admin/class-list-table-archive.php:707 admin/class-list-table_rvy.php:1285 +#: admin/revision-ui_rvy.php:280 admin/revision-ui_rvy.php:391 +msgid "Delete" +msgstr "" + +#: admin/class-list-table-archive.php:718 +#, fuzzy, php-format +msgid "Compare Changes in %s" +msgstr + +#: admin/class-list-table-archive.php:722 admin/class-list-table_rvy.php:1318 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:138 +#: admin/post-edit_rvy.php:152 +msgid "Compare" +msgstr "" + +#: admin/class-list-table-archive.php:737 admin/class-list-table_rvy.php:1302 +#: admin/post-editor-workflow-ui_rvy.php:187 +msgid "Preview Revision" +msgstr "" + +#: admin/class-list-table-archive.php:749 +#, fuzzy +msgid "List Revisions of this Post" +msgstr + +#: admin/class-list-table-archive.php:834 +msgid "No revisions found." +msgstr "" + +#: admin/class-list-table_rvy.php:520 admin/post-editor-workflow-ui_rvy.php:31 +msgid "Status" +msgstr "" + +#: admin/class-list-table_rvy.php:531 +msgid "Schedule" +msgstr "" + +#: admin/class-list-table_rvy.php:574 admin/class-list-table_rvy.php:1196 +msgid "Y/m/d g:i:s a" +msgstr "" + +#: admin/class-list-table_rvy.php:582 admin/class-list-table_rvy.php:1201 +#: admin/history_rvy.php:985 +#, php-format +msgid "%s ago" +msgstr "" + +#: admin/class-list-table_rvy.php:584 admin/class-list-table_rvy.php:1204 +msgid "Y/m/d g:i a" +msgstr "" + +#: admin/class-list-table_rvy.php:591 +#, php-format +msgid "Scheduled publication: %s" +msgstr "" + +#: admin/class-list-table_rvy.php:594 +#, php-format +msgid "Requested publication: %s" +msgstr "" + +#: admin/class-list-table_rvy.php:598 +msgid "Missed schedule" +msgstr "" + +#: admin/class-list-table_rvy.php:639 admin/history_rvy.php:784 +msgid "No author" +msgstr "" + +#: admin/class-list-table_rvy.php:681 +#, php-format +msgid "View only revisions of %s" +msgstr "" + +#: admin/class-list-table_rvy.php:693 admin/class-list-table_rvy.php:701 +msgid "View published post" +msgstr "" + +#: admin/class-list-table_rvy.php:694 +msgid "View" +msgstr "" + +#: admin/class-list-table_rvy.php:725 +msgid "Compare Past Revisions" +msgstr "" + +#: admin/class-list-table_rvy.php:726 +msgid "History" +msgstr "" + +#: admin/class-list-table_rvy.php:754 +msgid "Show more details" +msgstr "" + +#: admin/class-list-table_rvy.php:979 +msgid "My Activity" +msgstr "" + +#: admin/class-list-table_rvy.php:987 +#, php-format +msgid "All %s" +msgstr "" + +#: admin/class-list-table_rvy.php:1011 front_rvy.php:357 rvy_init.php:365 +#: rvy_init.php:421 +msgid "Submit" +msgstr "" + +#: admin/class-list-table_rvy.php:1014 admin/history_rvy.php:1070 +#: front_rvy.php:354 front_rvy.php:379 rvy_init.php:351 rvy_init.php:369 +#: rvy_init.php:408 rvy_init.php:425 rvy_init.php:442 +msgid "Approve" +msgstr "" + +#: admin/class-list-table_rvy.php:1015 +msgid "Decline" +msgstr "" + +#: admin/class-list-table_rvy.php:1016 +msgid "Publish" +msgstr "" + +#: admin/class-list-table_rvy.php:1019 admin/revision-ui_rvy.php:270 +msgid "Unschedule" +msgstr "" + +#: admin/class-list-table_rvy.php:1023 admin/post-edit-block-ui_rvy.php:86 +#: admin/post-edit_rvy.php:51 +msgid "Delete Permanently" +msgstr "" + +#: admin/class-list-table_rvy.php:1043 +msgid "Filter by category" +msgstr "" + +#: admin/class-list-table_rvy.php:1098 +msgid "Select All" +msgstr "" + +#: admin/class-list-table_rvy.php:1184 +#, php-format +msgid "“%s” (Edit)" +msgstr "" + +#: admin/class-list-table_rvy.php:1274 rvy_init.php:347 +msgid "Copy" +msgstr "" + +#: admin/class-list-table_rvy.php:1317 +msgid "Compare Changes" +msgstr "" + +#: admin/edit-revision-block-ui_rvy.php:20 +msgid "Enable public preview" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:63 +msgid "Publish on approval" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:106 +#, php-format +msgid "Revision updated. %sView Preview%s" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "" + +#: admin/history_rvy.php:189 +#, php-format +msgid "Compare %s of \"%s\"" +msgstr "" + +#: admin/history_rvy.php:195 +msgid "Return to editor" +msgstr "" + +#: admin/history_rvy.php:433 admin/history_rvy.php:436 +msgid "(no title)" +msgstr "" + +#: admin/history_rvy.php:533 admin/options.php:736 +msgid "Post Date" +msgstr "" + +#: admin/history_rvy.php:534 +msgid "Post Parent" +msgstr "" + +#: admin/history_rvy.php:535 +msgid "Menu Order" +msgstr "" + +#: admin/history_rvy.php:536 +msgid "Comment Status" +msgstr "" + +#: admin/history_rvy.php:537 +msgid "Ping Status" +msgstr "" + +#: admin/history_rvy.php:672 +msgid "Page Template" +msgstr "" + +#: admin/history_rvy.php:675 +msgid "Featured Image" +msgstr "" + +#: admin/history_rvy.php:679 +msgid "Beaver Builder Data" +msgstr "" + +#: admin/history_rvy.php:680 +msgid "Beaver Builder Settings" +msgstr "" + +#: admin/history_rvy.php:912 +msgid "Scheduled for " +msgstr "" + +#: admin/history_rvy.php:917 +msgid "Requested for " +msgstr "" + +#: admin/history_rvy.php:922 +msgid "Modified " +msgstr "" + +#: admin/history_rvy.php:927 +#, php-format +msgid "%s%s ago" +msgstr "" + +#: admin/history_rvy.php:927 +#, php-format +msgid "%s%s from now" +msgstr "" + +#: admin/history_rvy.php:938 admin/revision-action_rvy.php:424 +#: admin/revision-action_rvy.php:506 admin/revision-ui_rvy.php:245 +#: front_rvy.php:253 +msgid "M j, Y @ g:i a" +msgstr "" + +#: admin/history_rvy.php:939 +msgid "j M @ g:i a" +msgstr "" + +#: admin/history_rvy.php:983 +msgid "M j, Y @ H:i" +msgstr "" + +#: admin/history_rvy.php:984 +msgid "j M @ H:i" +msgstr "" + +#: admin/history_rvy.php:1070 +msgid "Preview / Approve" +msgstr "" + +#: admin/history_rvy.php:1166 +msgid "Preview / Restore" +msgstr "" + +#: admin/history_rvy.php:1173 +msgid "Manage" +msgstr "" + +#: admin/history_rvy.php:1174 +msgid "List" +msgstr "" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "" + +#: admin/options.php:96 +msgid "Post Types" +msgstr "" + +#: admin/options.php:97 +#, fuzzy +msgid "Revisors" +msgstr + +#: admin/options.php:98 +#, fuzzy +msgid "Statuses" +msgstr + +#: admin/options.php:99 +#, fuzzy +msgid "Revision Creation" +msgstr + +#: admin/options.php:100 admin/options.php:111 +msgid "Revision Submission" +msgstr "" + +#: admin/options.php:102 +msgid "Queue" +msgstr "" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "" + +#: admin/options.php:104 +msgid "Options" +msgstr "" + +#: admin/options.php:105 +msgid "Notifications" +msgstr "" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" + +#: admin/options.php:118 +#, php-format +msgid "Additional role capability required to manage %s" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "" + +#: admin/options.php:120 +#, php-format +msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +msgstr "" + +#: admin/options.php:121 admin/options.php:124 +#, php-format +msgid "Enable %s" +msgstr "" + +#: admin/options.php:122 +msgid "Limit to one active revision per post" +msgstr "" + +#: admin/options.php:123 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a Change Request" +msgstr "" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a revision" +msgstr "" + +#: admin/options.php:126 +msgid "Editing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:127 +msgid "Listing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:128 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" + +#: admin/options.php:129 +msgid "Also notify on Revision Update" +msgstr "" + +#: admin/options.php:130 +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" + +#: admin/options.php:131 +msgid "Hide html tags on Compare Revisions screen" +msgstr "" + +#: admin/options.php:132 +msgid "Use WP-Cron scheduling" +msgstr "" + +#: admin/options.php:133 +msgid "Site uses a custom trigger for WP-Cron tasks" +msgstr "" + +#: admin/options.php:134 +msgid "Asynchronous Publishing" +msgstr "" + +#: admin/options.php:135 admin/options.php:136 +msgid "Update Publish Date" +msgstr "" + +#: admin/options.php:137 admin/options.php:138 +msgid "Update Modified Date" +msgstr "" + +#: admin/options.php:139 +#, php-format +msgid "Email original Author when a %s is submitted" +msgstr "" + +#: admin/options.php:140 +#, php-format +msgid "Email the original Author when a %s is approved" +msgstr "" + +#: admin/options.php:141 +#, php-format +msgid "Email the Revisor when a %s is approved" +msgstr "" + +#: admin/options.php:142 +#, php-format +msgid "Email the original Author when a %s is published" +msgstr "" + +#: admin/options.php:143 +#, php-format +msgid "Email the Revisor when a %s is published" +msgstr "" + +#: admin/options.php:144 +msgid "Enable notification buffer" +msgstr "" + +#: admin/options.php:145 +msgid "All custom post types available to Revisors" +msgstr "" + +#: admin/options.php:146 +msgid "Prevent Revisors from editing other user's drafts" +msgstr "" + +#: admin/options.php:147 +msgid "Display Hints" +msgstr "" + +#: admin/options.php:148 +msgid "Show Preview Links" +msgstr "" + +#: admin/options.php:149 +msgid "Preview Link Type" +msgstr "" + +#: admin/options.php:150 +msgid "Approve Button on Compare Revisions screen" +msgstr "" + +#: admin/options.php:151 +msgid "Copy revision comments to published post" +msgstr "" + +#: admin/options.php:152 +msgid "Compare Past Revisions ordering:" +msgstr "" + +#: admin/options.php:153 +#, php-format +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" + +#: admin/options.php:154 +msgid "On Revision publication, delete Editorial Comments" +msgstr "" + +#: admin/options.php:155 +msgid "Enable deletion queue" +msgstr "" + +#: admin/options.php:161 +#, php-format +msgid "Email designated Publishers when a %s is submitted" +msgstr "" + +#: admin/options.php:162 +#, php-format +msgid "Email designated Publishers when a %s is published" +msgstr "" + +#: admin/options.php:163 +#, php-format +msgid "Email designated Publishers when a %s is approved" +msgstr "" + +#: admin/options.php:165 +#, php-format +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" + +#: admin/options.php:166 +#, php-format +msgid "Email Editors and Administrators when a %s is published" +msgstr "" + +#: admin/options.php:167 +#, php-format +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" + +#: admin/options.php:234 +msgid "PublishPress Revisions Site Settings" +msgstr "" + +#: admin/options.php:264 +msgid "" +"These are the default settings for options which can be " +"adjusted per-site." +msgstr "" + +#: admin/options.php:302 +#, php-format +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress Revisions " +"settings. %s" +msgstr "" + +#: admin/options.php:305 +#, php-format +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" + +#: admin/options.php:308 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" + +#: admin/options.php:318 admin/options.php:320 +#, php-format +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" + +#: admin/options.php:345 +msgid "License" +msgstr "" + +#: admin/options.php:398 +msgid "Enable revision submission for these Post Types:" +msgstr "" + +#: admin/options.php:444 +#, php-format +msgid "%s capabilities" +msgstr "" + +#: admin/options.php:458 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" + +#: admin/options.php:472 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" + +#: admin/options.php:477 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" + +#: admin/options.php:492 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for Approval" +"\", \"Scheduled Revision\"" +msgstr "" + +#: admin/options.php:506 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" + +#: admin/options.php:511 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" + +#: admin/options.php:515 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" + +#: admin/options.php:533 +#, php-format +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" + +#: admin/options.php:555 +#, php-format +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" + +#: admin/options.php:561 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" + +#: admin/options.php:564 admin/options.php:588 +#, php-format +msgid "When a %s is published, update post publish date to current time." +msgstr "" + +#: admin/options.php:567 admin/options.php:591 +#, php-format +msgid "When a %s is published, update post modified date to current time." +msgstr "" + +#: admin/options.php:585 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" + +#: admin/options.php:596 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" + +#: admin/options.php:600 +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" + +#: admin/options.php:605 +msgid "" +"The WP-Cron trigger is disabled, but scheduled tasks are still excecuted " +"using a custom trigger." +msgstr "" + +#: admin/options.php:622 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" + +#: admin/options.php:625 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" + +#: admin/options.php:628 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" + +#: admin/options.php:637 +msgid "Regenerate \"post has revision\" flags" +msgstr "" + +#: admin/options.php:652 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators" +msgstr "" + +#: admin/options.php:664 +msgid "Published Post Slug" +msgstr "" + +#: admin/options.php:664 +msgid "Revision Slug" +msgstr "" + +#: admin/options.php:664 +msgid "Revision ID only" +msgstr "" + +#: admin/options.php:675 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" + +#: admin/options.php:685 +msgid "If disabled, Compare screen links to Revision Preview for approval" +msgstr "" + +#: admin/options.php:707 +#, php-format +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" + +#: admin/options.php:717 +msgid "This may improve compatibility with some plugins." +msgstr "" + +#: admin/options.php:736 +msgid "Modification Date" +msgstr "" + +#: admin/options.php:746 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" + +#: admin/options.php:774 admin/options.php:795 +msgid "Never" +msgstr "" + +#: admin/options.php:774 admin/options.php:795 +msgid "By default" +msgstr "" + +#: admin/options.php:774 admin/options.php:795 +msgid "Always" +msgstr "" + +#: admin/options.php:784 admin/options.php:830 +msgid "select recipients" +msgstr "" + +#: admin/options.php:844 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" + +#: admin/options.php:865 +msgid "Notification Buffer" +msgstr "" + +#: admin/options.php:893 +msgid "Notification Log" +msgstr "" + +#: admin/options.php:922 +msgid "Purge Notification Buffer" +msgstr "" + +#: admin/options.php:928 +msgid "Truncate Notification Log" +msgstr "" + +#: admin/options.php:934 +#, php-format +msgid "Sent in last minute: %d / %d" +msgstr "" + +#: admin/options.php:935 +#, php-format +msgid "Sent in last hour: %d / %d" +msgstr "" + +#: admin/options.php:936 +#, php-format +msgid "Sent in last day: %d / %d" +msgstr "" + +#: admin/options.php:943 +#, php-format +msgid "Seconds until next buffer processing time: %d" +msgstr "" + +#: admin/options.php:953 +msgid "Show Notification Log / Buffer" +msgstr "" + +#: admin/options.php:955 +msgid "Show with message content" +msgstr "" + +#: admin/options.php:966 includes/CoreAdmin.php:85 +msgid "WPML Translation Management" +msgstr "" + +#: admin/options.php:973 +msgid "Sync \"Needs Update\" flags" +msgstr "" + +#: admin/options.php:977 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" + +#: admin/options.php:1015 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" + +#: admin/options.php:1025 +#, php-format +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "" + +#: admin/options.php:1061 +#, php-format +msgid "network-wide control of \"%s\"" +msgstr "" + +#: admin/options.php:1091 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" + +#: admin/post-edit-block-ui_rvy.php:141 admin/post-edit_rvy.php:223 +#: admin/revision-ui_rvy.php:372 +msgid "Author" +msgstr "" + +#: admin/post-edit_rvy.php:26 admin/post-edit_rvy.php:84 +msgid "Current Time" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:35 +msgid "(on approval)" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:51 +#: admin/post-editor-workflow-ui_rvy.php:91 +#, fuzzy +msgid "Preview this Revision" +msgstr + +#: admin/post-editor-workflow-ui_rvy.php:53 +msgid "View / Publish" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:53 +msgid "View / Approve" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:56 +msgid "View / Approve saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:58 +msgid "Preview / Submit" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:58 +msgid "View / Submit" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:59 +msgid "View / Submit saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:67 +msgid "View unsaved changes" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:71 +#, php-format +msgid "%s%s Revision Edit" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:82 +msgid "Revision Submission Error" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:103 +msgid "Approving the Revision..." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:130 rvy_init.php:355 rvy_init.php:373 +#: rvy_init.php:391 rvy_init.php:411 rvy_init.php:428 rvy_init.php:445 +#: rvy_init.php:549 +msgid "Update Revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:188 +#, fuzzy +msgid "Edit Revision" +msgstr + +#: admin/post-editor-workflow-ui_rvy.php:194 +#, php-format +msgid "Update post before creating %s." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:201 +msgid "Error Creating Revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:203 +#: admin/post-editor-workflow-ui_rvy.php:223 +msgid "Update" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:217 +#, php-format +msgid "For custom field changes, edit a scheduled %s." +msgstr "" + +#: admin/revision-action_rvy.php:416 admin/revision-action_rvy.php:502 +#, php-format +msgid "[%s] Revision Approval Notice" +msgstr "" + +#: admin/revision-action_rvy.php:417 +#, php-format +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "" + +#: admin/revision-action_rvy.php:421 +#, php-format +msgid "The submitter was %1$s." +msgstr "" + +#: admin/revision-action_rvy.php:425 admin/revision-action_rvy.php:507 +#, php-format +msgid "It will be published on %s" +msgstr "" + +#: admin/revision-action_rvy.php:429 admin/revision-action_rvy.php:511 +msgid "Preview it here: " +msgstr "" + +#: admin/revision-action_rvy.php:432 admin/revision-action_rvy.php:514 +msgid "Editor: " +msgstr "" + +#: admin/revision-action_rvy.php:434 admin/revision-action_rvy.php:516 +#: admin/revision-action_rvy.php:1339 admin/revision-action_rvy.php:1364 +#: admin/revision-action_rvy.php:1426 +msgid "View it online: " +msgstr "" + +#: admin/revision-action_rvy.php:503 +#, php-format +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "" + +#: admin/revision-action_rvy.php:1335 admin/revision-action_rvy.php:1357 +#, php-format +msgid "[%s] %s Publication Notice" +msgstr "" + +#: admin/revision-action_rvy.php:1336 +#, php-format +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "" + +#: admin/revision-action_rvy.php:1358 +#, php-format +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "" + +#: admin/revision-action_rvy.php:1361 admin/revision-action_rvy.php:1423 +#, php-format +msgid "It was submitted by %1$s." +msgstr "" + +#: admin/revision-action_rvy.php:1418 +#, php-format +msgid "[%s] %s Publication" +msgstr "" + +#: admin/revision-action_rvy.php:1420 +#, php-format +msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +msgstr "" + +#: admin/revision-archive_rvy.php:3 admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "" + +#: admin/revision-archive_rvy.php:8 admin/revision-queue_rvy.php:14 +#, php-format +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "" + +#: admin/revision-archive_rvy.php:23 +#, fuzzy +msgid "Revision for:" +msgstr + +#: admin/revision-queue_rvy.php:46 +#, php-format +msgid "%s revision submitted." +msgstr "" + +#: admin/revision-queue_rvy.php:47 +#, php-format +msgid "%s revision declined." +msgstr "" + +#: admin/revision-queue_rvy.php:48 +#, php-format +msgid "%s revision approved." +msgstr "" + +#: admin/revision-queue_rvy.php:49 +#, php-format +msgid "%s revision unscheduled." +msgstr "" + +#: admin/revision-queue_rvy.php:50 +#, php-format +msgid "%s revision published." +msgstr "" + +#: admin/revision-queue_rvy.php:51 +#, php-format +msgid "%s revision permanently deleted." +msgstr "" + +#: admin/revision-queue_rvy.php:93 +#, php-format +msgid "%s: " +msgstr "" + +#: admin/revision-queue_rvy.php:106 +#, php-format +msgid "of %s" +msgstr "" + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +#, php-format +msgid "%sPost Author: %s" +msgstr "" + +#: admin/revision-queue_rvy.php:121 +#, fuzzy, php-format +msgid "Revision Queue for \"%s\"%s" +msgstr + +#: admin/revision-queue_rvy.php:123 +#, php-format +msgid "Revision Queue %s" +msgstr "" + +#: admin/revision-queue_rvy.php:157 +msgid "Undo" +msgstr "" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "" + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "" + +#: admin/revision-ui_rvy.php:73 +msgid "j F, Y @ g:i a" +msgstr "" + +#: admin/revision-ui_rvy.php:92 +#, php-format +msgid "%1$s (Current)" +msgstr "" + +#: admin/revision-ui_rvy.php:96 +#, php-format +msgid "%1$s (Autosave)" +msgstr "" + +#: admin/revision-ui_rvy.php:102 +msgid "j F, Y, g:i a" +msgstr "" + +#: admin/revision-ui_rvy.php:106 +#, php-format +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" + +#: admin/revision-ui_rvy.php:108 +#, php-format +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "" + +#: admin/revision-ui_rvy.php:260 +#, php-format +msgid "Preview “%s”" +msgstr "" + +#: admin/revision-ui_rvy.php:276 +msgid "The revision will be deleted. Are you sure?" +msgstr "" + +#: admin/revision-ui_rvy.php:332 +#, php-format +msgid "%1$s by %2$s" +msgstr "" + +#: admin/revision-ui_rvy.php:369 +msgid "Modified Date" +msgstr "" + +#: admin/revision-ui_rvy.php:373 +msgid "Actions" +msgstr "" + +#: admin/revision-ui_rvy.php:390 +msgid "Bulk Actions" +msgstr "" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "" + +#: admin/revisions.php:56 +msgid "Past" +msgstr "" + +#: admin/revisions.php:57 +msgid "Pending" +msgstr "" + +#: admin/revisions.php:58 rvy_init.php:447 +msgid "Scheduled" +msgstr "" + +#: admin/revisions.php:119 +#, fuzzy, php-format +msgid "Revisions of %s" +msgstr + +#: admin/revisions.php:149 +msgid "The requested revision does not exist." +msgstr "" + +#: admin/revisions.php:219 +msgid "Past Revisions" +msgstr "" + +#: admin/revisions.php:235 +#, php-format +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "" + +#: admin/revisions.php:256 +#, php-format +msgid "no %s revisions available." +msgstr "" + +#: front_rvy.php:278 +#, php-format +msgid "%sView Queue%s" +msgstr "" + +#: front_rvy.php:287 +#, php-format +msgid "%sCompare%s%sView Published Post%s" +msgstr "" + +#: front_rvy.php:301 +#, php-format +msgid "%sView Published Post%s" +msgstr "" + +#: front_rvy.php:364 front_rvy.php:393 front_rvy.php:409 +msgid "Publish now" +msgstr "" + +#: front_rvy.php:369 front_rvy.php:371 front_rvy.php:397 front_rvy.php:399 +#, php-format +msgid "This is a %s. %s %s %s" +msgstr "" + +#: front_rvy.php:386 front_rvy.php:388 +#, php-format +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "" + +#: front_rvy.php:412 front_rvy.php:414 +#, php-format +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "" + +#: front_rvy.php:429 front_rvy.php:431 +#, php-format +msgid "This is the Current Revision. %s" +msgstr "" + +#: front_rvy.php:438 +msgid "Restore" +msgstr "" + +#: front_rvy.php:441 front_rvy.php:443 +#, php-format +msgid "This is a Past Revision (from %s). %s %s" +msgstr "" + +#: includes/CoreAdmin.php:70 +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "" + +#: includes/CoreAdmin.php:75 +msgid "" +"Upgrade to PublishPress Revisions Pro for integration with key features of " +"these plugins:" +msgstr "" + +#: includes/CoreAdmin.php:78 +msgid "Elementor" +msgstr "" + +#: includes/CoreAdmin.php:79 +msgid "Divi Builder" +msgstr "" + +#: includes/CoreAdmin.php:80 +msgid "Beaver Builder" +msgstr "" + +#: includes/CoreAdmin.php:81 +msgid "Advanced Custom Fields" +msgstr "" + +#: includes/CoreAdmin.php:82 +msgid "Pods" +msgstr "" + +#: includes/CoreAdmin.php:83 +msgid "WooCommerce" +msgstr "" + +#: includes/CoreAdmin.php:84 +msgid "WPML" +msgstr "" + +#: includes/CoreAdmin.php:86 +msgid "plugin integration details..." +msgstr "" + +#: includes/CoreAdmin.php:97 +msgid "Need PublishPress Revisions Support?" +msgstr "" + +#: includes/CoreAdmin.php:102 +msgid "If you need help or have a new feature request, let us know." +msgstr "" + +#: includes/CoreAdmin.php:104 +msgid "Request Support" +msgstr "" + +#: includes/CoreAdmin.php:113 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" + +#: includes/CoreAdmin.php:115 +msgid "View Knowledge Base" +msgstr "" + +#: lib/debug.php:110 +#, php-format +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "" + +#: libraries/internal-vendor/publishpress/instance-protection/core/InstanceChecker.php:212 +msgid "" +"This plugin is outdated. You already have a more recent version installed. " +"Please remove this version." +msgstr "" + +#: libraries/internal-vendor/publishpress/instance-protection/core/InstanceChecker.php:243 +#, php-format +msgid "" +"This plugin is not installed in the standard folder. The current path is " +"%1$s but it is expected to be %2$s." +msgstr "" + +#: libraries/internal-vendor/publishpress/instance-protection/core/InstanceChecker.php:269 +#, php-format +msgid "" +"You have activated multiple instances of %s. Please keep only one activated " +"and remove the others." +msgstr "" + +#: libraries/internal-vendor/publishpress/instance-protection/core/InstanceChecker.php:289 +#, php-format +msgid "Please deactivate %1$s when %2$s is activated." +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:332 +#, php-format +msgid "" +"Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +"been useful. Please could you quickly leave a 5-star rating on WordPress." +"org? It really does help to keep %1$s growing." +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:342 +msgid "1 week" +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:350 +msgid "1 month" +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:361 +msgid "3 months" +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:615 +#, php-format +msgid "Click here to add your rating for %s" +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:621 +msgid "Maybe later" +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-reviews/ReviewsController.php:626 +msgid "I already did" +msgstr "" + +#: libraries/internal-vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php:165 +msgid "Amazing! We are redirecting you to our site..." +msgstr "" + +#: revision-creation_rvy.php:176 +msgid "Could not insert revision into the database" +msgstr "" + +#: revision-workflow_rvy.php:157 +#, php-format +msgid "[%s] %s Updated" +msgstr "" + +#: revision-workflow_rvy.php:159 +#, php-format +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "" + +#: revision-workflow_rvy.php:161 +#, php-format +msgid "[%s] %s" +msgstr "" + +#: revision-workflow_rvy.php:163 +#, php-format +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "" + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "" + +#: revision-workflow_rvy.php:176 +#, php-format +msgid "Edit %s: " +msgstr "" + +#: revisionary.php:101 +msgid "This plugin can be deleted." +msgstr "" + +#: revisionary.php:119 revisionary.php:217 +#, php-format +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s: \"%2$s\")" +msgstr "" + +#: revisionary.php:121 revisionary.php:219 +#, php-format +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s)" +msgstr "" + +#: rvy_init.php:172 +msgid "Every 2 Minutes" +msgstr "" + +#: rvy_init.php:345 rvy_init.php:357 +msgid "Working Copy" +msgstr "" + +#: rvy_init.php:346 +msgid "Create Working Copy" +msgstr "" + +#: rvy_init.php:348 +msgid "Creating Working Copy..." +msgstr "" + +#: rvy_init.php:349 +msgid "Working Copy ready" +msgstr "" + +#: rvy_init.php:350 rvy_init.php:368 +msgid "Approve Changes" +msgstr "" + +#: rvy_init.php:352 rvy_init.php:370 +msgid "Approving Changes..." +msgstr "" + +#: rvy_init.php:353 rvy_init.php:371 rvy_init.php:389 +msgid "Publish Changes" +msgstr "" + +#: rvy_init.php:354 rvy_init.php:372 rvy_init.php:390 rvy_init.php:410 +#: rvy_init.php:427 rvy_init.php:444 +msgid "Save Revision" +msgstr "" + +#: rvy_init.php:356 +msgid "Working Copies" +msgstr "" + +#: rvy_init.php:363 rvy_init.php:375 +msgid "Change Request" +msgstr "" + +#: rvy_init.php:364 +msgid "Submit Change Request" +msgstr "" + +#: rvy_init.php:366 +msgid "Submitting Changes..." +msgstr "" + +#: rvy_init.php:367 +msgid "Changes Submitted" +msgstr "" + +#: rvy_init.php:374 +msgid "Change Requests" +msgstr "" + +#: rvy_init.php:377 +msgid "Enable Change Requests" +msgstr "" + +#: rvy_init.php:382 rvy_init.php:393 +msgid "Scheduled Change" +msgstr "" + +#: rvy_init.php:383 rvy_init.php:384 rvy_init.php:387 rvy_init.php:388 +msgid "Schedule Changes" +msgstr "" + +#: rvy_init.php:385 +msgid "Scheduling Changes..." +msgstr "" + +#: rvy_init.php:386 +msgid "Changes are Scheduled." +msgstr "" + +#: rvy_init.php:392 +msgid "Scheduled Changes" +msgstr "" + +#: rvy_init.php:402 +msgid "Unsubmitted Revision" +msgstr "" + +#: rvy_init.php:403 rvy_init.php:404 +#, fuzzy +msgid "New Revision" +msgstr + +#: rvy_init.php:405 +msgid "Creating Revision..." +msgstr "" + +#: rvy_init.php:406 +msgid "The Revision is ready to edit." +msgstr "" + +#: rvy_init.php:406 +msgid "Revision ready to edit." +msgstr "" + +#: rvy_init.php:407 rvy_init.php:424 rvy_init.php:441 +msgid "Approve Revision" +msgstr "" + +#: rvy_init.php:409 rvy_init.php:426 rvy_init.php:443 +msgid "Publish Revision" +msgstr "" + +#: rvy_init.php:412 +msgid "Unsubmitted Revisions" +msgstr "" + +#: rvy_init.php:413 +msgid "Not Submitted" +msgstr "" + +#: rvy_init.php:419 +msgid "Submitted Revision" +msgstr "" + +#: rvy_init.php:420 rvy_init.php:552 +msgid "Submit Revision" +msgstr "" + +#: rvy_init.php:422 +msgid "Submitting Revision..." +msgstr "" + +#: rvy_init.php:423 +msgid "The Revision is Submitted" +msgstr "" + +#: rvy_init.php:423 +#, fuzzy +msgid "Revision Submitted" +msgstr + +#: rvy_init.php:429 +msgid "Submitted Revisions" +msgstr "" + +#: rvy_init.php:430 +msgid "Submitted" +msgstr "" + +#: rvy_init.php:436 +msgid "Scheduled Revision" +msgstr "" + +#: rvy_init.php:437 rvy_init.php:438 +msgid "Schedule Revision" +msgstr "" + +#: rvy_init.php:439 +msgid "Scheduling Revision..." +msgstr "" + +#: rvy_init.php:440 +msgid "The Revision is Scheduled" +msgstr "" + +#: rvy_init.php:440 +#, fuzzy +msgid "Revision Scheduled" +msgstr + +#: rvy_init.php:446 +msgid "Scheduled Revisions" +msgstr "" + +#: rvy_init.php:547 +msgid "Post Author" +msgstr "" + +#: rvy_init.php:548 +msgid "Published Post" +msgstr "" + +#: rvy_init.php:553 +msgid "Submit Changes" +msgstr "" + +#: rvy_init.php:754 rvy_init.php:766 +msgid "Revisor" +msgstr "" + +#: rvy_init.php:1230 +msgid "Revision Workflow" +msgstr "" + +#, fuzzy, php-format +#~ msgid "%sMy Revisions%s (%s)" +#~ msgstr diff --git a/wp-content/plugins/revisionary/languages/revisionary-es_ES.mo b/wp-content/plugins/revisionary/languages/revisionary-es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..8ace15290e711b0954d82997ad9e88073769f260 GIT binary patch literal 37953 zcmd6w3!Gh7UGFy-`bbNkwDdt?ciOZ`J2OesTH0xwbdpS(LLNghX(_ZMd(PQ2bJ8O}k9pJBnli=wWN71$5tH1-`TfwWrzXopv&$=Xv)bs?X@ArbkVB+ze;3&^e zdVCt($n(XQM$uK^PVo6)4i16e4Nia`0$&O~4W0`QF^MhU4d4sGBcS?w1l0FG27U_s zX;A$?a9I>>0Dls^75qc+dEogkcFz}kybIh!`Fp^dz|VmXfoHrViY^4-27U+lW8f*^ z2SL%}QBeK=0XPT#CCI1IuGrOUf~WGFgV%r$fui$If#-m~0GEk}(*;+!c};<i`kZm48`t@u>gAyNe>=Dtd><$}eI67Y{u0#p{{U*;pS#A5;~emGo-Y7Z z{t|E_I0Bvq9`x@Up!hZiUkZN2iVZv{2}_kfGw2SLr_MGSs5 zcm=5EQBeH&o#5%<9pLl9SAc5w0I2nUH>mc13}oq}$3XGJ?|S?a_&lD!4yxWifoku0 zERyP<4QgF(0L7Ot2ls;qK=t?YU>95h#dkNeI0wN+Q1!n6s=u#*s{b#b#`k=fM)bKI zRQV22^tlT>3w$-G@gMT#hyC+I;MtVF4b(V)$d@1W&yRzm(=UQrhhrfBMPK9}^>;R% zp9j7WJQuviNB%#&hm>I=T#bybe5{^4mf2dcql0RVE(OI0n?TWV2dH^2fSS)6LCxdspxSvCsPTLNRQo>z>ic89{L{Yt zi(rlNzXLVieK$wZ3^)U7yq^Kz41NjJd{c;jG1vhw0N)8-2!06ExSs?^z^6dfd(JJ6 zZ!QJJS2u!h2ls&*=bwNY_tT*4<2OK!<2;njZQvSE?bN_w@O9wJz>k0rfd2rB-YqH% ze*(N7{Jh6AF-mXZ`F2qHWC>J%pY+d9fttq`K+W%~py>K9py+ir!mjd*L5*uID7xGN z&VzeEegEG;(cvjj<9*uWs@vW3i@_IDeiL{Qyc@g<{3UQZ_-Ejy;8o*}URyv^Z*-r> zhe7^}ex84Jg5Ly1?`>P6=zj2C5K=_H4T?U`Ls&+^Nl^571E}$R3|tF-5{$ubfY*U9 z*cL_a1-FAg4E_oD4)E}V!&MBj#q+yCjpI3Yzysh`Q1ksIQ1bLS@CD!(LDA*w;3?o~ zJ6!qMpy+ocC_3K+z69I>iq3PO?8p)D9`OC3#{ErjH+a^a&hNYr6kmT7)Odak)c4P2 z@}l#(pq@8?F9J9F@_Rw`{}3qocm&k=f83XU+&_QTKYtn2eEu)E3Ox7aZk;X!A$7D7 zRR3M@4Dc60^}7V#2YwEe9^Am9iGOYbRc{g$|KAI)1rLF0=RM%5;2(gOfL{bfr+)%3 z15exK-d_b?!}BP35qJ+My0yX6!1sZg_fb&o{3<9u`(se;#1Qiea1(eXI1OG4z6}&z zKj!f_L9O2(`R6|c#dlu?)$eJ0Tz{8?UwsZ^0!6P&U*YJy0en8s+rUY1FSr-{32+1W zk6;2`P2qLm!{CkJlc2u)I;i=}nOP5<1FGKb9^2pu&mRJB20sT%4$ho%d~+u#x*P;y z<>;-T>U|p2x}UN?ieQ~62K9UhJQI8iD7w81{5<&6p!)fqyYNN8kAbMF=zoHzgKO?~ zanX8EbUp&I^wF<^TG!RDWG%p*;Dz864Z>p4`JmSAHQ;-}hrk=ab6@4w zeY?lqp!n}D@OH-f77 z2zW90VNm?~>tGA~45tc_i;3Yh71vReM zfTGvyK=JKwfa15$fSbVI2X6+?e~o*;3l#nC0$&8qgW}`w1vSo(f@95hHIJJQ zxbf`+ckx{J&rg7AZwVCLz5t32e*4ai7uUX^F9QQ^Zc_OzX9&x`8#V4Uk|S4`M1E!!Oww`gTDtw$1Cej zA8iKT!1JrYP2m6V<(H&xJ~x6dqkIC?I{g5s`5gsCr~d+O1z$Xaj|NVIlDj_xc@_N~ zh$@fv&${`(AAE%84}P4JVT>c6ys%!BU-5w+;g!JR5U)r8gC4q3T^PW1!aicRD>K2G!pla6NbrxE6dEjKL>BSS5N2Tn%22 z(7X}c1nvYs0Uid=%-lM>89a~Y9|TVUKMZaLKMIOIUjZdQ-}KLCE;u?|0BYRVf~&wW zQ2eF`kMYsFG=Y!u3o(nz#s=uS4=Jj*n?cm43Gr|7@imy(4t)t%+p!CQX_+oG$ zsP}D9^7jt^{v+U3JTHN&_cZtt@btEm&voEAJnsTEuGfGXe+T?y@Xg>m!TWMIj=u%9 ze%}Hm|L1hv`n(L396aEke+1O{ej8M~UjokszX@u5r+3{rt^)7ic{`}_zY`SQ9tCd% zKMLx*zXCPRZ-SSCr?FU~>y@C^{U%U!+Tx%0fEVz54=6p8ffs@ggXe)i4ywP8fv*8S z3#y-yBW_(cgKB>Y)cEFn`Oko=_nY8_;2(jS&sTi;84oxy&hD%p8`eKuYzv`Z+g9pQ-2v8{w>mjn1UK>gVNm1zYhV6tP;?%Co0H3(;FCPR75oIa z{t&zh{2QUO=MR8&@D!Ac*5`ikm0%7^KYkii`(FUh z0>2Gvp3i^8m5+dz^85<$Y;YbF-CqYv{(ltIdi^YTG5A?f>-uGI75JPVaQt`*cpuN# zg7<s3yK~OfU5ThsPX_*Ft{(<9z9&G*&!<4O|20ta{%7!V@Ur)~b~c0Sc-{wUzOMtN58nf7-QEw% zUOnOQNl@+m1}J*`E_fyQG^qB^{y{h2^-_W9Zo8efI{xw2d?9JYwPup%w+*!qFOIa+!;QR=wMG`Y(~W#?q@Hxrp-pQi zyVFe`V?B;pPwQ@7uWvWGW}j(0d(+o;)4Y?`W7=;vYDtH_1~o{vb|cN>M$64BPitAL zo{z?wU%YEe+|ASasOvoMPR}N8n8UdZyiG2Kji2IkuDE@;~IIB^YTGp=zBWJr`AVjOv#wCb^-oyOBy2U0cig!byA z@xC;T_j=Mh?9kdc6Qh%oZAGnL{uA8 z9M{uYv(Z{sd0?@dZ9ccGwk^-H^0*+ijXjJnU!gqiw(=TncSQ!xul%6z4etVl;)!~r zL*@P=7+PgB?QA}7Wk-10n$0gjZWZ69CG||oN=;^YXN^ACwHR;B7Q{$b#akV7tjX7| z$xH5ihE>Ao=xf>ME56e(Vgzt5Ys2FjPf=AY%HULES(C@9L=!7b)yiMdO}h{zTAQ^z zcO=bq(XDx>owa5+?aq*1fm4U$q+T~xpUIld>1Z*-XuOzBp%SDihomZp;<+T}vougjJUSj14BPYR zB2pTgmhJzxA}Hh2S+^67*Wq8p6RNf|^hqsQNTwUjMrV;0U)yc8;ZG=7Yo{m`bjsaX z`+kuYK3zQNk6W;PSg>dMv6EqXb^?LmnNB|G&nx{N>cZ%-gK1Wj&;6!?QPD9*<$!-N zgl?Se&SQMg>ezs!E_NFVZ%5;a2NqEJRsjO#Xw4&YjoMs%1PW=T=;KHO&1#E*exFZS zu=?SoRfD8k83LMNdn0Yu^Ju);)c;B71U2^(ChWwW#Rb$sayV%;rJuDHd&Tlu+tn>A z*{8Wz*0Mw$@f^ltK3>~s)tcS9)(z=qp2!<24F;^qQgo8(d>ww@qvx z-@kKe-)J0 z6BZw$km0YiRaEu5uXwf@(?ckz$6H`NYu|X$smf6{56ePX)bO3X$roF-ITTCQ&4cdc z6rgBJiYL=%;*DlK zZTCIK+mcSwUlwd_v}FbnC^a&dM5ganC#iKnRH6PU-tn0Y-1JJ>n5a+1ZnG}wky=UHo${kbi%!J0 z_;1N{lBcTM;tQvHdo-_=iQU3%#NtI^wW_^vUUWQ#x{9_rhYK|RiqR`+(~*7%lUuHe zbVuw2DrpW4$3w+>Eq@c%tQgM_?aRK!Jv0x6VbnZ#&}{H&J*%0rH5WTZaV1hRrQSnr zh&0}W9!aP3MhAtu4Fgr{I45jdBd;axdNBlE9&QxUx2@ViWL}&8fte6?`>Pm~o}$e4?pHC^u8i&(mb?}V3 zMX4ERAG5~O-I*CokngJ)28ycHk&A=o!Sti;8fkqvP7wfML0}VjH(Ay~vEzKw!u2)# zQpO3fcj!k$M{RF7T}y%E6hEgEJOQwA+*y8Z1mTn!tiC#v9{ZF4l}D z9zc8w=WW{g6wu}lBGJ}#+Me|i$BY)@>7*TP$8p7LsmFKDGvH`@quGHF3MNp}3#c3K z?V7JP*gqSNdo8&U;O@y?JBQ=$!fZQnLB^VV(n-#w0*zv^a5mc68jP-W={&m`xqTu0 zcjQJ9l)ikZ4w>dtnf{~`PdBsL{iU(+e&}#K*Pwg<6gy|u2c4~vUWGFn?I46GD7z!| zPMzYBnz>NU`gpr=IB9lMTdl&WbPjI9cj6m#pfq=$64s(Qn&u3q2`;eH%{w%*xz2nO z2XhvaeH_Pc2U;;}FGhFHK!=*MRN$B@nUe$cb~4k+t9~NghV;vD96T8368jZJJj1%dPA+hf90ifIp=(0s zlGZcEqdCvve?ri9I@@g~ZIcXZaF` zMZz2`N>PW>cH|qzadHn6iVhdEH;*c0B1i|MNAl=S1zIk4DH(>Dp<8!0YAIe8NXpH8 zxE2Iat8$~AQy&w?nPW^X{4@Pi>CVz;Fr0Liy*o+AU{`!-IKC&oJ-%bC5fu+Rst>bc zjW~&RCHQ~*Uxn#|ayHdO1Uj$K(s&+uuUSL_@iZVUeP9ssa-==rZ-P>Du*r-#=fXY> zS|+HUQF@jtk9MW4ZoH?hNM%<_m{^Z?W%b5Pupoph)UguQw*0FsM_xT^8Z(JMrwK=) zuIaH}eH&GlSAQ3yk9Lc9R#2t;x(f?gyR(@}9V3Q!V)LS)h@f_-SPqJh6ir9FaVRal zrN7d7xo1@)>17!4%`u6is#Neuz5u~d+az5o#R|W=Ei3C+w#xEI1Qo1hC?`pw=Qk}U zsTW%`|N209*`pVBSG{riUCB3JA>b<0hX1-xNjk^?Sw5-d=7wFD_G&gQ4B55uwVi00Z0%oPCB407IO?VXALK~B_fHR5`HDLasRA4)sl@nFGvhu%;a*pHY&@K4r3q2tHN2WmoHnsjio#f^lmz!Memk!vA$TLSfNn={ zT4;jYX+pjlJ??l*`*8Q<$X3!{@q8-RsFBZ)#(P@6al9KDdC||wg0rYIQjra9ATeq$ z?ee~Yw^DS?vTC&){q3PD5d(|kWh#8|=S96jv#(I^gzuSTv6&Udim3^r=|)L`lgHvw zl3A&4g1V1Pep#j>B@W}YE=4qBF@`)m%h9b{6}ZgBN9Gj{k-aKe)`D&C!?3z$Y2vk7 zd~Zg~DEV})1ZSN{-$oZzH5<7Oi}EZAi}t3oX)BdyPS#rbRT~IF%7)^ZCQdn(9H)B2 z8lIto%y;Fn!W*W!PzAVdE}Bv^PBGX-`Iz){tD`exYgDoa?ovGR%JVSQ1= zkUbbJ%l$U-fD*`HyK`PwSBO%Q2Suoe%WoPRv#eo*E12=38_U#&7D$TOytQ|+Pk}_B zLKMgp2mM?WEUQv4Dzl4XQR}h-S}*dEzQGk-q%w#7ulZv67>k*$&~NFQmHmcRR?4>@ z_nXR$%XSi$NVcMI$1pd}=?b=>qRSPZJ3Wt{bf*By#7^}bfQ|$d8SQgtEPOQIN*^G`H~lB~p@u!Oz=(`D z3I?W;gM@3r*^v&Jf<+bL(e%I3`GyrRbO`EAq6YBS1#yOh2$;bAjyG?+S*Ag z$5+H9QaaW42T{Y}jK*4O>Kq4-KxOwJxHRjC z92fK#ekxi?rvo5Nr71pedk4L(21biz(Uq(y3NSPl#wseYVZv3)6m-1v&jwp!JF4<< zT|%$Yal4K4rVL6UgF2IdWkeCX<<%q+zc6}@_IMxp^Drm-k!``8R7Wmnu&f`8e-}Lq zufPg{^)yMJAdIU4<7m9U+;k3nV-$KO=|mq>IY?m?OKy1ZdW7XOf2OxI)GZd*zm^?! zt?-v#vIt>IazNdpD72@q#EBukIkB=YT7Nd5^{Y$Qm`VfFn!040dzoG`UvH|CB$5|j z=;vtJn=sC0Z~D9meOQRE7wL*k@$pMxElk2~!E-XO%{YCamex?Jq-0H7_p66d>)%IH z)C$7FZXwDd7($47h-1p|2 zIf9-x!{yGEX{ts4dWS($W{2$0vR8RAW36+=`t{fKF28N^&{E$yi=KAf@r!VDQ0;aY z(ZEAKUcva0m4hjUe-dr=QNU>j<@7`X_3ox*d1u=c9WrLj+Cy%S6mB4-E?tn(IAnPX zcUjqU&4++En1{lVv`nzmU+lPU7O620mLu6O@d_{@j4`Bz#RK|=^o0HGH&L|S6e$VjCi?$%RK{p&7?*$g4;b03oHT80u*4#C*kTHT zP|YU)`_rj98jfF|Xf!(Aku~fnOp%+7m2pB#v$Woqw=}(zO-qR(g=FW=@ye7nb6z>y zpgQshkKx+mx3SyfB2-zJw2qx0%xoguylsCR;5=NgdV{m^YT*ISkh?>slj2FdX_t=G zbY+O82wJ2ECLGrf;^-=6JQrJ0p=bkJIo@t}TO>F7@;pju<4Soeqd&vY3ke@sm`DDI zo`bm9&aoVeFPwClFP8@MWqZAk?Z0;c&UDIj(Hc6Qq{%A;++Xg8Pqwq3$H7^^XI#r@ z%NAM6hP!QCTBvb8Cgmv zS7wRV@%nlYORRH^+y-t4rzzcXVipm*&SY3-a?ky7F4^IMit(~vZkJa6C&}L=erYt(OUE+Q$ znr&y@1-yTR%N)zK{xF934$Fjo9%;WPA6viPuOpsko{!>4t@vVn;9GW!)<<>}U3*T| zI9c(DPS+HtTw58_ENNHqrXz9^92+2YVUFtoB)+Ach+30l-YQ><&1%BcI$ooQDP6Zp zUb_frcazrYO3=E(3{hRfpp3?qq}Gg5Ekgmqdx;(4j@pi!2vey*V6xyLK>ZGsuRnu zoNcyQyF68Sfqt;#@N79|he#`p+*u#F3!Q7B;iPkbUk&RrAb zWUm|Du-XrBM0>kqq`V&J&?<*hZjmKx!&$fOpV~fhQ&~?slmmt%6YSf|IU9>_nr?Jf zPwtsw(^38bPLZ69v3TQ#jW>*JxMAeF8>g6ja1x7y)gW-IL%kHH0`80vK>z2Aa9Gg^O)bZ@fJA&{CQg|zWlcMx?5Jia^w!T z9VQY?X0nd)^`keejx2<>BMbv?BSNWmJ*j8mMj~gD*t$K*3yIsc=SsvGasjo*(#Hl~ zB2u4B)V`RPVxaVzb{#~zc;IQHZya)4LuRT3x5&^ATg1x^F9JuM4ay`ku) zT=c*pEXde+P`z|p#KmeK0yX(lR~6|B#Y9&Tnh(3c==09f(H3=bJHTZFjuFwqvMQ)yPR3GGe!r%Uq2`8TLt#8;CUpGAcx%}WMN$k_ zMa#ZoopSXCeP6C&|64Zu6(ky;`4L*?FKl&*9e6w62;=W>V6WFujx=oDhKl}PBy$u` z4xYW<)Uu{Xu@<{sm#tDF%5$16NYDMpq;mgpQgVfOz_m_tD(e@xQ%gqBx%9I-lgt@F z4)u3kC$*)I)f=Ggv_ip_VmO<f+dw9BE*RXpkVO+6+@+U^=H;Dy=9^Fd-4uJ6-cPrE6%8%VV{)U6Y!Qwz8F9YoPX3 z4L1ZYsOTB8;>^( zU7LoJrDxq%LBz;ZEQ^88Pg@+2cA{W8*B;I^;t)5-U6TDeh%1f^N%^ezt|c$=u^=PF z8+gak)B3O^sJnEu$)WF-EeGeB4k6N5IjtwVbLh;$$N0$s)ie9Y_+Bq zXwtJA5jEJTW)y5wAk504BPpE!u_@ORu4^JVbZu@UY%9y?mV{&b8WZMM#GJtc%s6*; z>=Ovx(ovn_VizRi4ku~^a(ASJmmW2xhi)mXaz(e4LdZrgo1Zx1<7P0q(U^6-!gK=Y zzS3H1xrj@e{9$y})pzf$@a%X=$|^Kf^&rZ!stmY3wKQ4V*T9FVe)s2Z{3-up;OG^| zOgdxa-Y5Ce2Wj)hGKr{C}Cly8I&Wod>1QV1n%l~B@QAh zCOsLzWVNYM!3R`<9aWaIMH(Q)c0nxTuy$BiY+UgE(ReMAQ>;V;4?_hm1MX4 zPG43HgXWPDSIV6;?qWl`K^xvyNdlVH>A*TTS=yL3_p(Qe6lHF(-cApydcsu0;HFOa z*;enGI*%yhtUnX;;|RWD;SE~td&5%M0=w-dXGGRc8k-rPoF3OwM*YB93Lhr-4CHEK^Z$#6K-;IP>wm;8b))B^`Tmm)kvHafg$ulJszjq>u?`h%WD07^toa|6mq)Fe1#&vZKp+XG8pR(kIpI^1c zMGe%81y@KD%I4T(?)Gq>TZ5`ATSQ`!bL8KDSG-bFOCKlErHGrs(ULyY32)^G8)7(_uv?6Z^Blue70TwliUC@-Qr?q|hYVaty+)aVc(mu^ns3^7-0+rn3q zQ?Y&#L>&|%!kHF#bM2rX5_Sj%M;9`zt0WBVAo<>8@bIN%7qXQ z&g&SX;nO%Cg_`Ve@q=Wk{7dto>4&-Nb|}W?vHUT$_jOz zT3V^93x{FDKss?#$$%`YOa4WN;(P1&rtx+My3eic%#$hQXaTt;?4U%k%rg~sQatL@ zhN3kGPRL3j*q9bw^;RTjd9(-3Ev6Bjw_v3h<1%As9x^7trD?1Ym-lq~)kn#r(H-8z zwj+nbQx$C(rJ*?bgjo{USvVXs%44CQ&BertNOfD? zB?O~MTo|3SH)r0v5Yf2L5|Ua8{#PY)Smw#%1)Y_%JM81jx6NG6)C-Q+wzid4sEq2c ziQ2`%GSzhw$Wzj7kX?*z33n?ovr-oE9t$zS4}d@iIcA!&v9ToxG+`Mf3VoOY7pqaH z)PtwOVKLcN=b`sJaC&pRH1>mEwfl?r2B9kEP%1a5S@wk5;n``rzLZUML@4JV38;7y zH2Y=gD-Feod|6(s+@S0Q6VVB{tarRnL*sQ+lMM+OaG7*Rl4|#m+mt4bLCht3OF+Uq zl>wHQ=~c%YlJXTN<&_FLHqTJ;FlLiDpqQD{v8K_gv+A?k+`-iK`z)MH<)=h-tkdZk3oY;g zp=4El@CT7%`As=n)7m_8>d$4mHE-t*D_?KJ@piB0Ar1ncAKwN#C0%W%^5uBBiDj#8 zKkJdiC$4?M8rrT_7Sv3{O0_GBXra2nassX6-K-?Cdw%c;WA{oc&>1_o)u%n&I?Cm; zvAA6UghM9R=~;LIwy<3{*d5c%Zx7kPpFMZlZE++=B`Ez+_U7Z74=)o%E#ti&v!+Sr##Niy66y>DH@!Wy}#y zKlQyFi^s!un0uq&1h8e)tpKQQaT(H5bwXWD&k)PmV0now(=u*BNe6lrk(L{@RKi#+ z_JKe8vKK|{QQ1E%3G5WRsmFqMOF~Q(2``hypn2Vo=`pGPgqSSAUbFgQ?%>{SZ*~uv zIY#^G*n;R?_EFYn<--pP=yP3LkU=jt55jK==w(4*osue>s1`#*9f)Djh1G{~~OY zh@7Fa)Q8Kk6sn&MGQUY#7Qr_CwN~(-%d^`9S~=l2CCQ7vrB^(MRJdw|mP+5dLdCMF z6aPrT;LrNkwAvz~5tg`g*QIXc`-NK^R-?iLicFkAbV)fo5g1N$8QTkB zPnIWxjHh}vWjRb!Vxe-uAaX)$ZmqR{x%_>_1ycpogwmZd8&36L2Xdx~gUqwvh2H0n zX_hIv@;KMw^g-2RTsn$0uQOf}+mN1Tl>D-*Pp^wW&3NhKO>QMnY3XsPd;jAHl{#n; zS0}MElLPBi+Hof-E47efGad{-MB}9vFiLS?%V^7%O_TIST4Z!AZbJFgyFqnp$>$P0 zGP5 zHyQbrSxy8He?nzDECr=1&Z(`oQJh4t{+CpAT}+$7oGfwc2h&w4rLL=%jFk!Tx9uw6 z#`vT7-V?X0v~4n!P$Jj>ACMh;Ecki_N5FteygHAfT51EO<1jdcxjk#LNTKdexFDLV zg*M)P*TG3YjH#>)EGuaomZ>)%4J(zlIVnml>&JytMyZNgaG&xeLW=(%lp!1;m)9MX zR&{q8LS#PakA3Fg*?elQ!txVE$M;ny4mO+zN?5EKKlkW^l)tPc7&S7!s zGd~DRe%QufkH$Jt>dVGs=gpo~=FC1Ha8OR=rp>Aom1!cisWWjfT#t3LeHs^t97n(F z3``+c&YD+Tjo!E6>~0|CfKMwPru23p7_ZDqb>(|3J;V^oSCm_6$`!&P zth1bDic_x2boogLa;)=oqg?&*R3^e&ooE?IncV6(DY*W}D9h8X4647hyBQm1mmeYNJL+6rNw%)+Ek3TrZ#3Eax@Y{V!~vUmk8RnA~Bq7xnG?rEelzLRUu&%(1#JJn8;R(J+yKqIiV zayvb;Kw-b{*kdNlSsS~7D*~06aG6ThobAUfFh9kfk&;9bRPCNT)6>PlgLNa=Okmlw z1tLRlrk8t5Y8tZjvl2xmH#r+xY#6r@=*B|QWD{7+toU9{OvCJ4{ndQANKC$1Dw84W zFkRIVk%#5a5xbd5mNK7UwzMo#C{PKJh1 zsqMC;8DW(TL;BCBEmr(|R2|xXW(-`jRXRzK?1aWzdML+H)b1gw3tZKvo09W_R^GSL zq6NRn`z&x73&2A8BfGL1(9Uhe`vY+yYi)#;5tNf>nSE%etucPkDfkf;mq(`2^61>m z5``J9ofCrUj;Y9^x=SHiy$Z9A#RoZ;<9}k~;IMzH{*(oU_Dcl+DaUS1?|+CxqxaAM zX~$oZUUGL(D;v%?IQiwS-ogJQe9|{o+2TQCHGU)HQff^}YPb`zHVuN7k}I1u=h;pp zZ!bL;B2=s4c1Zc4ax&EGPizmi!cKEFIB%u{%1Zq!?zNLu7CWn#raL%bQH#Ibr(Xln z*=ZN-vZpanB%DOpIr_>}56&Ow=RgknrVvA)zcmkqv9X#uV63Q;j@QSN?zoQbD4ELB zNM*D7MEW>lS*5rAPKfy13QZa6N2%N|g#-bevY!e;scIi%+0NoN_M1cYs^YaO%y3?+ zFEq!sEVbi(eiKV4?fN61aBPVA_nr_a>RN7Xpdv5Z>&w6Oev75HokOW>TV;1p&maBs zV?%vTa(u4%QqKdo|4*V?Fn8ET`_&QWiAk|LCE9a%2CdrU2PVV_=y$1T7pU?ZB)a{? zAtcO6Sb@T)3t{$t-Nn(VB7eRejtaj|(m2e8?_-Z`wOf<44l$IYg|RkKOp+Yi-KhpN z{>`#9BO3%^D2$N7=wFP2o2J|G_BpJ0Vs|{XXWMwZb3EQVv8@p3GD|X;xMm*rD*uvk zULPV9=8TwFH-`#Gp*ZZVrLUgl5CN5+fmFShQ_T6tdtvX2P#|pGvOjB2It-&cO^?m? zSGN;i$Hq)x?;j_`_mxa82e9m>cc^~iCe4e&f-_{eBCD~%0JE|M%aEi4*}_c8wb?Tv zf?V+asjhL;2|RA1ZRbJNM$cqu(AdZJc>7=W3_UC&QtZn!|9dBP-bZc+Bi2|XSVhW> zGW$`Kt;NB6KN?fKI+vCN`Paw_k?xUu*D|yBGOL^+By&tx-g%$+5jaPpGs!WKrqsrgRLq9&o|7M`h0YzjF;cwgKtSVq9yNuR; a1|?J~^fMlq{UnNipS0|MFv$0!75aZF8OI9% literal 0 HcmV?d00001 diff --git a/wp-content/plugins/revisionary/languages/revisionary-es_ES.po b/wp-content/plugins/revisionary/languages/revisionary-es_ES.po new file mode 100644 index 000000000..c5c46121b --- /dev/null +++ b/wp-content/plugins/revisionary/languages/revisionary-es_ES.po @@ -0,0 +1,2076 @@ +# Translation of Plugins - PublishPress Revisions: Duplicate Posts, Submit, Approve and Schedule Content Changes - Stable (latest release) in Spanish (Spain) +# This file is distributed under the same license as the Plugins - PublishPress Revisions: Duplicate Posts, Submit, Approve and Schedule Content Changes - Stable (latest release) package. +msgid "" +msgstr "" +"Project-Id-Version: Plugins - PublishPress Revisions: Duplicate Posts, " +"Submit, Approve and Schedule Content Changes - Stable (latest release)\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/project\n" +"POT-Creation-Date: 2024-04-16T19:38:36+00:00\n" +"PO-Revision-Date: 2024-04-17 18:26+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.4\n" + +#. Plugin Name of the plugin +msgid "PublishPress Revisions" +msgstr "PublishPress Revisions" + +#. Plugin URI of the plugin +msgid "https://publishpress.com/revisionary/" +msgstr "https://publishpress.com/revisionary/" + +#. Description of the plugin +msgid "" +"Maintain published content with teamwork and precision using the Revisions " +"model to submit, approve and schedule changes." +msgstr "" +"Mantener el contenido publicado con trabajo en equipo y precisión utilizando " +"el modelo de revisiones para enviar, aprobar y programar los cambios." + +#. Author of the plugin +msgid "PublishPress" +msgstr "PublishPress" + +#. Author URI of the plugin +msgid "https://publishpress.com" +msgstr "https://publishpress.com" + +#: admin/admin-init_rvy.php:105 admin/admin-init_rvy.php:337 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Lo sentimos, no estás autorizado a borrar esta revisión." + +#: admin/admin-init_rvy.php:194 admin/admin-init_rvy.php:308 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "Lo siento, no tienes permisos para aprobar esta revisión." + +#: admin/admin-init_rvy.php:235 +msgid "Sorry, you are not allowed to submit this revision." +msgstr "Lo sentimos, no estás autorizado a enviar esta revisión." + +#: admin/admin-init_rvy.php:273 +msgid "Sorry, you are not allowed to decline this revision." +msgstr "Lo sentimos, no estás autorizado a rechazar esta revisión." + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "Se ha restaurado la revisión." + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "La revisión estaba programada para su publicación." + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "Se ha publicado la revisión." + +#: admin/admin-posts_rvy.php:142 admin/class-list-table-archive.php:425 +#: rvy_init-functions.php:453 +msgid "Revision" +msgstr "Revisión" + +#: admin/admin-posts_rvy.php:159 +msgid "Has Revision" +msgstr "Tiene revisión" + +#: admin/admin-posts_rvy.php:174 admin/admin_rvy.php:274 +msgid "Revision Queue" +msgstr "Cola de revisión" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:235 +msgid "PublishPress Revisions Network Settings" +msgstr "Ajustes de la red para PublishPress Revisions" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "Ajustes de red" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:237 +msgid "PublishPress Revisions Network Defaults" +msgstr "Valores por defecto de la red para PublishPress Revisions" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "Valores por defecto de la red" + +#: admin/admin_rvy.php:121 +msgid "" +"Scheduled Revisions are not available because WP-Cron is disabled on this " +"site. See %sRevisions > Settings > Scheduled Revisions%s." +msgstr "" +"Las revisiones programadas no están disponibles porque WP-Cron está " +"desactivado en este sitio. Ver %sRevisiones > Ajustes > Revisiones " +"programadas%s." + +#: admin/admin_rvy.php:199 +msgctxt "groups per page (screen options)" +msgid "Revisions" +msgstr "Revisiones" + +#: admin/admin_rvy.php:238 +msgid "Revisions" +msgstr "Revisiones" + +#: admin/admin_rvy.php:283 admin/admin_rvy.php:284 +#: admin/revision-archive_rvy.php:80 +msgid "Revision Archive" +msgstr "Archivo de revisiones" + +#: admin/admin_rvy.php:299 admin/options.php:241 +msgid "PublishPress Revisions Settings" +msgstr "Ajustes de PublishPress Revisions" + +#: admin/admin_rvy.php:299 admin/options.php:92 +msgid "Settings" +msgstr "Ajustes" + +#: admin/admin_rvy.php:306 admin/admin_rvy.php:307 includes/CoreAdmin.php:93 +msgid "Upgrade to Pro" +msgstr "Actualizar a Pro" + +#: admin/admin_rvy.php:384 +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "Si te gusta %s, por favor déjanos una valoración de %s. ¡Gracias!" + +#: admin/admin_rvy.php:395 +msgid "About" +msgstr "Acerca de" + +#: admin/admin_rvy.php:397 +msgid "Documentation" +msgstr "Documentación" + +#: admin/admin_rvy.php:399 +msgid "Contact" +msgstr "Contacto" + +#: admin/agents_checklist_rvy.php:75 +msgid "show current users (%d)" +msgstr "mostrar a los usuarios actuales (%d)" + +#: admin/agents_checklist_rvy.php:77 +msgid "show eligible users (%d)" +msgstr "mostrar usuarios elegibles (%d)" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "Filtro:" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "seleccionar" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "anular selección" + +#: admin/class-list-table-archive.php:157 +msgid "Revision Author: %s" +msgstr "Autor de la revisión: %s" + +#: admin/class-list-table-archive.php:174 +msgid "Post Author: %s" +msgstr "Autor de la entrada: %s" + +#: admin/class-list-table-archive.php:197 +msgid "Search results for \"%s\"" +msgstr "Resultados de la búsqueda de «%s»" + +#: admin/class-list-table-archive.php:385 admin/class-list-table_rvy.php:1050 +#: admin/class-list-table_rvy.php:1317 admin/post-edit-block-ui_rvy.php:94 +#: admin/post-edit_rvy.php:52 admin/RevisionEditSubmitMetabox.php:62 +msgid "Delete Revision" +msgstr "Borrar revisión" + +#: admin/class-list-table-archive.php:426 +msgid "Count" +msgstr "Recuento" + +#: admin/class-list-table-archive.php:427 admin/class-list-table_rvy.php:548 +msgid "Post Type" +msgstr "Tipo de contenido" + +#: admin/class-list-table-archive.php:428 rvy_init-functions.php:454 +msgid "Revised By" +msgstr "Revisado por" + +#: admin/class-list-table-archive.php:429 rvy_init-functions.php:455 +msgid "Revision Date" +msgstr "Fecha de revisión" + +#: admin/class-list-table-archive.php:430 +msgid "Method" +msgstr "Método" + +#: admin/class-list-table-archive.php:431 +msgid "Approved By" +msgstr "Aprobado por" + +#: admin/class-list-table-archive.php:432 +msgid "Published Date" +msgstr "Fecha de publicación" + +#: admin/class-list-table-archive.php:433 +msgid "Published Author" +msgstr "Autor de la publicación" + +#: admin/class-list-table-archive.php:461 +msgid "just now" +msgstr "ahora mismo" + +#: admin/class-list-table-archive.php:464 +msgid "%s minutes ago" +msgstr "hace %s minutos" + +#: admin/class-list-table-archive.php:469 +msgid "%s hours ago" +msgstr "hace %s horas" + +#: admin/class-list-table-archive.php:511 +msgid "Revisions are disabled for %s post type" +msgstr "Las revisiones están desactivadas para el tipo de contenido %s" + +#: admin/class-list-table-archive.php:566 +#: admin/class-list-table-archive.php:571 +msgid "Submitted Rev." +msgstr "Revisión enviada" + +#: admin/class-list-table-archive.php:573 +msgid "Direct Edit" +msgstr "Edición directa" + +#: admin/class-list-table-archive.php:634 +msgid "Reset Filters" +msgstr "Restablecer filtros" + +#: admin/class-list-table-archive.php:657 +msgid "All post types" +msgstr "Todos los tipos de contenido" + +#: admin/class-list-table-archive.php:693 +msgid "All" +msgstr "Todo" + +#: admin/class-list-table-archive.php:707 +msgid "My Revisions" +msgstr "Mis revisiones" + +#: admin/class-list-table-archive.php:752 +msgid "Compare Changes in %s" +msgstr "Comparar los cambios en %s" + +#: admin/class-list-table-archive.php:756 admin/class-list-table_rvy.php:1358 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:178 +#: admin/post-edit_rvy.php:192 +msgctxt "revisions" +msgid "Compare" +msgstr "Comparar" + +#. translators: %s: post title +#: admin/class-list-table-archive.php:771 admin/class-list-table_rvy.php:1342 +#: admin/post-editor-workflow-ui_rvy.php:199 +msgid "Preview Revision" +msgstr "Previsualizar la revisión" + +#: admin/class-list-table-archive.php:783 +msgid "List Revisions of this Post" +msgstr "Listar las revisiones de esta entrada" + +#: admin/class-list-table-archive.php:784 +msgid "Filter" +msgstr "Filtro" + +#: admin/class-list-table-archive.php:796 +msgid "Delete Past Revision" +msgstr "Borrar revisión anterior" + +#: admin/class-list-table-archive.php:882 +msgid "No revisions found." +msgstr "No se han encontrado revisiones." + +#: admin/class-list-table_rvy.php:547 admin/post-editor-workflow-ui_rvy.php:31 +msgid "Status" +msgstr "Estado" + +#: admin/class-list-table_rvy.php:601 admin/class-list-table_rvy.php:1224 +msgid "Y/m/d g:i:s a" +msgstr "Y/m/d g:i:s a" + +#: admin/class-list-table_rvy.php:611 admin/class-list-table_rvy.php:1232 +msgid "Y/m/d g:i a" +msgstr "Y/m/d g:i a" + +#: admin/class-list-table_rvy.php:618 +msgid "Scheduled publication: %s" +msgstr "Publicación programada: %s" + +#: admin/class-list-table_rvy.php:621 +msgid "Requested publication: %s" +msgstr "Publicación solicitada: %s" + +#: admin/class-list-table_rvy.php:666 admin/history_rvy.php:786 +msgid "No author" +msgstr "Sin autor" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:708 +msgid "View only revisions of %s" +msgstr "Ver solo las revisiones de %s" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:720 admin/class-list-table_rvy.php:728 +msgid "View published post" +msgstr "Ver entrada publicada" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:752 +msgid "Compare Past Revisions" +msgstr "Comparar revisiones anteriores" + +#: admin/class-list-table_rvy.php:753 +msgid "History" +msgstr "Historial" + +#: admin/class-list-table_rvy.php:1006 +msgid "My Activity" +msgstr "Mi actividad" + +#: admin/class-list-table_rvy.php:1014 +msgid "All %s" +msgstr "Todos %s" + +#: admin/class-list-table_rvy.php:1046 +msgid "Unschedule" +msgstr "Desprogramar" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1050 admin/class-list-table_rvy.php:1313 +#: admin/post-edit-block-ui_rvy.php:94 admin/post-edit_rvy.php:52 +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Discard Revision" +msgstr "Descartar la revisión" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1357 +msgid "Compare Changes" +msgstr "Comparar los cambios" + +#: admin/class-list-table_rvy.php:1366 +msgctxt "revisions" +msgid "Decline" +msgstr "Rechazar" + +#: admin/edit-revision-classic-ui_rvy.php:63 +msgid "Publish on approval" +msgstr "Publicar tras la aprobación" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "Comparar esta revisión con la copia publicada, o con otras revisiones" + +#: admin/edit-revision-classic-ui_rvy.php:106 +msgid "Revision updated. %sView Preview%s" +msgstr "Revisión actualizada. %sVer vista previa%s" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "Revisión actualizada." + +#: admin/history_rvy.php:191 +msgid "Compare %s of \"%s\"" +msgstr "Compara %s de «%s»" + +#: admin/history_rvy.php:535 admin/options.php:767 +msgid "Post Date" +msgstr "Fecha de publicación" + +#: admin/history_rvy.php:536 +msgid "Post Parent" +msgstr "Entrada padre" + +#: admin/history_rvy.php:537 +msgid "Menu Order" +msgstr "Orden del menú" + +#: admin/history_rvy.php:538 +msgid "Comment Status" +msgstr "Estado del comentario" + +#: admin/history_rvy.php:539 +msgid "Ping Status" +msgstr "Estado de ping" + +#: admin/history_rvy.php:674 +msgid "Page Template" +msgstr "Plantilla de página" + +#: admin/history_rvy.php:677 +msgid "Featured Image" +msgstr "Imagen destacada" + +#: admin/history_rvy.php:681 +msgid "Beaver Builder Data" +msgstr "Datos de Beaver Builder" + +#: admin/history_rvy.php:682 +msgid "Beaver Builder Settings" +msgstr "Ajustes de Beaver Builder" + +#: admin/history_rvy.php:914 +msgid "Scheduled for " +msgstr "Programada para " + +#: admin/history_rvy.php:919 +msgid "Requested for " +msgstr "Solicitado para " + +#: admin/history_rvy.php:924 +msgid "Modified " +msgstr "Modificado " + +#: admin/history_rvy.php:929 +msgid "%s%s from now" +msgstr "%s%s a partir de ahora" + +#: admin/history_rvy.php:940 +msgid "M j, Y @ g:i a" +msgstr "j \\d\\e F \\d\\e Y @ H:i" + +#: admin/history_rvy.php:985 +msgid "M j, Y @ H:i" +msgstr "j \\d\\e F \\d\\e Y @ H:i" + +#: admin/history_rvy.php:986 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "j M @ H:i" + +#: admin/history_rvy.php:1072 front_rvy.php:479 front_rvy.php:504 +#: rvy_init-functions.php:260 rvy_init-functions.php:278 +#: rvy_init-functions.php:317 rvy_init-functions.php:334 +#: rvy_init-functions.php:351 +msgid "Approve" +msgstr "Aprobar" + +#: admin/history_rvy.php:1072 +msgid "Preview / Approve" +msgstr "Vista previa / Aprobar" + +#: admin/history_rvy.php:1074 admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +#: admin/post-editor-workflow-ui_rvy.php:199 +#: admin/RevisionEditSubmitMetabox.php:123 +msgid "Preview" +msgstr "Vista previa" + +#: admin/history_rvy.php:1168 +msgid "Preview / Restore" +msgstr "Vista previa / Restaurar" + +#: admin/history_rvy.php:1175 +msgid "Manage" +msgstr "Gestionar" + +#: admin/history_rvy.php:1176 +msgid "List" +msgstr "Lista" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "Ajustes de Scope" + +#: admin/options.php:96 +msgid "Post Types" +msgstr "Tipos de contenido" + +#: admin/options.php:97 +msgid "Revisors" +msgstr "Revisores" + +#: admin/options.php:98 +msgid "Statuses" +msgstr "Estados" + +#: admin/options.php:99 +msgid "Revision Creation" +msgstr "Creación de revisión" + +#: admin/options.php:100 admin/options.php:111 +msgid "Revision Submission" +msgstr "Envío de la revisión" + +#: admin/options.php:102 +msgid "Queue" +msgstr "Cola" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "Vista previa / Aprobación" + +#: admin/options.php:104 +msgid "Options" +msgstr "Opciones" + +#: admin/options.php:105 +msgid "Notifications" +msgstr "Avisos" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" +"Usar un etiquetado alternativo: «Copia de trabajo» > «Solicitud de cambio» > " +"«Cambio programado»" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" +"Capacidad de perfil adicional necesaria para crear una copia de trabajo" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "Capacidad de perfil adicional necesaria para crear una nueva revisión" + +#: admin/options.php:121 admin/options.php:124 +msgid "Enable %s" +msgstr "Activar %s" + +#: admin/options.php:122 +msgid "Limit to one active revision per post" +msgstr "Límite de una revisión activa por entrada" + +#: admin/options.php:123 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" +"Envío automático de revisiones creadas por un usuario con capacidad de " +"publicación" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a Change Request" +msgstr "" +"Capacidad de perfil adicional necesaria para enviar una solicitud de cambio" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a revision" +msgstr "Capacidad de perfil adicional necesaria para enviar una revisión" + +#: admin/options.php:126 +msgid "Editing others' revisions requires role capability" +msgstr "Para editar revisiones de otros se necesita la capacidad de perfil" + +#: admin/options.php:127 +msgid "Listing others' revisions requires role capability" +msgstr "Para listar las revisiones de otros se necesita la capacidad de perfil" + +#: admin/options.php:128 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" +"Los usuarios siempre pueden administrar las revisiones de sus propias " +"entradas editables" + +#: admin/options.php:129 +msgid "Also notify on Revision Update" +msgstr "Avisar también de la actualización de la revisión" + +#: admin/options.php:130 +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" +"Publicación de la revisión: Acciones de la API para imitar a la " +"actualización de la entrada" + +#: admin/options.php:131 +msgid "Hide html tags on Compare Revisions screen" +msgstr "Ocultar las etiquetas html en la pantalla de comparación de revisiones" + +#: admin/options.php:132 +msgid "Use WP-Cron scheduling" +msgstr "Utiliza la programación de WP-Cron" + +#: admin/options.php:133 +msgid "Site uses a custom trigger for WP-Cron tasks" +msgstr "" +"El sitio utiliza un disparador personalizado para las tareas de WP-Cron" + +#: admin/options.php:134 +msgid "Asynchronous Publishing" +msgstr "Publicación asíncrona" + +#: admin/options.php:135 admin/options.php:136 +msgid "Update Publish Date" +msgstr "Actualizar la fecha de publicación" + +#: admin/options.php:137 admin/options.php:138 +msgid "Update Modified Date" +msgstr "Actualización de la fecha de modificación" + +#: admin/options.php:139 +msgid "Email original Author when a %s is submitted" +msgstr "Enviar un correo electrónico al autor original cuando se envia una %s" + +#: admin/options.php:140 +msgid "Email the original Author when a %s is approved" +msgstr "" +"Enviar un correo electrónico al autor original cuando se apruebe una %s" + +#: admin/options.php:141 +msgid "Email the Revisor when a %s is approved" +msgstr "Enviar un correo electrónico al revisor cuando se apruebe una %s" + +#: admin/options.php:142 +msgid "Email the original Author when a %s is published" +msgstr "" +"Enviar un correo electrónico al autor original cuando se publica una %s" + +#: admin/options.php:143 +msgid "Email the Revisor when a %s is published" +msgstr "Enviar un correo electrónico al revisor cuando se publica una %s" + +#: admin/options.php:144 +msgid "Enable notification buffer" +msgstr "Activar el búfer de avisos" + +#: admin/options.php:145 +msgid "All custom post types available to Revisors" +msgstr "" +"Todos los tipos de contenido personalizados disponibles para los revisores" + +#: admin/options.php:146 +msgid "Prevent Revisors from editing other user's drafts" +msgstr "Evitar que los revisores editen los borradores de otros usuarios" + +#: admin/options.php:148 +msgid "Show Preview Links" +msgstr "Mostrar enlaces de vista previa" + +#: admin/options.php:149 +msgid "Preview Link Type" +msgstr "Tipo de enlace de vista previa" + +#: admin/options.php:150 +msgid "Modify preview link for better theme compatibility" +msgstr "" +"Modifica el enlace de previsualización para mejorar la compatibilidad del " +"tema" + +#: admin/options.php:151 +msgid "Extra preview button in Gutenberg Editor top bar" +msgstr "" +"Botón adicional de vista previa en la barra superior del editor Gutenberg" + +#: admin/options.php:152 +msgid "Theme Compat: For front page revision preview, set home flag" +msgstr "" +"Compatibilidad con temas: Para la vista previa de la revisión de la página " +"principal, establece la bandera de inicio" + +#: admin/options.php:153 +msgid "Approve Button on Compare Revisions screen" +msgstr "Botón de aprobación en la pantalla de comparación de revisiones" + +#: admin/options.php:154 +msgid "Copy revision comments to published post" +msgstr "Copiar los comentarios de la revisión en la entrada publicada" + +#: admin/options.php:156 +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" +"Incluir %s en las vistas de «Mi actividad», «Revisiones de mis entradas»" + +#: admin/options.php:157 +msgid "On Revision publication, delete Editorial Comments" +msgstr "Al revisar una publicación, borrar los comentarios editoriales" + +#: admin/options.php:158 +msgid "Enable deletion queue" +msgstr "Activar la cola de borrado" + +#: admin/options.php:159 +msgid "Enable deletion in Revision Archive" +msgstr "Activar el borrado en «Archivo de revisiones»" + +#: admin/options.php:160 +msgid "Revision Restore: Non-Administrators need capability" +msgstr "Restauración de revisiones: Los no administradores necesitan capacidad" + +#: admin/options.php:166 +msgid "Email designated Publishers when a %s is submitted" +msgstr "" +"Enviar un correo electrónico a los editores designados cuando se envia una %s" + +#: admin/options.php:167 +msgid "Email designated Publishers when a %s is published" +msgstr "" +"Enviar un correo electrónico a los editores designados cuando se publica una " +"%s" + +#: admin/options.php:168 +msgid "Email designated Publishers when a %s is approved" +msgstr "" +"Enviar un correo electrónico a los editores designados cuando se apruebe una " +"%s" + +#: admin/options.php:170 +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" +"Enviar un correo electrónico a los editores y administradores cuando se " +"envia una %s" + +#: admin/options.php:171 +msgid "Email Editors and Administrators when a %s is published" +msgstr "" +"Enviar un correo electrónico a los editores y administradores cuando se " +"publica una %s" + +#: admin/options.php:172 +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" +"Enviar un correo electrónico a los editores y administradores cuando se " +"aprueba una %s" + +#: admin/options.php:239 +msgid "PublishPress Revisions Site Settings" +msgstr "Ajustes del sitio para PublishPress Revisions" + +#: admin/options.php:269 +msgid "" +"These are the default settings for options which can be adjusted per-site." +msgstr "" +"Estos son los ajustes por defecto para las opciones que se pueden ajustar " +"por sitio." + +#: admin/options.php:307 +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress Revisions " +"settings. %s" +msgstr "" +"Utiliza esta pestaña para hacer cambios EN TODA LA RED en los ajustes de " +"PublishPress Revisions. %s" + +#: admin/options.php:310 +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" +"También puede especificar los valores por defecto %1$spara los ajustes " +"específicos del sitio%2$s." + +#: admin/options.php:313 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" +"Aquí puedes cambiar el valor por defecto de los ajustes que se controlan por " +"separado en cada sitio." + +#: admin/options.php:323 admin/options.php:325 +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" +"Ten cuenta que %1$s ajustes de la red%2$s también pueden estar disponibles." + +#: admin/options.php:350 +msgid "License" +msgstr "Licencia" + +#: admin/options.php:403 +msgid "Enable revision submission for these Post Types:" +msgstr "Activar el envío de revisiones para estos tipos de contenido:" + +#: admin/options.php:463 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" +"Nota: El código de terceros puede hacer que algunos tipos de contenido sean " +"incompatibles con PublishPress Revisions." + +#: admin/options.php:477 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" +"El perfil de usuario «Revisor» ya está disponible. ¿Incluir capacidades para " +"todos los tipos de contenido personalizados en este perfil?" + +#: admin/options.php:482 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" +"Si se marca, los usuarios que carecen de capacidades de publicación en todo " +"el sitio también se marcarán para la capacidad `edit_others_drafts`" + +#: admin/options.php:497 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for " +"Approval\", \"Scheduled Revision\"" +msgstr "" +"Las etiquetas por defecto son «No enviado para aprobación», «Enviado para " +"aprobación», «Revisión programada»" + +#: admin/options.php:511 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" +"Esta restricción se aplica a los usuarios que no son editores completos para " +"el tipo de contenido. Para activar un perfil, añade las capacidades: " +"`copy_posts`, `copy_others_pages`, etc." + +#: admin/options.php:516 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" +"Para ampliar el listado de «Entradas / Páginas» para los que no son " +"editores, añade las capacidades: `list_others_pages`, " +"`list_published_posts`, etc." + +#: admin/options.php:520 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" +"Para activar un perfil añadir la capacidad `manage_unsubmitted_revisions`" + +#: admin/options.php:537 +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" +"Si el usuario no tiene un enlace normal de «Editar», cambia la leyenda al " +"enlace %s como «Editar»" + +#: admin/options.php:559 +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" +"Activar el contenido publicado para ser copiado, editado, enviado para la " +"aprobación y gestionado en la %scola de revisión%s." + +#: admin/options.php:565 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" +"Esta restricción se aplica a los usuarios que no son editores completos para " +"el tipo de contenido. Para activar un perfil, añade las capacidades: " +"`revise_posts`, `revise_others_pages`, etc." + +#: admin/options.php:568 admin/options.php:592 +msgid "When a %s is published, update post publish date to current time." +msgstr "" +"Cuando se publica una %s, actualiza la fecha de publicación de la entrada a " +"la hora actual." + +#: admin/options.php:571 admin/options.php:595 +msgid "When a %s is published, update post modified date to current time." +msgstr "" +"Cuando se publica una %s, actualiza la fecha de modificación de la entrada a " +"la hora actual." + +#: admin/options.php:589 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" +"Si se edita una entrada o página publicada actualmente y se establece una " +"fecha futura, el cambio no se aplicará hasta la fecha seleccionada." + +#: admin/options.php:600 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" +"Publicar revisiones programadas utilizando el mecanismo WP-Cron. En algunos " +"sitios, la publicación fallará si este ajuste está desactivado." + +#: admin/options.php:604 +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" +"Publicar las revisiones programadas de forma asíncrona, a través de una " +"solicitud http secundaria desde el servidor. Esto suele ser lo mejor, ya " +"que elimina el retraso, pero algunos servidores pueden no soportarlo." + +#: admin/options.php:609 +msgid "" +"The WP-Cron trigger is disabled, but scheduled tasks are still excecuted " +"using a custom trigger." +msgstr "" +"El disparador de WP-Cron está desactivado, pero las tareas programadas se " +"siguen ejecutando mediante un disparador personalizado." + +#: admin/options.php:626 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" +"Esta restricción se aplica a los usuarios que no son editores completos para " +"el tipo de contenido. Para activar un perfil, añade la capacidad de " +"`edit_others_revisions`." + +#: admin/options.php:629 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" +"Esta restricción se aplica a los usuarios que no son editores completos para " +"el tipo de contenido. Para activar un perfil, añade la capacidad de " +"`list_others_revisions`." + +#: admin/options.php:632 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" +"Omitir las restricciones anteriores para las revisiones de otros a las " +"propias entradas del usuario conectado." + +#: admin/options.php:641 +msgid "Regenerate \"post has revision\" flags" +msgstr "Regenerar marcadores de «la entrada tiene revisión»" + +#: admin/options.php:656 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators." +msgstr "" +"Para los temas que bloquean la vista previa de las revisiones, ocultar los " +"enlaces de vista previa a los no administradores." + +#: admin/options.php:668 +msgid "Published Post Slug" +msgstr "Slug de la entrada publicada" + +#: admin/options.php:668 +msgid "Revision Slug" +msgstr "Slug de revisión" + +#: admin/options.php:668 +msgid "Revision ID only" +msgstr "Solo el ID de la revisión" + +#: admin/options.php:679 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" +"Algunos temas o plugins pueden requerir el tipo de enlace «Slug de revisión» " +"o «ID de revisión» para la correcta carga de la plantilla y la visualización " +"de los campos." + +#: admin/options.php:688 +msgid "The revision preview argument is configured by constant definition: %s" +msgstr "" +"El argumento de vista previa de revisión está configurado por definición de " +"la constante: %s" + +#: admin/options.php:695 +msgid "" +"Adjust preview links to use \"rv_preview\" argument instead of \"preview\". " +"Experiment to see which works best with your theme." +msgstr "" +"Ajusta los enlaces de previsualización para que utilicen el argumento " +"\"rv_preview\" en lugar de \"preview\". Experimenta para ver cuál funciona " +"mejor con tu tema." + +#: admin/options.php:704 +msgid "" +"Some themes may require this setting for correct revision preview display." +msgstr "" +"Para algunos temas puede ser obligatorio realizar este ajuste para que se " +"muestre correctamente la vista previa de la revisión." + +#: admin/options.php:710 +msgid "If disabled, Compare screen links to Revision Preview for approval." +msgstr "" +"Si se desactiva, la pantalla de comparación enlaza con la vista previa de la " +"revisión para su aprobación." + +#: admin/options.php:738 +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" +"Para la compatibilidad con Advanced Custom Fields, Beaver Builder y WPML, " +"actualiza a %sPublishPress Revisions Pro%s." + +#: admin/options.php:748 +msgid "This may improve compatibility with some plugins." +msgstr "Esto puede mejorar la compatibilidad con algunos plugins." + +#: admin/options.php:767 +msgid "Modification Date" +msgstr "Fecha de modificación" + +#: admin/options.php:777 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" +"Mostrar las leyendas descriptivas para los ajustes de PublishPress Revisions" + +#: admin/options.php:791 +msgid "" +"Non-Administrators cannot restore a revision without the restore_revisions " +"capability" +msgstr "" +"Los no administradores no pueden restaurar una revisión sin la capacidad " +"«restore_revisions»" + +#: admin/options.php:813 admin/options.php:834 +msgid "Never" +msgstr "Nunca" + +#: admin/options.php:813 admin/options.php:834 +msgid "By default" +msgstr "Por defecto" + +#: admin/options.php:813 admin/options.php:834 +msgid "Always" +msgstr "Siempre" + +#: admin/options.php:823 admin/options.php:869 +msgid "select recipients" +msgstr "seleccionar destinatarios" + +#: admin/options.php:883 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" +"Para evitar fallos en los avisos, almacena en el búfer los correos " +"electrónicos para su envío diferido una vez superados los límites de " +"minutos, horas o días" + +#: admin/options.php:904 +msgid "Notification Buffer" +msgstr "Búfer de avisos" + +#: admin/options.php:932 +msgid "Notification Log" +msgstr "Registro de avisos" + +#: admin/options.php:961 +msgid "Purge Notification Buffer" +msgstr "Vaciar el búfer de avisos" + +#: admin/options.php:967 +msgid "Truncate Notification Log" +msgstr "Truncar el registro de avisos" + +#: admin/options.php:973 +msgid "Sent in last minute: %d / %d" +msgstr "Enviado en el último minuto: %d / %d" + +#: admin/options.php:974 +msgid "Sent in last hour: %d / %d" +msgstr "Enviado en la última hora: %d / %d" + +#: admin/options.php:975 +msgid "Sent in last day: %d / %d" +msgstr "Enviado en el último día: %d / %d" + +#: admin/options.php:982 +msgid "Seconds until next buffer processing time: %d" +msgstr "Segundos hasta la siguiente vez de procesamiento del búfer: %d" + +#: admin/options.php:992 +msgid "Show Notification Log / Buffer" +msgstr "Mostrar el aviso de registro / búfer" + +#: admin/options.php:994 +msgid "Show with message content" +msgstr "Mostrar con el contenido del mensaje" + +#: admin/options.php:1005 includes/CoreAdmin.php:88 +msgid "WPML Translation Management" +msgstr "Gestión de las traducciones de WPML" + +#: admin/options.php:1012 +msgid "Sync \"Needs Update\" flags" +msgstr "Sincronización de los marcadores «Necesita actualización»" + +#: admin/options.php:1016 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" +"Establece «Necesita actualización» para cualquier entrada con traducciones " +"que haya sido actualizada (posiblemente por aprobación de revisión) más " +"recientemente que sus traducciones." + +#: admin/options.php:1054 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" +"Especifica los ajustes de PublishPress Revisions para controlar toda la red. " +"Los ajustes no seleccionados se controlan por separado en cada sitio." + +#: admin/options.php:1064 +msgctxt "opentag option_tabname closetag (explanatory note)" +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "%1$s%2$s%3$s (%4$s)" + +#: admin/options.php:1100 +msgid "network-wide control of \"%s\"" +msgstr "control en toda la red de «%s\"" + +#: admin/options.php:1130 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" +"Todos los ajustes de este formulario (incluidos los de las pestañas no " +"seleccionadas) se restablecerán a los valores por defecto. ¿Estás seguro?" + +#: admin/post-edit-block-ui_rvy.php:149 admin/post-edit_rvy.php:263 +msgid "Author" +msgstr "Autor" + +#: admin/post-editor-workflow-ui_rvy.php:35 +msgid "(on approval)" +msgstr "(pendiente de aprobación)" + +#: admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +msgid "Preview this Revision" +msgstr "Vista previa de esta revisión" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Publish" +msgstr "Ver / Publicar" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Approve" +msgstr "Ver / Aprobar" + +#: admin/post-editor-workflow-ui_rvy.php:59 +#: admin/post-editor-workflow-ui_rvy.php:67 admin/post-edit_rvy.php:153 +msgid "View saved revision" +msgstr "Ver la revisión guardada" + +#: admin/post-editor-workflow-ui_rvy.php:62 +msgid "View / Moderate saved revision" +msgstr "Ver / moderar la revisión guardada" + +#: admin/post-editor-workflow-ui_rvy.php:70 +msgid "View / Submit saved revision" +msgstr "Ver / Enviar revisión guardada" + +#: admin/post-editor-workflow-ui_rvy.php:79 +msgid "View unsaved changes" +msgstr "Ver cambios no guardados" + +#: admin/post-editor-workflow-ui_rvy.php:83 +msgid "%s%s Revision Edit" +msgid_plural "%s%s Revision Edits" +msgstr[0] "%s%s edición de la revisión" +msgstr[1] "%s%s ediciones de la revisión" + +#: admin/post-editor-workflow-ui_rvy.php:94 +msgid "Revision Submission Error" +msgstr "Error de envío de revisión" + +#: admin/post-editor-workflow-ui_rvy.php:108 +#: admin/post-editor-workflow-ui_rvy.php:200 front_rvy.php:437 +msgid "Edit" +msgstr "Editar" + +#: admin/post-editor-workflow-ui_rvy.php:115 +msgid "Approving the Revision..." +msgstr "Aprobación de la revisión..." + +#: admin/post-editor-workflow-ui_rvy.php:142 rvy_init-functions.php:264 +#: rvy_init-functions.php:282 rvy_init-functions.php:300 +#: rvy_init-functions.php:320 rvy_init-functions.php:337 +#: rvy_init-functions.php:354 rvy_init-functions.php:458 +msgid "Update Revision" +msgstr "Actualizar la revisión" + +#: admin/post-editor-workflow-ui_rvy.php:200 +msgid "Edit Revision" +msgstr "Editar la revisión" + +#: admin/post-editor-workflow-ui_rvy.php:206 +msgid "Update post before creating %s." +msgstr "Actualizar la entrada antes de crear %s." + +#: admin/post-editor-workflow-ui_rvy.php:213 +msgid "Error Creating Revision" +msgstr "Error al crear la revisión" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#: admin/post-editor-workflow-ui_rvy.php:235 +msgid "Update" +msgstr "Actualizar" + +#: admin/post-editor-workflow-ui_rvy.php:229 +msgid "For custom field changes, edit a scheduled %s." +msgstr "Para los cambios de campos personalizados, edita una %s programada." + +#: admin/post-edit_rvy.php:27 admin/post-edit_rvy.php:85 +msgid "Current Time" +msgstr "Hora actual" + +#: admin/post-edit_rvy.php:111 +msgid "View revision in progress" +msgstr "Ver la revisión en progreso" + +#: admin/post-edit_rvy.php:150 +msgid "View / moderate saved revision" +msgstr "Ver / moderar la revisión guardada" + +#: admin/revision-action_rvy.php:421 admin/revision-action_rvy.php:507 +msgid "[%s] Revision Approval Notice" +msgstr "[%s] Aviso de aprobación de revisión" + +#: admin/revision-action_rvy.php:422 +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "Una revisión para la %1$s «%2$s» ha sido aprobada." + +#: admin/revision-action_rvy.php:426 +msgid "The submitter was %1$s." +msgstr "El remitente fue %1$s." + +#: admin/revision-action_rvy.php:430 admin/revision-action_rvy.php:512 +msgid "It will be published on %s" +msgstr "Se publicará el %s" + +#: admin/revision-action_rvy.php:434 admin/revision-action_rvy.php:516 +msgid "Preview it here: " +msgstr "Una vista previa aquí: " + +#: admin/revision-action_rvy.php:437 admin/revision-action_rvy.php:519 +msgid "Editor: " +msgstr "Editor: " + +#: admin/revision-action_rvy.php:439 admin/revision-action_rvy.php:521 +#: admin/revision-action_rvy.php:1352 admin/revision-action_rvy.php:1377 +#: admin/revision-action_rvy.php:1439 +msgid "View it online: " +msgstr "Ver en línea: " + +#: admin/revision-action_rvy.php:508 +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "La revisión que has enviado para la %1$s «%2$s» ha sido aprobada." + +#: admin/revision-action_rvy.php:1348 admin/revision-action_rvy.php:1370 +msgid "[%s] %s Publication Notice" +msgstr "[%s] %s aviso de publicación" + +#: admin/revision-action_rvy.php:1349 +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "" +"La revisión programada que has enviado para la %1$s «%2$s» ha sido publicada." + +#: admin/revision-action_rvy.php:1371 +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "Se ha publicado una revisión programada de tu %1$s «%2$s." + +#: admin/revision-archive_rvy.php:11 +msgid "Revision for:" +msgstr "Revisión por:" + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "No estás autorizado a gestionar las revisiones." + +#: admin/revision-queue_rvy.php:13 +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "%s y %s están desactivados. Ver Revisiones > Ajustes." + +#: admin/revision-queue_rvy.php:46 +msgid "%s revision submitted." +msgid_plural "%s revisions submitted." +msgstr[0] "%s revisión enviada." +msgstr[1] "%s revisiones enviadas." + +#: admin/revision-queue_rvy.php:47 +msgid "%s revision declined." +msgid_plural "%s revisions declined." +msgstr[0] "%s revisión rechazada." +msgstr[1] "%s revisiones rechazadas." + +#: admin/revision-queue_rvy.php:48 +msgid "%s revision approved." +msgid_plural "%s revisions approved." +msgstr[0] "%s revisión aprobada." +msgstr[1] "%s revisiones aprobadas." + +#: admin/revision-queue_rvy.php:49 +msgid "%s revision unscheduled." +msgid_plural "%s revisions unscheduled." +msgstr[0] "%s revisión no programada." +msgstr[1] "%s revisiones no programadas." + +#: admin/revision-queue_rvy.php:50 +msgid "%s revision published." +msgid_plural "%s revisions published." +msgstr[0] "%s revisión publicada." +msgstr[1] "%s revisiones publicadas." + +#: admin/revision-queue_rvy.php:93 +msgctxt "Author Name" +msgid "%s: " +msgstr "%s: " + +#: admin/revision-queue_rvy.php:106 +msgctxt "Posts / Pages / etc." +msgid "of %s" +msgstr "de %s" + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +msgid "%sPost Author: %s" +msgstr "%sAutor de la entrada: %s" + +#: admin/revision-queue_rvy.php:121 +msgctxt "PublishedPostName (other filter captions)" +msgid "Revision Queue for \"%s\"%s" +msgstr "Cola de revisión para «%s»%s" + +#: admin/revision-queue_rvy.php:123 +msgid "Revision Queue %s" +msgstr "Cola de revisión %s" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "Los editores serán avisados (pero no podrán ser seleccionados aquí)." + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "No se enviarán avisos por correo electrónico." + +#. translators: revision date format, see http://php.net/date +#: admin/revision-ui_rvy.php:73 +msgctxt "revision date format" +msgid "j F, Y @ g:i a" +msgstr "j \\d\\e F \\d\\e Y @ H:i" + +#: admin/revision-ui_rvy.php:92 +msgid "%1$s (Current)" +msgstr "%1$s (Actual)" + +#: admin/revision-ui_rvy.php:96 +msgid "%1$s (Autosave)" +msgstr "%1$s (Autoguardado)" + +#: admin/revision-ui_rvy.php:102 +msgctxt "revision schedule date format" +msgid "j F, Y, g:i a" +msgstr "j \\d\\e F \\d\\e Y, H:i" + +#: admin/revision-ui_rvy.php:106 +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" +"%1$s (Publicación solicitada: " +"%2$s)" + +#: admin/revision-ui_rvy.php:108 +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "" +"%1$s (Fecha de publicación: %2$s)" + +#: admin/revision-ui_rvy.php:277 +msgid "The revision will be deleted. Are you sure?" +msgstr "La revisión será borrada. ¿Estás seguro?" + +#: admin/revision-ui_rvy.php:370 +msgid "Modified Date" +msgstr "Fecha de modificación" + +#: admin/RevisionEditSubmitMetabox.php:124 +msgid "Preview revision in progress" +msgstr "Previsualizar la revisión en progreso" + +#. translators: Publish box date formt, see http://php.net/date +#: admin/RevisionEditSubmitMetabox.php:180 +msgid "M j, Y @ G:i" +msgstr "j \\d\\e F \\d\\e Y @ H:i" + +#: admin/RevisionEditSubmitMetabox.php:191 +msgid "Publish %son approval%s" +msgstr "Publicar %sprevia aprobación%s" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" +"Nota: Para la visualización de las revisiones, añade el " +"siguiente código a foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "No se ha especificado ninguna revisión." + +#: admin/revisions.php:56 +msgid "Past" +msgstr "Anterior" + +#: admin/revisions.php:119 +msgid "Revisions of %s" +msgstr "Revisiones de %s" + +#: admin/revisions.php:149 +msgid "The requested revision does not exist." +msgstr "La revisión solicitada no existe." + +#: admin/revisions.php:219 +msgid "Past Revisions" +msgstr "Revisiones anteriores" + +#: admin/revisions.php:235 +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "%1$s %2$s (%3$s)%4$s" + +#: admin/revisions.php:256 +msgid "no %s revisions available." +msgstr "no hay revisiones %s disponibles." + +#: front_rvy.php:403 +msgid "%sView Queue%s" +msgstr "%sVer cola%s" + +#: front_rvy.php:412 +msgid "%sCompare%s%sView Published Post%s" +msgstr "%sComparar%s%sVer entrada publicada%s" + +#: front_rvy.php:426 +msgid "%sView Published Post%s" +msgstr "%sVer entrada publicada%s" + +#: front_rvy.php:482 rvy_init-functions.php:274 rvy_init-functions.php:330 +msgid "Submit" +msgstr "Enviar" + +#: front_rvy.php:489 front_rvy.php:525 front_rvy.php:541 +msgid "Publish now" +msgstr "Publicar ahora" + +#: front_rvy.php:494 front_rvy.php:496 front_rvy.php:529 front_rvy.php:531 +msgid "This is a %s. %s %s %s" +msgstr "Esto es un %s. %s %s %s" + +#: front_rvy.php:508 +msgid "Decline" +msgstr "Rechazar" + +#: front_rvy.php:518 front_rvy.php:520 +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "Esto es un %s (fecha de publicación solicitada: %s). %s %s %s" + +#: front_rvy.php:544 front_rvy.php:546 +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "Esto es un %s (para publicar en %s). %s %s %s" + +#: front_rvy.php:561 front_rvy.php:563 +msgid "This is the Current Revision. %s" +msgstr "Esta es la revisión actual. %s" + +#: front_rvy.php:575 +msgid "Restore" +msgstr "Restaurar" + +#: front_rvy.php:579 front_rvy.php:581 +msgid "This is a Past Revision (from %s). %s %s" +msgstr "Esta es una revisión anterior (de %s). %s %s" + +#: includes/CoreAdmin.php:73 +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "Actualiza a PublishPress Revisions Pro" + +#: includes/CoreAdmin.php:78 +msgid "" +"Upgrade to PublishPress Revisions Pro for integration with key features of " +"these plugins:" +msgstr "" +"Actualiza a PublishPress Revisions Pro para la integración con las " +"características clave de estos plugins:" + +#: includes/CoreAdmin.php:81 +msgid "Elementor" +msgstr "Elementor" + +#: includes/CoreAdmin.php:82 +msgid "Divi Builder" +msgstr "Divi Builder" + +#: includes/CoreAdmin.php:83 +msgid "Beaver Builder" +msgstr "Beaver Builder" + +#: includes/CoreAdmin.php:84 +msgid "Advanced Custom Fields" +msgstr "Advanced Custom Fields" + +#: includes/CoreAdmin.php:85 +msgid "Pods" +msgstr "Pods" + +#: includes/CoreAdmin.php:86 +msgid "WooCommerce" +msgstr "WooCommerce" + +#: includes/CoreAdmin.php:87 +msgid "WPML" +msgstr "WPML" + +#: includes/CoreAdmin.php:89 +msgid "plugin integration details..." +msgstr "detalles de la integración del plugin…" + +#: includes/CoreAdmin.php:100 +msgid "Need PublishPress Revisions Support?" +msgstr "¿Necesitas ayuda con PublishPress Revisions?" + +#: includes/CoreAdmin.php:105 +msgid "If you need help or have a new feature request, let us know." +msgstr "" +"Si necesitas ayuda o tienes una petición de nueva característica, háznoslo " +"saber." + +#: includes/CoreAdmin.php:107 +msgid "Request Support" +msgstr "Solicitar soporte" + +#: includes/CoreAdmin.php:116 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" +"La documentación detallada también está disponible en el sitio del plugin." + +#: includes/CoreAdmin.php:118 +msgid "View Knowledge Base" +msgstr "Ver la base de conocimiento" + +#: lib/debug.php:110 +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "%1$s consultas en %2$s segundos. %3$s MB usados." + +#: revision-creation_rvy.php:185 +msgid "Could not insert revision into the database" +msgstr "No se ha podido insertar la revisión en la base de datos" + +#: revision-workflow_rvy.php:157 +msgid "[%s] %s Updated" +msgstr "[%s] %s Actualizado" + +#: revision-workflow_rvy.php:159 +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "%1$s ha actualizado una %2$s de la %3$s «%4$s»." + +#: revision-workflow_rvy.php:161 +msgid "[%s] %s" +msgstr "[%s] %s" + +#: revision-workflow_rvy.php:163 +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" +"%1$s ha enviado cambios a %2$s «%3$s». Puedes revisar los cambios para su " +"posible publicación:" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "Vista previa y aprobación: " + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "Cola de revisión: " + +#: revision-workflow_rvy.php:176 +msgid "Edit %s: " +msgstr "Editar %s: " + +#: revisionary.php:120 +msgid "This plugin can be deleted." +msgstr "Este plugin se puede borrar." + +#: rvy_init-functions.php:77 +msgid "Every 2 Minutes" +msgstr "Cada 2 minutos" + +#: rvy_init-functions.php:254 rvy_init-functions.php:266 +msgid "Working Copy" +msgstr "Copia de trabajo" + +#: rvy_init-functions.php:255 +msgid "Create Working Copy" +msgstr "Crear copia de trabajo" + +#: rvy_init-functions.php:256 +msgid "Copy" +msgstr "Copiar" + +#: rvy_init-functions.php:257 +msgid "Creating Working Copy..." +msgstr "Creación de la copia de trabajo…" + +#: rvy_init-functions.php:258 +msgid "Working Copy ready" +msgstr "Copia de trabajo lista" + +#: rvy_init-functions.php:259 rvy_init-functions.php:277 +msgid "Approve Changes" +msgstr "Aprobar los cambios" + +#: rvy_init-functions.php:261 rvy_init-functions.php:279 +msgid "Approving Changes..." +msgstr "Aprobando los cambios…" + +#: rvy_init-functions.php:262 rvy_init-functions.php:280 +#: rvy_init-functions.php:298 +msgid "Publish Changes" +msgstr "Publicar cambios" + +#: rvy_init-functions.php:263 rvy_init-functions.php:281 +#: rvy_init-functions.php:299 rvy_init-functions.php:319 +#: rvy_init-functions.php:336 rvy_init-functions.php:353 +msgid "Save Revision" +msgstr "Guardar la revisión" + +#: rvy_init-functions.php:265 +msgid "Working Copies" +msgstr "Copias de trabajo" + +#: rvy_init-functions.php:267 +msgid "Working Copies (%d)" +msgid_plural "Working Copies (%d)" +msgstr[0] "Copia de trabajo (%d)" +msgstr[1] "Copias de trabajo (%d)" + +#: rvy_init-functions.php:272 rvy_init-functions.php:284 +msgid "Change Request" +msgstr "Solicitud de cambio" + +#: rvy_init-functions.php:273 +msgid "Submit Change Request" +msgstr "Enviar solicitud de cambio" + +#: rvy_init-functions.php:275 +msgid "Submitting Changes..." +msgstr "Enviando los cambios…" + +#: rvy_init-functions.php:276 +msgid "Changes Submitted" +msgstr "Cambios enviados" + +#: rvy_init-functions.php:283 +msgid "Change Requests" +msgstr "Solicitudes de cambios" + +#: rvy_init-functions.php:285 +msgid "Change Requests (%d)" +msgid_plural "Change Requests (%d)" +msgstr[0] "Solicitud de cambio (%d)" +msgstr[1] "Solicitudes de cambios (%d)" + +#: rvy_init-functions.php:286 +msgid "Enable Change Requests" +msgstr "Activar las solicitudes de cambio" + +#: rvy_init-functions.php:291 rvy_init-functions.php:302 +msgid "Scheduled Change" +msgstr "Cambio programado" + +#: rvy_init-functions.php:292 rvy_init-functions.php:293 +#: rvy_init-functions.php:296 rvy_init-functions.php:297 +msgid "Schedule Changes" +msgstr "Programación de cambios" + +#: rvy_init-functions.php:294 +msgid "Scheduling Changes..." +msgstr "Programación de los cambios…" + +#: rvy_init-functions.php:295 +msgid "Changes are Scheduled." +msgstr "Los cambios están programados." + +#: rvy_init-functions.php:301 +msgid "Scheduled Changes" +msgstr "Cambios programados" + +#: rvy_init-functions.php:303 +msgid "Scheduled Changes (%d)" +msgid_plural "Scheduled Changes (%d)" +msgstr[0] "Cambio programado (%d)" +msgstr[1] "Cambios programados (%d)" + +#: rvy_init-functions.php:311 +msgid "Unsubmitted Revision" +msgstr "Revisión no enviada" + +#: rvy_init-functions.php:312 rvy_init-functions.php:313 +msgid "New Revision" +msgstr "Nueva revisión" + +#: rvy_init-functions.php:314 +msgid "Creating Revision..." +msgstr "Creación de la revisión…" + +#: rvy_init-functions.php:315 +msgid "The Revision is ready to edit." +msgstr "La revisión está lista para ser editada." + +#: rvy_init-functions.php:315 +msgid "Revision ready to edit." +msgstr "Revisión lista para editar." + +#: rvy_init-functions.php:316 rvy_init-functions.php:333 +#: rvy_init-functions.php:350 +msgid "Approve Revision" +msgstr "Aprobar la revisión" + +#: rvy_init-functions.php:318 rvy_init-functions.php:335 +#: rvy_init-functions.php:352 +msgid "Publish Revision" +msgstr "Publicar la revisión" + +#: rvy_init-functions.php:321 +msgid "Unsubmitted Revisions" +msgstr "Revisiones no enviadas" + +#: rvy_init-functions.php:322 +msgid "Not Submitted" +msgstr "No enviada" + +#: rvy_init-functions.php:323 +msgid "Not Submitted for Approval (%s)" +msgid_plural "Not Submitted for Approval (%s)" +msgstr[0] "No enviada para su aprobación (%s)" +msgstr[1] "No enviadas para sus aprobaciones (%s)" + +#: rvy_init-functions.php:328 +msgid "Submitted Revision" +msgstr "Revisión enviada" + +#: rvy_init-functions.php:329 rvy_init-functions.php:461 +msgid "Submit Revision" +msgstr "Enviar la revisión" + +#: rvy_init-functions.php:331 +msgid "Submitting Revision..." +msgstr "Envio de la revisión…" + +#: rvy_init-functions.php:332 +msgid "The Revision is Submitted" +msgstr "La revisión ha sido enviada" + +#: rvy_init-functions.php:332 +msgid "Revision Submitted" +msgstr "Revisión enviada" + +#: rvy_init-functions.php:338 +msgid "Submitted Revisions" +msgstr "Revisiones enviadas" + +#: rvy_init-functions.php:339 +msgid "Submitted" +msgstr "Enviado" + +#: rvy_init-functions.php:340 +msgid "Submitted for Approval (%s)" +msgid_plural "Submitted for Approval (%s)" +msgstr[0] "Enviada para su aprobación (%s)" +msgstr[1] "Enviadas para sus aprobaciones (%s)" + +#: rvy_init-functions.php:345 +msgid "Scheduled Revision" +msgstr "Revisión programada" + +#: rvy_init-functions.php:346 rvy_init-functions.php:347 +msgid "Schedule Revision" +msgstr "Programar revisión" + +#: rvy_init-functions.php:348 +msgid "Scheduling Revision..." +msgstr "Programación de la revisión…" + +#: rvy_init-functions.php:349 +msgid "The Revision is Scheduled" +msgstr "La revisión está programada" + +#: rvy_init-functions.php:349 +msgid "Revision Scheduled" +msgstr "Revisión programada" + +#: rvy_init-functions.php:355 +msgid "Scheduled Revisions" +msgstr "Revisiones programadas" + +#: rvy_init-functions.php:356 +msgid "Scheduled" +msgstr "Programada" + +#: rvy_init-functions.php:357 +msgid "Scheduled Revision (%s)" +msgid_plural "Scheduled Revisions (%s)" +msgstr[0] "Revisión programada (%s)" +msgstr[1] "Revisiones programadas (%s)" + +#: rvy_init-functions.php:448 +msgid "%sMy Copies & Changes%s(%s)
    " +msgid_plural "%sMy Copies & Changes%s(%s)
    " +msgstr[0] "%sMi copia y cambios%s(%s)
    " +msgstr[1] "%sMis copias y cambios%s(%s)
    " + +#: rvy_init-functions.php:449 +msgid "%sMy Revisions%s(%s)
    " +msgid_plural "%sMy Revisions%s(%s)
    " +msgstr[0] "%sMi revisión%s(%s)" +msgstr[1] "%sMis revisiones%s(%s)" + +#: rvy_init-functions.php:451 +msgid "%sRevisions to My Posts%s(%s)" +msgid_plural "%sRevisions to My Posts%s(%s)" +msgstr[0] "%sRevisión de mi entrada%s(%s)" +msgstr[1] "%sRevisiones de mis entradas%s(%s)" + +#: rvy_init-functions.php:456 +msgid "Post Author" +msgstr "Autor de la entrada" + +#: rvy_init-functions.php:457 +msgid "Published Post" +msgstr "Entrada publicada" + +#: rvy_init-functions.php:462 +msgid "Submit Changes" +msgstr "Enviar cambios" + +#: rvy_init-functions.php:663 +msgid "Revisor" +msgstr "Revisor" + +#: rvy_init-functions.php:675 +msgctxt "User role" +msgid "Revisor" +msgstr "Revisor" + +#: rvy_init-functions.php:1153 +msgid "Revision Workflow" +msgstr "Flujo de trabajo de revisión" + +#~ msgid "View / Approve saved revision" +#~ msgstr "Ver / Aprobar revisión guardada" + +#~ msgid "Move to Trash" +#~ msgstr "Mover a la papelera" + +#~ msgid "Status:" +#~ msgstr "Estado:" + +#, php-format +#~ msgid "Scheduled for: %s" +#~ msgstr "Programada para: %s" + +#, php-format +#~ msgid "Publish on: %s" +#~ msgstr "Publicada el: %s" + +#~ msgid "Error in deleting." +#~ msgstr "Error al borrar." + +#~ msgid "Scheduled Rev." +#~ msgstr "Revisión programada" + +#~ msgid "Delete" +#~ msgstr "Borrar" + +#~ msgid "Schedule" +#~ msgstr "Programar" + +#, php-format +#~ msgid "%s ago" +#~ msgstr "%s atrás" + +#~ msgid "Missed schedule" +#~ msgstr "Programación perdida" + +#~ msgid "View" +#~ msgstr "Ver" + +#~ msgid "Show more details" +#~ msgstr "Muestra más detalles" + +#~ msgid "Publish" +#~ msgstr "Publicar" + +#~ msgid "Delete Permanently" +#~ msgstr "Borrar permanentemente" + +#~ msgid "Filter by category" +#~ msgstr "Filtrar por categoría" + +#~ msgid "Select All" +#~ msgstr "Seleccionar todo" + +#, php-format +#~ msgid "“%s” (Edit)" +#~ msgstr "«%s» (Editar)" + +#~ msgid "Enable public preview" +#~ msgstr "Activar la vista previa pública" + +#~ msgid "Return to editor" +#~ msgstr "Volver al editor" + +#~ msgid "(no title)" +#~ msgstr "(sin título)" + +#, php-format +#~ msgid "%s%s ago" +#~ msgstr "%s%s atrás" + +#, php-format +#~ msgid "Additional role capability required to manage %s" +#~ msgstr "Es necesaria una capacidad de perfil adicional para gestionar %s" + +#, php-format +#~ msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +#~ msgstr "" +#~ "Lista de entradas / páginas: Usar la leyenda «Editar» para el enlace %s" + +#~ msgid "Display Hints" +#~ msgstr "Mostrar sugerencias" + +#~ msgid "Compare Past Revisions ordering:" +#~ msgstr "Ordenar comparaciones de revisiones anteriores:" + +#, php-format +#~ msgid "%s capabilities" +#~ msgstr "Capacidades de %s" + +#~ msgid "Preview / Submit" +#~ msgstr "Vista previa / Enviar" + +#~ msgid "View / Submit" +#~ msgstr "Ver / Enviar" + +#, php-format +#~ msgid "It was submitted by %1$s." +#~ msgstr "Ha sido enviado por %1$s." + +#, php-format +#~ msgid "[%s] %s Publication" +#~ msgstr "[%s] %s publicación" + +#, php-format +#~ msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +#~ msgstr "Se ha publicado una revisión programada de la %1$s «%2$s»." + +#, php-format +#~ msgid "%s revision permanently deleted." +#~ msgstr "%s revisión borrada permanentemente." + +#~ msgid "Undo" +#~ msgstr "Deshacer" + +#, php-format +#~ msgid "Preview “%s”" +#~ msgstr "Vista previa «%s»" + +#~ msgid "Actions" +#~ msgstr "Acciones" + +#~ msgid "Bulk Actions" +#~ msgstr "Acciones en lote" + +#~ msgid "Pending" +#~ msgstr "Pendiente" + +#~ msgid "" +#~ "This plugin is outdated. You already have a more recent version " +#~ "installed. Please remove this version." +#~ msgstr "" +#~ "Este plugin está obsoleto. Ya tienes instalada una versión más reciente. " +#~ "Por favor, elimina esta versión." + +#, php-format +#~ msgid "" +#~ "This plugin is not installed in the standard folder. The current path is " +#~ "%1$s but it is expected to be %2$s." +#~ msgstr "" +#~ "Este plugin no está instalado en la carpeta estándar. La ruta actual es " +#~ "%1$s pero debería ser %2$s." + +#, php-format +#~ msgid "" +#~ "You have activated multiple instances of %s. Please keep only one " +#~ "activated and remove the others." +#~ msgstr "" +#~ "Has activado varias instancias de %s. Por favor, mantén solo una activada " +#~ "y elimina las demás." + +#, php-format +#~ msgid "Please deactivate %1$s when %2$s is activated." +#~ msgstr "Por favor, desactiva %1$s cuando %2$s esté activado." + +#, php-format +#~ msgid "" +#~ "Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +#~ "been useful. Please could you quickly leave a 5-star rating on WordPress." +#~ "org? It really does help to keep %1$s growing." +#~ msgstr "" +#~ "Hola, has estado usando %1$s para %2$s en tu sitio. Esperamos que el " +#~ "plugin te haya sido útil. ¿Podrías dejar rápidamente una valoración de 5 " +#~ "estrellas en WordPress.org? Realmente ayudaría a que %1$s siga creciendo." + +#~ msgid "1 week" +#~ msgstr "1 semana" + +#~ msgid "1 month" +#~ msgstr "1 mes" + +#~ msgid "3 months" +#~ msgstr "3 meses" + +#, php-format +#~ msgid "Click here to add your rating for %s" +#~ msgstr "Haz clic aquí para añadir tu valoración para %s" + +#~ msgid "Maybe later" +#~ msgstr "Quizá más tarde" + +#~ msgid "I already did" +#~ msgstr "Ya lo hice" + +#~ msgid "Amazing! We are redirecting you to our site..." +#~ msgstr "¡Genial! Te estamos redirigiendo a nuestro sitio…" + +#, php-format +#~ msgid "" +#~ "Another copy of PublishPress Revisions (or Revisionary) is already " +#~ "activated (version %1$s: \"%2$s\")" +#~ msgstr "" +#~ "Otra copia de PublishPress Revisions (o Revisionary) ya está activada " +#~ "(versión %1$s: «%2$s»)" + +#, php-format +#~ msgid "" +#~ "Another copy of PublishPress Revisions (or Revisionary) is already " +#~ "activated (version %1$s)" +#~ msgstr "" +#~ "Otra copia de PublishPress Revisions (o Revisionary) ya está activada " +#~ "(versión %1$s)" + +#~ msgctxt "revision date short format" +#~ msgid "j M @ g:i a" +#~ msgstr "j M @ g:i a" + +#~ msgctxt "post revision" +#~ msgid "%1$s by %2$s" +#~ msgstr "%1$s por %2$s" diff --git a/wp-content/plugins/revisionary/languages/revisionary-fr_FR.mo b/wp-content/plugins/revisionary/languages/revisionary-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..4e3556d7625f3189334d5bc59e48065194dbd6a0 GIT binary patch literal 40220 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 j7w4(mNfCX+?F7r~B8 1;\n" +"X-Generator: Poedit 3.4\n" + +#. Plugin Name of the plugin +msgid "PublishPress Revisions" +msgstr "PublishPress Revisions" + +#. Plugin URI of the plugin +msgid "https://publishpress.com/revisionary/" +msgstr "https://publishpress.com/revisionary/" + +#. Description of the plugin +msgid "" +"Maintain published content with teamwork and precision using the Revisions " +"model to submit, approve and schedule changes." +msgstr "" +"Maintenez le contenu publié avec un travail d’équipe et de précision en " +"utilisant le modèle de révisions pour envoyer, approuver et planifier les " +"modifications." + +#. Author of the plugin +msgid "PublishPress" +msgstr "PublishPress" + +#. Author URI of the plugin +msgid "https://publishpress.com" +msgstr "https://publishpress.com" + +#: admin/admin-init_rvy.php:105 admin/admin-init_rvy.php:337 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Désolé, vous n’avez pas l’autorisation de supprimer cette révision." + +#: admin/admin-init_rvy.php:194 admin/admin-init_rvy.php:308 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "Désolé, vous n’avez pas l’autorisation d’approuver cette révision." + +#: admin/admin-init_rvy.php:235 +msgid "Sorry, you are not allowed to submit this revision." +msgstr "Désolé, vous n’êtes pas autorisé à envoyer cette révision." + +#: admin/admin-init_rvy.php:273 +msgid "Sorry, you are not allowed to decline this revision." +msgstr "Désolé, vous n’avez pas l’autorisation de refuser cette révision." + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "La révision a été restaurée." + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "La révision a été planifiée pour la publication." + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "La révision a été publiée." + +#: admin/admin-posts_rvy.php:142 admin/class-list-table-archive.php:425 +#: rvy_init-functions.php:453 +msgid "Revision" +msgstr "Révision" + +#: admin/admin-posts_rvy.php:159 +msgid "Has Revision" +msgstr "Dispose d’une révision" + +#: admin/admin-posts_rvy.php:174 admin/admin_rvy.php:274 +msgid "Revision Queue" +msgstr "File d’attente des révisions" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:235 +msgid "PublishPress Revisions Network Settings" +msgstr "Réglages de PublishPress Revisions pour le réseau" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "Réglages du réseau" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:237 +msgid "PublishPress Revisions Network Defaults" +msgstr "Valeurs par défaut de PublishPress Revisions pour le réseau" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "Valeurs par défaut du réseau" + +#: admin/admin_rvy.php:121 +msgid "" +"Scheduled Revisions are not available because WP-Cron is disabled on this " +"site. See %sRevisions > Settings > Scheduled Revisions%s." +msgstr "" +"Les révisions planifiées ne sont pas disponibles car WP-Cron est désactivé " +"sur ce site. Voir %sRevisions > Réglages > Révisions programmées%s." + +#: admin/admin_rvy.php:199 +msgctxt "groups per page (screen options)" +msgid "Revisions" +msgstr "Révisions" + +#: admin/admin_rvy.php:238 +msgid "Revisions" +msgstr "Révisions" + +#: admin/admin_rvy.php:283 admin/admin_rvy.php:284 +#: admin/revision-archive_rvy.php:80 +msgid "Revision Archive" +msgstr "Archive des révisions" + +#: admin/admin_rvy.php:299 admin/options.php:241 +msgid "PublishPress Revisions Settings" +msgstr "Réglages de PublishPress Revisions" + +#: admin/admin_rvy.php:299 admin/options.php:92 +msgid "Settings" +msgstr "Réglages" + +#: admin/admin_rvy.php:306 admin/admin_rvy.php:307 includes/CoreAdmin.php:93 +msgid "Upgrade to Pro" +msgstr "Passer à la version Pro" + +#: admin/admin_rvy.php:384 +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "Si vous appréciez %s, veuillez nous laisser une note de %s. Merci !" + +#: admin/admin_rvy.php:395 +msgid "About" +msgstr "À propos" + +#: admin/admin_rvy.php:397 +msgid "Documentation" +msgstr "Documentation" + +#: admin/admin_rvy.php:399 +msgid "Contact" +msgstr "Contact" + +#: admin/agents_checklist_rvy.php:75 +msgid "show current users (%d)" +msgstr "afficher les utilisateurs et les utilisatrices courant(e)s (%d)" + +#: admin/agents_checklist_rvy.php:77 +msgid "show eligible users (%d)" +msgstr "afficher les utilisateurs et les utilisatrices admissibles (%d)" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "filtrer :" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "sélectionner" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "déselectionner" + +#: admin/class-list-table-archive.php:157 +msgid "Revision Author: %s" +msgstr "Auteur/autrice de la révision : %s" + +#: admin/class-list-table-archive.php:174 +msgid "Post Author: %s" +msgstr "Auteur/autrice de la publication : %s" + +#: admin/class-list-table-archive.php:197 +msgid "Search results for \"%s\"" +msgstr "Résultats de recherche pour « %s »" + +#: admin/class-list-table-archive.php:385 admin/class-list-table_rvy.php:1050 +#: admin/class-list-table_rvy.php:1317 admin/post-edit-block-ui_rvy.php:94 +#: admin/post-edit_rvy.php:52 admin/RevisionEditSubmitMetabox.php:62 +msgid "Delete Revision" +msgstr "Supprimer la révision" + +#: admin/class-list-table-archive.php:426 +msgid "Count" +msgstr "Nombre" + +#: admin/class-list-table-archive.php:427 admin/class-list-table_rvy.php:548 +msgid "Post Type" +msgstr "Type de publication" + +#: admin/class-list-table-archive.php:428 rvy_init-functions.php:454 +msgid "Revised By" +msgstr "Révisé par" + +#: admin/class-list-table-archive.php:429 rvy_init-functions.php:455 +msgid "Revision Date" +msgstr "Date de la révision" + +#: admin/class-list-table-archive.php:430 +msgid "Method" +msgstr "Méthode" + +#: admin/class-list-table-archive.php:431 +msgid "Approved By" +msgstr "Approuvée par" + +#: admin/class-list-table-archive.php:432 +msgid "Published Date" +msgstr "Date de publication" + +#: admin/class-list-table-archive.php:433 +msgid "Published Author" +msgstr "Auteur/autrice publié" + +#: admin/class-list-table-archive.php:461 +msgid "just now" +msgstr "maintenant" + +#: admin/class-list-table-archive.php:464 +msgid "%s minutes ago" +msgstr "il y a %s minutes" + +#: admin/class-list-table-archive.php:469 +msgid "%s hours ago" +msgstr "il y a %s heures" + +#: admin/class-list-table-archive.php:511 +msgid "Revisions are disabled for %s post type" +msgstr "Les révisions sont désactivées pour le type de publication %s" + +#: admin/class-list-table-archive.php:566 +#: admin/class-list-table-archive.php:571 +msgid "Submitted Rev." +msgstr "Révision envoyée" + +#: admin/class-list-table-archive.php:573 +msgid "Direct Edit" +msgstr "Modification directe" + +#: admin/class-list-table-archive.php:634 +msgid "Reset Filters" +msgstr "Réinitialiser les filtres" + +#: admin/class-list-table-archive.php:657 +msgid "All post types" +msgstr "Tous les types de publication" + +#: admin/class-list-table-archive.php:693 +msgid "All" +msgstr "Tout" + +#: admin/class-list-table-archive.php:707 +msgid "My Revisions" +msgstr "Mes révisions" + +#: admin/class-list-table-archive.php:752 +msgid "Compare Changes in %s" +msgstr "Comparer les modifications en %s" + +#: admin/class-list-table-archive.php:756 admin/class-list-table_rvy.php:1358 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:178 +#: admin/post-edit_rvy.php:192 +msgctxt "revisions" +msgid "Compare" +msgstr "Comparer" + +#. translators: %s: post title +#: admin/class-list-table-archive.php:771 admin/class-list-table_rvy.php:1342 +#: admin/post-editor-workflow-ui_rvy.php:199 +msgid "Preview Revision" +msgstr "Prévisualisation de la révision" + +#: admin/class-list-table-archive.php:783 +msgid "List Revisions of this Post" +msgstr "Lister les révisions de cette publication" + +#: admin/class-list-table-archive.php:784 +msgid "Filter" +msgstr "Filtrer" + +#: admin/class-list-table-archive.php:796 +msgid "Delete Past Revision" +msgstr "Supprimer la révision précédente" + +#: admin/class-list-table-archive.php:882 +msgid "No revisions found." +msgstr "Aucune révisions trouvée" + +#: admin/class-list-table_rvy.php:547 admin/post-editor-workflow-ui_rvy.php:31 +msgid "Status" +msgstr "État" + +#: admin/class-list-table_rvy.php:601 admin/class-list-table_rvy.php:1224 +msgid "Y/m/d g:i:s a" +msgstr "Y/m/d g:i:s a" + +#: admin/class-list-table_rvy.php:611 admin/class-list-table_rvy.php:1232 +msgid "Y/m/d g:i a" +msgstr "Y/m/d g:i a" + +#: admin/class-list-table_rvy.php:618 +msgid "Scheduled publication: %s" +msgstr "Publication planifiée : %s" + +#: admin/class-list-table_rvy.php:621 +msgid "Requested publication: %s" +msgstr "Publication demandée : %s" + +#: admin/class-list-table_rvy.php:666 admin/history_rvy.php:786 +msgid "No author" +msgstr "Aucun(e) auteur ou autrice" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:708 +msgid "View only revisions of %s" +msgstr "Afficher uniquement les révisions de %s" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:720 admin/class-list-table_rvy.php:728 +msgid "View published post" +msgstr "Voir la publication publiée" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:752 +msgid "Compare Past Revisions" +msgstr "Comparer les révisions précédentes" + +#: admin/class-list-table_rvy.php:753 +msgid "History" +msgstr "Historique" + +#: admin/class-list-table_rvy.php:1006 +msgid "My Activity" +msgstr "Mon activité" + +#: admin/class-list-table_rvy.php:1014 +msgid "All %s" +msgstr "Tous %s" + +#: admin/class-list-table_rvy.php:1046 +msgid "Unschedule" +msgstr "Déplanifier" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1050 admin/class-list-table_rvy.php:1313 +#: admin/post-edit-block-ui_rvy.php:94 admin/post-edit_rvy.php:52 +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Discard Revision" +msgstr "Rejeter la révision" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1357 +msgid "Compare Changes" +msgstr "Comparer les modifications" + +#: admin/class-list-table_rvy.php:1366 +msgctxt "revisions" +msgid "Decline" +msgstr "Refuser" + +#: admin/edit-revision-classic-ui_rvy.php:63 +msgid "Publish on approval" +msgstr "Publier sur approbation" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "Comparez cette révision à la copie publiée ou à d’autres révisions" + +#: admin/edit-revision-classic-ui_rvy.php:106 +msgid "Revision updated. %sView Preview%s" +msgstr "Révision mise à jour. %sVoir aperçu%s" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "Révision mise à jour." + +#: admin/history_rvy.php:191 +msgid "Compare %s of \"%s\"" +msgstr "Comparez %s de « %s »" + +#: admin/history_rvy.php:535 admin/options.php:767 +msgid "Post Date" +msgstr "Date de la publication" + +#: admin/history_rvy.php:536 +msgid "Post Parent" +msgstr "Publication parente" + +#: admin/history_rvy.php:537 +msgid "Menu Order" +msgstr "Ordre du menu" + +#: admin/history_rvy.php:538 +msgid "Comment Status" +msgstr "État du commentaire" + +#: admin/history_rvy.php:539 +msgid "Ping Status" +msgstr "État du ping" + +#: admin/history_rvy.php:674 +msgid "Page Template" +msgstr "Modèle de page" + +#: admin/history_rvy.php:677 +msgid "Featured Image" +msgstr "Image mise en avant" + +#: admin/history_rvy.php:681 +msgid "Beaver Builder Data" +msgstr "Données de Beaver Builder" + +#: admin/history_rvy.php:682 +msgid "Beaver Builder Settings" +msgstr "Réglages de Beaver Builder" + +#: admin/history_rvy.php:914 +msgid "Scheduled for " +msgstr "Planifié pour " + +#: admin/history_rvy.php:919 +msgid "Requested for " +msgstr "Demandé pour " + +#: admin/history_rvy.php:924 +msgid "Modified " +msgstr "Modifiée " + +#: admin/history_rvy.php:929 +msgid "%s%s from now" +msgstr "%s%s à partir de maintenant" + +#: admin/history_rvy.php:940 +msgid "M j, Y @ g:i a" +msgstr "j M Y @ G\\hi" + +#: admin/history_rvy.php:985 +msgid "M j, Y @ H:i" +msgstr "j M Y @ H:i" + +#: admin/history_rvy.php:986 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "j M @ H:i" + +#: admin/history_rvy.php:1072 front_rvy.php:479 front_rvy.php:504 +#: rvy_init-functions.php:260 rvy_init-functions.php:278 +#: rvy_init-functions.php:317 rvy_init-functions.php:334 +#: rvy_init-functions.php:351 +msgid "Approve" +msgstr "Approuver" + +#: admin/history_rvy.php:1072 +msgid "Preview / Approve" +msgstr "Aperçu/Approbation" + +#: admin/history_rvy.php:1074 admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +#: admin/post-editor-workflow-ui_rvy.php:199 +#: admin/RevisionEditSubmitMetabox.php:123 +msgid "Preview" +msgstr "Aperçu" + +#: admin/history_rvy.php:1168 +msgid "Preview / Restore" +msgstr "Aperçu / Restaurer" + +#: admin/history_rvy.php:1175 +msgid "Manage" +msgstr "Gérer" + +#: admin/history_rvy.php:1176 +msgid "List" +msgstr "Liste" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "Réglage de Scope" + +#: admin/options.php:96 +msgid "Post Types" +msgstr "Types de publication" + +#: admin/options.php:97 +msgid "Revisors" +msgstr "Relecteurs/relectrices" + +#: admin/options.php:98 +msgid "Statuses" +msgstr "États" + +#: admin/options.php:99 +msgid "Revision Creation" +msgstr "Création de révisions" + +#: admin/options.php:100 admin/options.php:111 +msgid "Revision Submission" +msgstr "Envoi des révisions" + +#: admin/options.php:102 +msgid "Queue" +msgstr "File d’attente" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "Aperçu/Approbation" + +#: admin/options.php:104 +msgid "Options" +msgstr "Options" + +#: admin/options.php:105 +msgid "Notifications" +msgstr "Notifications" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" +"Utilisez des libellés alternatifs : « Copie de travail » > « Demande de " +"modification » > « Modification planifiée »." + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" +"Une permission supplémentaire est nécessaire pour créer une copie de travail" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "" +"Une permission supplémentaire est nécessaire pour créer une nouvelle révision" + +#: admin/options.php:121 admin/options.php:124 +msgid "Enable %s" +msgstr "Activer %s" + +#: admin/options.php:122 +msgid "Limit to one active revision per post" +msgstr "Limite d’une révision active par publication" + +#: admin/options.php:123 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" +"Envoi automatique des révisions créées par un utilisateur ou utilisatrice " +"ayant la capacité de publier." + +#: admin/options.php:125 +msgid "Additional role capability required to submit a Change Request" +msgstr "" +"Une permission supplémentaire est nécessaire pour soumettre une demande de " +"modification" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a revision" +msgstr "" +"Une permission supplémentaire est nécessaire pour soumettre une révision" + +#: admin/options.php:126 +msgid "Editing others' revisions requires role capability" +msgstr "" +"Pour modifier les révisions des autres, vous devez disposer d’un compte avec " +"certaines permissions" + +#: admin/options.php:127 +msgid "Listing others' revisions requires role capability" +msgstr "" +"Pour lister les révisions des autres, vous devez disposer d’un compte avec " +"certaines permissions" + +#: admin/options.php:128 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" +"Les utilisateurs et utilisatrices peuvent toujours gérer les révisions de " +"leurs propres publications modifiables" + +#: admin/options.php:129 +msgid "Also notify on Revision Update" +msgstr "Notifier également la mise à jour de la révision" + +#: admin/options.php:130 +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" +"Publication des révisions : Actions API pour imiter la mise à jour des " +"publications" + +#: admin/options.php:131 +msgid "Hide html tags on Compare Revisions screen" +msgstr "Masquer les balises html sur l’écran comparer les révisions" + +#: admin/options.php:132 +msgid "Use WP-Cron scheduling" +msgstr "Utiliser la planification WP-Cron" + +#: admin/options.php:133 +msgid "Site uses a custom trigger for WP-Cron tasks" +msgstr "Le site utilise un déclencheur personnalisé pour les tâches WP-Cron" + +#: admin/options.php:134 +msgid "Asynchronous Publishing" +msgstr "Publication asynchrone" + +#: admin/options.php:135 admin/options.php:136 +msgid "Update Publish Date" +msgstr "Mettre à jour la date de publication" + +#: admin/options.php:137 admin/options.php:138 +msgid "Update Modified Date" +msgstr "Mettre à jour la date de modification" + +#: admin/options.php:139 +msgid "Email original Author when a %s is submitted" +msgstr "" +"Envoyer un e-mail aux auteurs originaux et autrices originales quand une %s " +"est envoyée" + +#: admin/options.php:140 +msgid "Email the original Author when a %s is approved" +msgstr "" +"Envoyer un e-mail aux auteurs originaux et autrices originales quand une %s " +"est approuvée" + +#: admin/options.php:141 +msgid "Email the Revisor when a %s is approved" +msgstr "" +"Envoyer un e-mail aux relecteurs/relectrices quand une %s est approuvée" + +#: admin/options.php:142 +msgid "Email the original Author when a %s is published" +msgstr "" +"Envoyer un e-mail aux auteurs originaux et autrices originales quand une %s " +"est publiée" + +#: admin/options.php:143 +msgid "Email the Revisor when a %s is published" +msgstr "Envoyer un e-mail aux relecteurs/relectrices quand une %s est publiée" + +#: admin/options.php:144 +msgid "Enable notification buffer" +msgstr "Activer la mémoire tampon de notification" + +#: admin/options.php:145 +msgid "All custom post types available to Revisors" +msgstr "" +"Tous les types de publication personnalisés disponibles pour les relecteurs " +"et les relectrices" + +#: admin/options.php:146 +msgid "Prevent Revisors from editing other user's drafts" +msgstr "" +"Empêcher les relecteurs et les relectrices de modifier les brouillons " +"d’autres utilisateurs et utilisatrices" + +#: admin/options.php:148 +msgid "Show Preview Links" +msgstr "Afficher les liens d’aperçu" + +#: admin/options.php:149 +msgid "Preview Link Type" +msgstr "Type de lien d’aperçu" + +#: admin/options.php:150 +msgid "Modify preview link for better theme compatibility" +msgstr "" +"Modifier le lien de prévisualisation pour une meilleure compatibilité avec " +"le thème" + +#: admin/options.php:151 +msgid "Extra preview button in Gutenberg Editor top bar" +msgstr "" +"Bouton d’aperçu supplémentaire dans la barre supérieure de l’éditeur " +"Gutenberg" + +#: admin/options.php:152 +msgid "Theme Compat: For front page revision preview, set home flag" +msgstr "" +"Compatibilité avec le thème : pour la prévisualisation de la révision de la " +"page d’accueil, définir le drapeau de la page d’accueil" + +#: admin/options.php:153 +msgid "Approve Button on Compare Revisions screen" +msgstr "Bouton « Approuver » sur l’écran « Comparer les révisions »" + +#: admin/options.php:154 +msgid "Copy revision comments to published post" +msgstr "Copier les commentaires de révision dans la publication" + +#: admin/options.php:156 +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" +"Inclure %s dans les vues « Mon activité » et « Révisions de mes " +"publications »" + +#: admin/options.php:157 +msgid "On Revision publication, delete Editorial Comments" +msgstr "" +"Lors de la publication de la révision, supprimer les commentaires éditoriaux" + +#: admin/options.php:158 +msgid "Enable deletion queue" +msgstr "Activer la file d’attente de suppression" + +#: admin/options.php:159 +msgid "Enable deletion in Revision Archive" +msgstr "Activer la suppression dans l’archive des révisions" + +#: admin/options.php:160 +msgid "Revision Restore: Non-Administrators need capability" +msgstr "" +"Restauration de la révision : les non-administrateurs/non-administratrices " +"ont besoin d’une permission" + +#: admin/options.php:166 +msgid "Email designated Publishers when a %s is submitted" +msgstr "" +"Envoyer un e-mail aux maisons d’édition désignées quand une %s est envoyée" + +#: admin/options.php:167 +msgid "Email designated Publishers when a %s is published" +msgstr "" +"Envoyer un e-mail aux maisons d’édition désignées quand une %s est publiée" + +#: admin/options.php:168 +msgid "Email designated Publishers when a %s is approved" +msgstr "" +"Envoyer un e-mail aux maisons d’édition désignées quand une %s est approuvée" + +#: admin/options.php:170 +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" +"Envoyer un e-mail aux éditeurs et éditrices et aux administrateurs et " +"administratrices quand une %s est envoyée" + +#: admin/options.php:171 +msgid "Email Editors and Administrators when a %s is published" +msgstr "" +"Envoyer un e-mail aux éditeurs et éditrices et aux administrateurs et " +"administratrices quand une %s est publiée" + +#: admin/options.php:172 +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" +"Envoyer un e-mail aux éditeurs et éditrices et aux administrateurs et " +"administratrices quand une %s est approuvée" + +#: admin/options.php:239 +msgid "PublishPress Revisions Site Settings" +msgstr "Réglages de PublishPress Revisions pour le site" + +#: admin/options.php:269 +msgid "" +"These are the default settings for options which can be adjusted per-site." +msgstr "" +"Il s’agit des réglages par défaut pour les options qui peuvent être ajustées " +"par site." + +#: admin/options.php:307 +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress Revisions " +"settings. %s" +msgstr "" +"Utilisez cet onglet pour modifier les réglages de PublishPress Revisions à " +"l’échelle du réseau. %s" + +#: admin/options.php:310 +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" +"Vous pouvez également spécifier %1$sles réglages par défaut spécifiques au " +"site%2$s." + +#: admin/options.php:313 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" +"Ici, vous pouvez modifier la valeur par défaut pour les réglages qui sont " +"contrôlés séparément sur chaque site." + +#: admin/options.php:323 admin/options.php:325 +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" +"Notez que des %1$sréglages à l’échelle du réseau%2$s de peuvent également " +"être disponibles." + +#: admin/options.php:350 +msgid "License" +msgstr "Licence" + +#: admin/options.php:403 +msgid "Enable revision submission for these Post Types:" +msgstr "Activer l’envoi de révisions pour ces types de publications :" + +#: admin/options.php:463 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" +"Note : Le code d’un tiers peut entraîner l’incompatibilité de certains types " +"de publication avec PublishPress Revisions." + +#: admin/options.php:477 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" +"Le rôle du compte « Relecteur/Relectrice » est maintenant disponible. " +"Inclure des permissions pour tous les types de publication personnalisées " +"dans ce rôle ?" + +#: admin/options.php:482 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" +"Si cette case est cochée, les utilisateurs et les utilisatrices ne disposant " +"pas de permissions de publication à l’échelle du site seront également " +"soumis à une vérification de la permission « edit_others_drafts »" + +#: admin/options.php:497 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for " +"Approval\", \"Scheduled Revision\"" +msgstr "" +"Les libellés par défaut sont « Non envoyée pour approbation », « Envoyée " +"pour approbation », « Révision planifiée »" + +#: admin/options.php:511 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" +"Cette restriction s’applique aux utilisateurs et utilisatrices qui ne sont " +"pas des éditeurs ou éditrices complet(e)s pour le type de publication. Pour " +"activer un rôle, ajoutez les permissions : copy_posts, copy_others_pages, " +"etc." + +#: admin/options.php:516 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" +"Pour déplier la liste des articles/pages pour les non-éditeurs ou non-" +"éditrices, ajoutez les permissions : list_others_pages, " +"list_published_posts, etc." + +#: admin/options.php:520 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" +"Pour activer un rôle, ajoutez la permission « manage_unsubmitted_revisions »" + +#: admin/options.php:537 +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" +"Si l’utilisateur ou l’utilisatrice ne dispose pas d’un lien régulier de " +"modification, rectifiez le lien de %s comme « Modifier »." + +#: admin/options.php:559 +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" +"Activez le contenu publié pour qu’il puisse être copié, modifié, envoyé pour " +"approbation et géré dans %sFile d’attente des révisions%s." + +#: admin/options.php:565 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" +"Cette restriction s’applique aux utilisateurs et utilisatrices qui ne sont " +"pas des éditeurs ou éditrices complet(e)s pour le type de publication. Pour " +"activer un rôle, ajoutez les permissions : edit_others_revisions, etc." + +#: admin/options.php:568 admin/options.php:592 +msgid "When a %s is published, update post publish date to current time." +msgstr "" +"Lorsqu’une %s est publiée, mettre à jour la date de publication de la " +"publication à l’heure actuelle." + +#: admin/options.php:571 admin/options.php:595 +msgid "When a %s is published, update post modified date to current time." +msgstr "" +"Lorsqu’une %s est publiée, mettre à jour la date de modification de la " +"publication à l’heure actuelle." + +#: admin/options.php:589 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" +"Si une publication ou une page actuellement publiée est modifiée et qu’une " +"date future est définie, la modification ne sera pas appliquée avant la date " +"sélectionnée." + +#: admin/options.php:600 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" +"Publier les révisions planifiées en utilisant le mécanisme WP-Cron. Sur " +"certains sites, la publication échouera si ce réglage est désactivé." + +#: admin/options.php:604 +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" +"Publier les révisions planifiées de manière asynchrone, via une demande http " +"secondaire du serveur. C’est généralement la meilleure solution car elle " +"élimine les délais, mais certains serveurs ne la prennent pas en charge." + +#: admin/options.php:609 +msgid "" +"The WP-Cron trigger is disabled, but scheduled tasks are still excecuted " +"using a custom trigger." +msgstr "" +"Le déclencheur WP-Cron est désactivé, mais les tâches planifiées sont " +"toujours exécutées à l’aide d’un déclencheur personnalisé." + +#: admin/options.php:626 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" +"Cette restriction s’applique aux comptes qui n’ont pas tous les droits " +"d’édition sur ce type de publication. Pour activer un rôle, donnez-lui la " +"permission edit_others_revisions." + +#: admin/options.php:629 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" +"Cette restriction s’applique aux utilisateurs et utilisatrices qui ne sont " +"pas des éditeurs ou éditrices complet(e)s pour le type de publication. Pour " +"activer un rôle, donnez-lui la permission list_others_revisions." + +#: admin/options.php:632 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" +"Contourner les restrictions ci-dessus pour les révisions par d’autres des " +"publications de la personne connectée." + +#: admin/options.php:641 +msgid "Regenerate \"post has revision\" flags" +msgstr "Régénérer les drapeaux « publication avec révision »" + +#: admin/options.php:656 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators." +msgstr "" +"Pour les thèmes qui bloquent l’aperçu de révision, masquer les liens " +"d’aperçu des non-administrateurs/non-administratrices." + +#: admin/options.php:668 +msgid "Published Post Slug" +msgstr "Slug de la publication publiée" + +#: admin/options.php:668 +msgid "Revision Slug" +msgstr "Slug de la révision" + +#: admin/options.php:668 +msgid "Revision ID only" +msgstr "ID de révision uniquement" + +#: admin/options.php:679 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" +"Certains thèmes ou extensions peuvent nécessiter le type de lien « Slug de " +"révision » ou « ID de révision » pour un chargement correct du modèle et " +"l’affichage du champ." + +#: admin/options.php:688 +msgid "The revision preview argument is configured by constant definition: %s" +msgstr "" +"L’argument de prévisualisation de la révision est configuré par la " +"définition de la constante : %s" + +#: admin/options.php:695 +msgid "" +"Adjust preview links to use \"rv_preview\" argument instead of \"preview\". " +"Experiment to see which works best with your theme." +msgstr "" +"Ajustez les liens de prévisualisation pour utiliser l’argument " +"« rv_preview » au lieu de « preview ». Expérimentez pour voir ce qui " +"fonctionne le mieux avec votre thème." + +#: admin/options.php:704 +msgid "" +"Some themes may require this setting for correct revision preview display." +msgstr "" +"Pour certains thèmes, ce réglage peut être obligatoire pour que l’aperçu de " +"la révision s’affiche correctement." + +#: admin/options.php:710 +msgid "If disabled, Compare screen links to Revision Preview for approval." +msgstr "" +"S’il est désactivé, l’écran de comparaison renvoie à la prévisualisation des " +"révisions pour approbation." + +#: admin/options.php:738 +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" +"Pour la compatibilité avec Advanced Custom Fields, Beaver Builder and WPML, " +"effectuez une mise à niveau vers %sPublishPress Revisions Pro%s." + +#: admin/options.php:748 +msgid "This may improve compatibility with some plugins." +msgstr "Cela peut améliorer la compatibilité avec certaines extensions." + +#: admin/options.php:767 +msgid "Modification Date" +msgstr "Date de modification" + +#: admin/options.php:777 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" +"Affiche les légendes descriptives sur les réglages de publishPress Revisions" + +#: admin/options.php:791 +msgid "" +"Non-Administrators cannot restore a revision without the restore_revisions " +"capability" +msgstr "" +"Les non-administrateurs/non-administratrices ne peuvent pas restaurer une " +"révision sans la permission « restore_revisions »." + +#: admin/options.php:813 admin/options.php:834 +msgid "Never" +msgstr "Jamais" + +#: admin/options.php:813 admin/options.php:834 +msgid "By default" +msgstr "Par défaut" + +#: admin/options.php:813 admin/options.php:834 +msgid "Always" +msgstr "Toujours" + +#: admin/options.php:823 admin/options.php:869 +msgid "select recipients" +msgstr "sélectionner les destinataires" + +#: admin/options.php:883 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" +"Pour éviter les échecs de notification, les e-mails sont mis en mémoire " +"tampon pour un envoi différé lorsque les limites de minutes, d’heures ou de " +"jours sont dépassées." + +#: admin/options.php:904 +msgid "Notification Buffer" +msgstr "Tampon de notification" + +#: admin/options.php:932 +msgid "Notification Log" +msgstr "Journal de notification" + +#: admin/options.php:961 +msgid "Purge Notification Buffer" +msgstr "Tampon de notification de purge" + +#: admin/options.php:967 +msgid "Truncate Notification Log" +msgstr "Journal des notifications tronquées" + +#: admin/options.php:973 +msgid "Sent in last minute: %d / %d" +msgstr "Envoyée à la dernière minute : %d/%d" + +#: admin/options.php:974 +msgid "Sent in last hour: %d / %d" +msgstr "Envoyé dans la dernière heure: %d/%d" + +#: admin/options.php:975 +msgid "Sent in last day: %d / %d" +msgstr "Envoyé le dernier jour: %d/%d" + +#: admin/options.php:982 +msgid "Seconds until next buffer processing time: %d" +msgstr "" +"Secondes jusqu’au temps de traitement de la mémoire tampon suivante : %d" + +#: admin/options.php:992 +msgid "Show Notification Log / Buffer" +msgstr "Afficher le journal des notifications/tampon" + +#: admin/options.php:994 +msgid "Show with message content" +msgstr "Afficher avec le contenu du message" + +#: admin/options.php:1005 includes/CoreAdmin.php:88 +msgid "WPML Translation Management" +msgstr "Gestion des traductions WPML" + +#: admin/options.php:1012 +msgid "Sync \"Needs Update\" flags" +msgstr "Synchroniser les drapeaux « Nécessite une mise à jour »" + +#: admin/options.php:1016 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" +"Définissez « Nécessite une mise à jour » pour toute publication avec des " +"traductions qui a été mise à jour (éventuellement par approbation de la " +"révision) plus récemment que ses traductions." + +#: admin/options.php:1054 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" +"Spécifiez quels réglages de PublishPress Revisions pour contrôler l’ensemble " +"du réseau. Les réglages non sélectionnés sont contrôlés séparément sur " +"chaque site." + +#: admin/options.php:1064 +msgctxt "opentag option_tabname closetag (explanatory note)" +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "%1$s%2$s%3$s (%4$s)" + +#: admin/options.php:1100 +msgid "network-wide control of \"%s\"" +msgstr "contrôle à l’échelle du réseau des « %s »" + +#: admin/options.php:1130 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" +"Tous les réglages de ce formulaire (y compris ceux sur les onglets non " +"sélectionnés) seront réinitialisés aux valeurs par défaut. Confirmez-vous ?" + +#: admin/post-edit-block-ui_rvy.php:149 admin/post-edit_rvy.php:263 +msgid "Author" +msgstr "Auteur/autrice" + +#: admin/post-editor-workflow-ui_rvy.php:35 +msgid "(on approval)" +msgstr "(sur approbation)" + +#: admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +msgid "Preview this Revision" +msgstr "Aperçu de cette révision" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Publish" +msgstr "Voir/publier" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Approve" +msgstr "Voir/approuver" + +#: admin/post-editor-workflow-ui_rvy.php:59 +#: admin/post-editor-workflow-ui_rvy.php:67 admin/post-edit_rvy.php:153 +msgid "View saved revision" +msgstr "Voir la révision enregistrée" + +#: admin/post-editor-workflow-ui_rvy.php:62 +msgid "View / Moderate saved revision" +msgstr "Voir/modérer la révision enregistrée" + +#: admin/post-editor-workflow-ui_rvy.php:70 +msgid "View / Submit saved revision" +msgstr "Voir/Envoyer la révision enregistrée" + +#: admin/post-editor-workflow-ui_rvy.php:79 +msgid "View unsaved changes" +msgstr "Afficher les modifications non enregistrées" + +#: admin/post-editor-workflow-ui_rvy.php:83 +msgid "%s%s Revision Edit" +msgid_plural "%s%s Revision Edits" +msgstr[0] "%s%s modification de la révision" +msgstr[1] "%s%s modifications de la révision" + +#: admin/post-editor-workflow-ui_rvy.php:94 +msgid "Revision Submission Error" +msgstr "Erreur lors de l’envoi de la révision" + +#: admin/post-editor-workflow-ui_rvy.php:108 +#: admin/post-editor-workflow-ui_rvy.php:200 front_rvy.php:437 +msgid "Edit" +msgstr "Modifier" + +#: admin/post-editor-workflow-ui_rvy.php:115 +msgid "Approving the Revision..." +msgstr "Approbation de la révision…" + +#: admin/post-editor-workflow-ui_rvy.php:142 rvy_init-functions.php:264 +#: rvy_init-functions.php:282 rvy_init-functions.php:300 +#: rvy_init-functions.php:320 rvy_init-functions.php:337 +#: rvy_init-functions.php:354 rvy_init-functions.php:458 +msgid "Update Revision" +msgstr "Mettre à jour la révision" + +#: admin/post-editor-workflow-ui_rvy.php:200 +msgid "Edit Revision" +msgstr "Modifier la révision :" + +#: admin/post-editor-workflow-ui_rvy.php:206 +msgid "Update post before creating %s." +msgstr "Mettez à jour la publication avant de créer %s." + +#: admin/post-editor-workflow-ui_rvy.php:213 +msgid "Error Creating Revision" +msgstr "Erreur pendant la création de la révision" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#: admin/post-editor-workflow-ui_rvy.php:235 +msgid "Update" +msgstr "Mettre à jour" + +#: admin/post-editor-workflow-ui_rvy.php:229 +msgid "For custom field changes, edit a scheduled %s." +msgstr "" +"Pour les modifications de champs personnalisés, modifiez une %s programmée." + +#: admin/post-edit_rvy.php:27 admin/post-edit_rvy.php:85 +msgid "Current Time" +msgstr "Heure actuelle" + +#: admin/post-edit_rvy.php:111 +msgid "View revision in progress" +msgstr "Voir la révision en cours" + +#: admin/post-edit_rvy.php:150 +msgid "View / moderate saved revision" +msgstr "Voir/modérer la révision enregistrée" + +#: admin/revision-action_rvy.php:421 admin/revision-action_rvy.php:507 +msgid "[%s] Revision Approval Notice" +msgstr "[%s] Notification d’approbation de révision" + +#: admin/revision-action_rvy.php:422 +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "Une révision de la %1$s « %2$s » a été approuvée." + +#: admin/revision-action_rvy.php:426 +msgid "The submitter was %1$s." +msgstr "Le demandeur était %1$s." + +#: admin/revision-action_rvy.php:430 admin/revision-action_rvy.php:512 +msgid "It will be published on %s" +msgstr "Elle sera publiée le %s" + +#: admin/revision-action_rvy.php:434 admin/revision-action_rvy.php:516 +msgid "Preview it here: " +msgstr "Prévisualisez-le ici : " + +#: admin/revision-action_rvy.php:437 admin/revision-action_rvy.php:519 +msgid "Editor: " +msgstr "Éditeur/éditrice : " + +#: admin/revision-action_rvy.php:439 admin/revision-action_rvy.php:521 +#: admin/revision-action_rvy.php:1352 admin/revision-action_rvy.php:1377 +#: admin/revision-action_rvy.php:1439 +msgid "View it online: " +msgstr "Voir en ligne : " + +#: admin/revision-action_rvy.php:508 +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "La demande de révision pour %1$s « %2$s » a été traitée." + +#: admin/revision-action_rvy.php:1348 admin/revision-action_rvy.php:1370 +msgid "[%s] %s Publication Notice" +msgstr "[%s] %s Notification de publication" + +#: admin/revision-action_rvy.php:1349 +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "Votre demande de révision planifiée pour %1$s « %2$s » a été publiée." + +#: admin/revision-action_rvy.php:1371 +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "" +"Une demande de révision planifiée pour votre %1$s « %2$s » a été publiée." + +#: admin/revision-archive_rvy.php:11 +msgid "Revision for:" +msgstr "Révision de:" + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "Vous n’avez pas l’autorisation de gérer les révisions." + +#: admin/revision-queue_rvy.php:13 +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "%s et %s sont toutes deux désactivées. Voir Révisions > Réglages." + +#: admin/revision-queue_rvy.php:46 +msgid "%s revision submitted." +msgid_plural "%s revisions submitted." +msgstr[0] "%s révision envoyée." +msgstr[1] "%s révisions envoyées." + +#: admin/revision-queue_rvy.php:47 +msgid "%s revision declined." +msgid_plural "%s revisions declined." +msgstr[0] "%s révision refusée." +msgstr[1] "%s révisions refusées." + +#: admin/revision-queue_rvy.php:48 +msgid "%s revision approved." +msgid_plural "%s revisions approved." +msgstr[0] "%s révision approuvée." +msgstr[1] "%s révisions approuvées." + +#: admin/revision-queue_rvy.php:49 +msgid "%s revision unscheduled." +msgid_plural "%s revisions unscheduled." +msgstr[0] "%s révision non planifiée." +msgstr[1] "%s révisions non planifiées." + +#: admin/revision-queue_rvy.php:50 +msgid "%s revision published." +msgid_plural "%s revisions published." +msgstr[0] "%s révision publiée." +msgstr[1] "%s révisions publiées." + +#: admin/revision-queue_rvy.php:93 +msgctxt "Author Name" +msgid "%s: " +msgstr "%s : " + +#: admin/revision-queue_rvy.php:106 +msgctxt "Posts / Pages / etc." +msgid "of %s" +msgstr "de %s" + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +msgid "%sPost Author: %s" +msgstr "%sAuteur/autrice de la publication : %s" + +#: admin/revision-queue_rvy.php:121 +msgctxt "PublishedPostName (other filter captions)" +msgid "Revision Queue for \"%s\"%s" +msgstr "File d’attente de révision pour « %s »%s" + +#: admin/revision-queue_rvy.php:123 +msgid "Revision Queue %s" +msgstr "File d’attente de révision %s" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "" +"Les éditeurs et les éditrices seront avisé(e)s (mais ne peuvent pas être " +"sélectionné(e)s ici)." + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "Aucune notification par e-mail ne sera envoyée." + +#. translators: revision date format, see http://php.net/date +#: admin/revision-ui_rvy.php:73 +msgctxt "revision date format" +msgid "j F, Y @ g:i a" +msgstr "j F, Y @ g:i a" + +#: admin/revision-ui_rvy.php:92 +msgid "%1$s (Current)" +msgstr "%1$s (Courant)" + +#: admin/revision-ui_rvy.php:96 +msgid "%1$s (Autosave)" +msgstr "%1$s (Sauvegarde automatique)" + +#: admin/revision-ui_rvy.php:102 +msgctxt "revision schedule date format" +msgid "j F, Y, g:i a" +msgstr "j F Y G\\hi" + +#: admin/revision-ui_rvy.php:106 +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" +"%1$s (Publication demandée : %2$s)" + +#: admin/revision-ui_rvy.php:108 +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "" +"%1$s (Date de publication : %2$s)" + +#: admin/revision-ui_rvy.php:277 +msgid "The revision will be deleted. Are you sure?" +msgstr "La publication sera supprimée. Confirmez-vous ?" + +#: admin/revision-ui_rvy.php:370 +msgid "Modified Date" +msgstr "Date de modification" + +#: admin/RevisionEditSubmitMetabox.php:124 +msgid "Preview revision in progress" +msgstr "Prévisualisation de la révision en cours" + +#. translators: Publish box date formt, see http://php.net/date +#: admin/RevisionEditSubmitMetabox.php:180 +msgid "M j, Y @ G:i" +msgstr "M j, Y @ G:i" + +#: admin/RevisionEditSubmitMetabox.php:191 +msgid "Publish %son approval%s" +msgstr "Publier %son approbation%s" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" +"Note : Pour l’affichage visuel des révisions, ajoutez le " +"code suivant à foliopress-wysiwyg.php :
    if " +"( strpos( $_SERVER[’REQUEST_URI’], ’admin.php?page=rvy-revisions’) ) return ;" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "Aucune révision spécifié." + +#: admin/revisions.php:56 +msgid "Past" +msgstr "Précédentes" + +#: admin/revisions.php:119 +msgid "Revisions of %s" +msgstr "Révisions de %s" + +#: admin/revisions.php:149 +msgid "The requested revision does not exist." +msgstr "La révision demandée n’existe pas." + +#: admin/revisions.php:219 +msgid "Past Revisions" +msgstr "Révisions précédentes" + +#: admin/revisions.php:235 +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "%1$s %2$s (%3$s)%4$s" + +#: admin/revisions.php:256 +msgid "no %s revisions available." +msgstr "aucune révision %s disponible." + +#: front_rvy.php:403 +msgid "%sView Queue%s" +msgstr "%sVoir la file d’attente des révisions%s" + +#: front_rvy.php:412 +msgid "%sCompare%s%sView Published Post%s" +msgstr "%sComparer%s%sVoir la publication publiée%s" + +#: front_rvy.php:426 +msgid "%sView Published Post%s" +msgstr "%sVoir la publication publiée%s" + +#: front_rvy.php:482 rvy_init-functions.php:274 rvy_init-functions.php:330 +msgid "Submit" +msgstr "Envoyer" + +#: front_rvy.php:489 front_rvy.php:525 front_rvy.php:541 +msgid "Publish now" +msgstr "Publier maintenant" + +#: front_rvy.php:494 front_rvy.php:496 front_rvy.php:529 front_rvy.php:531 +msgid "This is a %s. %s %s %s" +msgstr "Ceci est une %s. %s %s %s" + +#: front_rvy.php:508 +msgid "Decline" +msgstr "Refuser" + +#: front_rvy.php:518 front_rvy.php:520 +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "Ceci est une %s (date de publication demandée : %s). %s %s %s" + +#: front_rvy.php:544 front_rvy.php:546 +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "Ceci est une %s (pour publication sur %s). %s %s %s" + +#: front_rvy.php:561 front_rvy.php:563 +msgid "This is the Current Revision. %s" +msgstr "Il s’agit de la révision en cours. %s" + +#: front_rvy.php:575 +msgid "Restore" +msgstr "Restaurer" + +#: front_rvy.php:579 front_rvy.php:581 +msgid "This is a Past Revision (from %s). %s %s" +msgstr "Il s’agit d’une révision passée (à partir de %s). %s %s" + +#: includes/CoreAdmin.php:73 +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "Passez à PublishPress Revisions Pro" + +#: includes/CoreAdmin.php:78 +msgid "" +"Upgrade to PublishPress Revisions Pro for integration with key features of " +"these plugins:" +msgstr "" +"Passez à PublishPress Revisions Pro pour intégrer les principales " +"fonctionnalités de ces extensions :" + +#: includes/CoreAdmin.php:81 +msgid "Elementor" +msgstr "Elementor" + +#: includes/CoreAdmin.php:82 +msgid "Divi Builder" +msgstr "Divi Builder" + +#: includes/CoreAdmin.php:83 +msgid "Beaver Builder" +msgstr "Beaver Builder" + +#: includes/CoreAdmin.php:84 +msgid "Advanced Custom Fields" +msgstr "Advanced Custom Fields" + +#: includes/CoreAdmin.php:85 +msgid "Pods" +msgstr "Pods" + +#: includes/CoreAdmin.php:86 +msgid "WooCommerce" +msgstr "WooCommerce" + +#: includes/CoreAdmin.php:87 +msgid "WPML" +msgstr "WPML" + +#: includes/CoreAdmin.php:89 +msgid "plugin integration details..." +msgstr "détails de l’intégration de l’extension…" + +#: includes/CoreAdmin.php:100 +msgid "Need PublishPress Revisions Support?" +msgstr "Avez-vous besoin du support de Publishpress Revisions ?" + +#: includes/CoreAdmin.php:105 +msgid "If you need help or have a new feature request, let us know." +msgstr "" +"Si vous avez besoin d’aide ou si vous avez une nouvelle demande de " +"fonctionnalité, faites-le nous savoir." + +#: includes/CoreAdmin.php:107 +msgid "Request Support" +msgstr "Demande de support" + +#: includes/CoreAdmin.php:116 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" +"Une documentation détaillée est également disponible sur le site de " +"l’extension." + +#: includes/CoreAdmin.php:118 +msgid "View Knowledge Base" +msgstr "Voir la base de connaissances" + +#: lib/debug.php:110 +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "%1$s requêtes en %2$s secondes. %3$s Mo utilisé." + +#: revision-creation_rvy.php:185 +msgid "Could not insert revision into the database" +msgstr "Impossible d’insérer une révision dans la base de données" + +#: revision-workflow_rvy.php:157 +msgid "[%s] %s Updated" +msgstr "[%s] %s a été mis à jour" + +#: revision-workflow_rvy.php:159 +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "%1$s a mis à jour une %2$s de la %3$s « %4$s »." + +#: revision-workflow_rvy.php:161 +msgid "[%s] %s" +msgstr "[%s] %s" + +#: revision-workflow_rvy.php:163 +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" +"%1$s a envoyé des modifications à la « %3$s » de %2$s. Vous pouvez examiner " +"les modifications en vue d’une éventuelle publication :" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "Aperçu et approbation : " + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "File d’attente des révisions : " + +#: revision-workflow_rvy.php:176 +msgid "Edit %s: " +msgstr "Modifier %s : " + +#: revisionary.php:120 +msgid "This plugin can be deleted." +msgstr "Cette extension peut être supprimée." + +#: rvy_init-functions.php:77 +msgid "Every 2 Minutes" +msgstr "Toutes les 2 minutes" + +#: rvy_init-functions.php:254 rvy_init-functions.php:266 +msgid "Working Copy" +msgstr "Copie de travail" + +#: rvy_init-functions.php:255 +msgid "Create Working Copy" +msgstr "Créer une copie de travail" + +#: rvy_init-functions.php:256 +msgid "Copy" +msgstr "Copier" + +#: rvy_init-functions.php:257 +msgid "Creating Working Copy..." +msgstr "Création de la copie de travail…" + +#: rvy_init-functions.php:258 +msgid "Working Copy ready" +msgstr "La copie de travail est prête" + +#: rvy_init-functions.php:259 rvy_init-functions.php:277 +msgid "Approve Changes" +msgstr "Approuver les modifications" + +#: rvy_init-functions.php:261 rvy_init-functions.php:279 +msgid "Approving Changes..." +msgstr "Approbation des modifications…" + +#: rvy_init-functions.php:262 rvy_init-functions.php:280 +#: rvy_init-functions.php:298 +msgid "Publish Changes" +msgstr "Publier les modifications" + +#: rvy_init-functions.php:263 rvy_init-functions.php:281 +#: rvy_init-functions.php:299 rvy_init-functions.php:319 +#: rvy_init-functions.php:336 rvy_init-functions.php:353 +msgid "Save Revision" +msgstr "Enregistrer la révision" + +#: rvy_init-functions.php:265 +msgid "Working Copies" +msgstr "Copies de travail" + +#: rvy_init-functions.php:267 +msgid "Working Copies (%d)" +msgid_plural "Working Copies (%d)" +msgstr[0] "Copie de travail (%d)" +msgstr[1] "Copies de travail (%d)" + +#: rvy_init-functions.php:272 rvy_init-functions.php:284 +msgid "Change Request" +msgstr "Demande de modification" + +#: rvy_init-functions.php:273 +msgid "Submit Change Request" +msgstr "Envoyer la demande de modification" + +#: rvy_init-functions.php:275 +msgid "Submitting Changes..." +msgstr "Envoi des modifications…" + +#: rvy_init-functions.php:276 +msgid "Changes Submitted" +msgstr "Modifications envoyées." + +#: rvy_init-functions.php:283 +msgid "Change Requests" +msgstr "Demandes de modification" + +#: rvy_init-functions.php:285 +msgid "Change Requests (%d)" +msgid_plural "Change Requests (%d)" +msgstr[0] "Demande de modification (%d)" +msgstr[1] "Demandes de modification (%d)" + +#: rvy_init-functions.php:286 +msgid "Enable Change Requests" +msgstr "Activer les demandes de modification" + +#: rvy_init-functions.php:291 rvy_init-functions.php:302 +msgid "Scheduled Change" +msgstr "Modification planifiée" + +#: rvy_init-functions.php:292 rvy_init-functions.php:293 +#: rvy_init-functions.php:296 rvy_init-functions.php:297 +msgid "Schedule Changes" +msgstr "Planifier les modifications" + +#: rvy_init-functions.php:294 +msgid "Scheduling Changes..." +msgstr "Planification des modifications…" + +#: rvy_init-functions.php:295 +msgid "Changes are Scheduled." +msgstr "Les modifications ont été planifiées." + +#: rvy_init-functions.php:301 +msgid "Scheduled Changes" +msgstr "Modifications planifiées" + +#: rvy_init-functions.php:303 +msgid "Scheduled Changes (%d)" +msgid_plural "Scheduled Changes (%d)" +msgstr[0] "Modification planifiée (%d)" +msgstr[1] "Modifications planifiées (%d)" + +#: rvy_init-functions.php:311 +msgid "Unsubmitted Revision" +msgstr "Révision non envoyée" + +#: rvy_init-functions.php:312 rvy_init-functions.php:313 +msgid "New Revision" +msgstr "Nouvelle révision" + +#: rvy_init-functions.php:314 +msgid "Creating Revision..." +msgstr "Création de la révision…" + +#: rvy_init-functions.php:315 +msgid "The Revision is ready to edit." +msgstr "La révision est prête à être modifiée." + +#: rvy_init-functions.php:315 +msgid "Revision ready to edit." +msgstr "Révision prête à être modifiée." + +#: rvy_init-functions.php:316 rvy_init-functions.php:333 +#: rvy_init-functions.php:350 +msgid "Approve Revision" +msgstr "Approuver la révision" + +#: rvy_init-functions.php:318 rvy_init-functions.php:335 +#: rvy_init-functions.php:352 +msgid "Publish Revision" +msgstr "Publier la révision" + +#: rvy_init-functions.php:321 +msgid "Unsubmitted Revisions" +msgstr "Révisions non envoyées" + +#: rvy_init-functions.php:322 +msgid "Not Submitted" +msgstr "Non envoyée" + +#: rvy_init-functions.php:323 +msgid "Not Submitted for Approval (%s)" +msgid_plural "Not Submitted for Approval (%s)" +msgstr[0] "Non envoyée pour l’approbation (%s)" +msgstr[1] "Non envoyées pour l’approbation (%s)" + +#: rvy_init-functions.php:328 +msgid "Submitted Revision" +msgstr "Révision envoyée" + +#: rvy_init-functions.php:329 rvy_init-functions.php:461 +msgid "Submit Revision" +msgstr "Envoyer la révision" + +#: rvy_init-functions.php:331 +msgid "Submitting Revision..." +msgstr "Envoi de la révision…" + +#: rvy_init-functions.php:332 +msgid "The Revision is Submitted" +msgstr "La révision est envoyée" + +#: rvy_init-functions.php:332 +msgid "Revision Submitted" +msgstr "Révision envoyée" + +#: rvy_init-functions.php:338 +msgid "Submitted Revisions" +msgstr "Révisions envoyées" + +#: rvy_init-functions.php:339 +msgid "Submitted" +msgstr "Envoyé" + +#: rvy_init-functions.php:340 +msgid "Submitted for Approval (%s)" +msgid_plural "Submitted for Approval (%s)" +msgstr[0] "Envoyée pour approbation (%s)" +msgstr[1] "Envoyées pour approbation (%s)" + +#: rvy_init-functions.php:345 +msgid "Scheduled Revision" +msgstr "Révision planifiée" + +#: rvy_init-functions.php:346 rvy_init-functions.php:347 +msgid "Schedule Revision" +msgstr "Planifier la révision" + +#: rvy_init-functions.php:348 +msgid "Scheduling Revision..." +msgstr "Planification de la révision…" + +#: rvy_init-functions.php:349 +msgid "The Revision is Scheduled" +msgstr "La révision est planifiée" + +#: rvy_init-functions.php:349 +msgid "Revision Scheduled" +msgstr "Révision planifiée" + +#: rvy_init-functions.php:355 +msgid "Scheduled Revisions" +msgstr "Révisions planifiées" + +#: rvy_init-functions.php:356 +msgid "Scheduled" +msgstr "Planifiée" + +#: rvy_init-functions.php:357 +msgid "Scheduled Revision (%s)" +msgid_plural "Scheduled Revisions (%s)" +msgstr[0] "Révision planifiée (%s)" +msgstr[1] "Révisions planifiées (%s)" + +#: rvy_init-functions.php:448 +msgid "%sMy Copies & Changes%s(%s)
    " +msgid_plural "%sMy Copies & Changes%s(%s)
    " +msgstr[0] "%sMes copies et modifications%s(%s)
    " +msgstr[1] "%sMes copies et modifications%s(%s)" + +#: rvy_init-functions.php:449 +msgid "%sMy Revisions%s(%s)" +msgid_plural "%sMy Revisions%s(%s)" +msgstr[0] "%sMa révision%s(%s)" +msgstr[1] "%sMes révisions%s(%s)" + +#: rvy_init-functions.php:451 +msgid "%sRevisions to My Posts%s(%s)" +msgid_plural "%sRevisions to My Posts%s(%s)" +msgstr[0] "%sRévision de ma publications%s(%s)" +msgstr[1] "%sRévisions de mes publications%s(%s)" + +#: rvy_init-functions.php:456 +msgid "Post Author" +msgstr "Auteur/autrice de la publication" + +#: rvy_init-functions.php:457 +msgid "Published Post" +msgstr "Publication publiée" + +#: rvy_init-functions.php:462 +msgid "Submit Changes" +msgstr "Envoyer les modifications" + +#: rvy_init-functions.php:663 +msgid "Revisor" +msgstr "Relecteur/relectrice" + +#: rvy_init-functions.php:675 +msgctxt "User role" +msgid "Revisor" +msgstr "Relecteur/relectrice" + +#: rvy_init-functions.php:1153 +msgid "Revision Workflow" +msgstr "Flux de travail de révision" + +#~ msgid "View / Approve saved revision" +#~ msgstr "Voir/Approuver une révision enregistrée" + +#~ msgid "Move to Trash" +#~ msgstr "Déplacer dans la corbeille" + +#~ msgid "Status:" +#~ msgstr "État :" + +#, php-format +#~ msgid "Scheduled for: %s" +#~ msgstr "Planifié pour : %s" + +#, php-format +#~ msgid "Publish on: %s" +#~ msgstr "Publier le : %s" + +#~ msgid "Error in deleting." +#~ msgstr "Erreur lors de la suppression." + +#~ msgid "Scheduled Rev." +#~ msgstr "Révision planifiée" + +#~ msgid "Delete" +#~ msgstr "Supprimer" + +#~ msgid "Schedule" +#~ msgstr "Planifier" + +#, php-format +#~ msgid "%s ago" +#~ msgstr "Il y a %s" + +#~ msgid "Missed schedule" +#~ msgstr "Planification manquée" + +#~ msgid "View" +#~ msgstr "Voir" + +#~ msgid "Show more details" +#~ msgstr "Afficher plus de détails" + +#~ msgid "Publish" +#~ msgstr "Publier" + +#~ msgid "Delete Permanently" +#~ msgstr "Supprimer définitivement" + +#~ msgid "Filter by category" +#~ msgstr "Filtrer par catégorie" + +#~ msgid "Select All" +#~ msgstr "Tout sélectionner" + +#, php-format +#~ msgid "“%s” (Edit)" +#~ msgstr "« %s » (Modifier)" + +#~ msgid "Enable public preview" +#~ msgstr "Activer la prévisualisation publique" + +#~ msgid "Return to editor" +#~ msgstr "Retour à l’éditeur" + +#~ msgid "(no title)" +#~ msgstr "(sans titre)" + +#, php-format +#~ msgid "%s%s ago" +#~ msgstr "Il y a %s%s" + +#, php-format +#~ msgid "Additional role capability required to manage %s" +#~ msgstr "Des permissions supplémentaires sont nécessaires pour gérer %s" + +#, php-format +#~ msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +#~ msgstr "" +#~ "Liste des publications/pages : Utilisez la légende « Modifier » pour le " +#~ "lien %s" + +#~ msgid "Display Hints" +#~ msgstr "Afficher les conseils" + +#~ msgid "Compare Past Revisions ordering:" +#~ msgstr "Trier la comparaison des révisions précédentes :" + +#, php-format +#~ msgid "%s capabilities" +#~ msgstr "%s permissions" + +#~ msgid "Preview / Submit" +#~ msgstr "Aperçu/Envoyer" + +#~ msgid "View / Submit" +#~ msgstr "Voir/Envoyer" + +#, php-format +#~ msgid "It was submitted by %1$s." +#~ msgstr "Envoyé par %1$s." + +#, php-format +#~ msgid "[%s] %s Publication" +#~ msgstr "[%s] %s Publication" + +#, php-format +#~ msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +#~ msgstr "" +#~ "Une demande de révision planifiée pour votre %1$s « %2$s » a été publiée." + +#, php-format +#~ msgid "%s revision permanently deleted." +#~ msgstr "%s révision supprimée définitivement." + +#~ msgid "Undo" +#~ msgstr "Rétablir" + +#, php-format +#~ msgid "Preview “%s”" +#~ msgstr "Aperçu de « %s »" + +#~ msgid "Actions" +#~ msgstr "Actions" + +#~ msgid "Bulk Actions" +#~ msgstr "Actions groupées" + +#~ msgid "Pending" +#~ msgstr "En attente" + +#~ msgid "" +#~ "This plugin is outdated. You already have a more recent version " +#~ "installed. Please remove this version." +#~ msgstr "" +#~ "Cette extension est obsolète. Vous avez déjà installé une version plus " +#~ "récente. Veuillez supprimer cette version." + +#, php-format +#~ msgid "" +#~ "This plugin is not installed in the standard folder. The current path is " +#~ "%1$s but it is expected to be %2$s." +#~ msgstr "" +#~ "Cette extension n’est pas installée dans le dossier standard. Le chemin " +#~ "actuel est %1$s mais il devrait être %2$s." + +#, php-format +#~ msgid "" +#~ "You have activated multiple instances of %s. Please keep only one " +#~ "activated and remove the others." +#~ msgstr "" +#~ "Vous avez activé plusieurs instances de %s. Veuillez n’en garder qu’une " +#~ "seule activée et supprimer les autres." + +#, php-format +#~ msgid "Please deactivate %1$s when %2$s is activated." +#~ msgstr "Veuillez désactiver %1$s lorsque %2$s est activé." + +#, php-format +#~ msgid "" +#~ "Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +#~ "been useful. Please could you quickly leave a 5-star rating on WordPress." +#~ "org? It really does help to keep %1$s growing." +#~ msgstr "" +#~ "Salut, vous avez utilisé %1$s pour %2$s sur votre site. Nous espérons que " +#~ "l’extension vous a été utile. Pourriez-vous laisser une note de 5 étoiles " +#~ "sur WordPress.org ? Cela nous aidera vraiment à maintenir la croissance " +#~ "de %1$s." + +#~ msgid "1 week" +#~ msgstr "1 semaine" + +#~ msgid "1 month" +#~ msgstr "1 mois" + +#~ msgid "3 months" +#~ msgstr "3 mois" + +#, php-format +#~ msgid "Click here to add your rating for %s" +#~ msgstr "Cliquez ici pour ajouter votre évaluation à %s" + +#~ msgid "Maybe later" +#~ msgstr "Peut-être plus tard" + +#~ msgid "I already did" +#~ msgstr "Je l’ai déjà fait" + +#~ msgid "Amazing! We are redirecting you to our site..." +#~ msgstr "Incroyable ! Nous vous redirigeons vers notre site…" + +#, php-format +#~ msgid "" +#~ "Another copy of PublishPress Revisions (or Revisionary) is already " +#~ "activated (version %1$s: \"%2$s\")" +#~ msgstr "" +#~ "Une autre copie de PublishPress Revisions (ou Revisionary) est déjà " +#~ "activée (version %1$s : « %2$s »)" + +#, php-format +#~ msgid "" +#~ "Another copy of PublishPress Revisions (or Revisionary) is already " +#~ "activated (version %1$s)" +#~ msgstr "" +#~ "Une autre copie de PublishPress Revisions (ou Revisionary) est déjà " +#~ "activée (version %1$s)" + +#~ msgctxt "revision date short format" +#~ msgid "j M @ g:i a" +#~ msgstr "M j, Y @ g:i a" + +#~ msgctxt "post revision" +#~ msgid "%1$s by %2$s" +#~ msgstr "%1$s par %2$s" diff --git a/wp-content/plugins/revisionary/languages/revisionary-it_IT.mo b/wp-content/plugins/revisionary/languages/revisionary-it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..90f85057ad123693047452998a98fd671bcf56da GIT binary patch literal 37788 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 Kz8qp}$^Qe5%r7zk literal 0 HcmV?d00001 diff --git a/wp-content/plugins/revisionary/languages/revisionary-it_IT.po b/wp-content/plugins/revisionary/languages/revisionary-it_IT.po new file mode 100644 index 000000000..7352f871b --- /dev/null +++ b/wp-content/plugins/revisionary/languages/revisionary-it_IT.po @@ -0,0 +1,2072 @@ +# Translation of Plugins - PublishPress Revisions: Duplicate Posts, Submit, Approve and Schedule Content Changes - Stable (latest release) in Italian +# This file is distributed under the same license as the Plugins - PublishPress Revisions: Duplicate Posts, Submit, Approve and Schedule Content Changes - Stable (latest release) package. +msgid "" +msgstr "" +"Project-Id-Version: Plugins - PublishPress Revisions: Duplicate Posts, " +"Submit, Approve and Schedule Content Changes - Stable (latest release)\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/project\n" +"POT-Creation-Date: 2024-04-16T19:38:36+00:00\n" +"PO-Revision-Date: 2024-04-17 18:27+0200\n" +"Last-Translator: \n" +"Language-Team: Angelo Giammarresi - info@wocmultimedia.com\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.4\n" + +#. Plugin Name of the plugin +msgid "PublishPress Revisions" +msgstr "PublishPress Revisions" + +#. Plugin URI of the plugin +msgid "https://publishpress.com/revisionary/" +msgstr "https://publishpress.com/revisionary/" + +#. Description of the plugin +msgid "" +"Maintain published content with teamwork and precision using the Revisions " +"model to submit, approve and schedule changes." +msgstr "" +"Mantieni i contenuti pubblicati con lavoro di squadra e precisione " +"utilizzando il modello Revisioni per inviare, approvare e programmare le " +"modifiche." + +#. Author of the plugin +msgid "PublishPress" +msgstr "PublishPress" + +#. Author URI of the plugin +msgid "https://publishpress.com" +msgstr "https://publishpress.com" + +#: admin/admin-init_rvy.php:105 admin/admin-init_rvy.php:337 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Spiacente, non hai l'autorizzazione per eliminare questa revisione." + +#: admin/admin-init_rvy.php:194 admin/admin-init_rvy.php:308 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "Spiacente, non puoi approvare questa revisione." + +#: admin/admin-init_rvy.php:235 +msgid "Sorry, you are not allowed to submit this revision." +msgstr "Non sei autorizzato a inviare questa revisione." + +#: admin/admin-init_rvy.php:273 +msgid "Sorry, you are not allowed to decline this revision." +msgstr "Non sei autorizzato a rifiutare questa revisione." + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "La revisione è stata ripristinata." + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "La revisione era prevista per la pubblicazione." + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "La revisione è stata pubblicata." + +#: admin/admin-posts_rvy.php:142 admin/class-list-table-archive.php:425 +#: rvy_init-functions.php:453 +msgid "Revision" +msgstr "Revisione" + +#: admin/admin-posts_rvy.php:159 +msgid "Has Revision" +msgstr "Ha una revisione" + +#: admin/admin-posts_rvy.php:174 admin/admin_rvy.php:274 +msgid "Revision Queue" +msgstr "Coda revisioni" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:235 +msgid "PublishPress Revisions Network Settings" +msgstr "Impostazioni di rete di PublishPress Revisions" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "Impostazioni rete" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:237 +msgid "PublishPress Revisions Network Defaults" +msgstr "Reti predefinite di PublishPress Revisions" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "Reti predefiniti" + +#: admin/admin_rvy.php:121 +msgid "" +"Scheduled Revisions are not available because WP-Cron is disabled on this " +"site. See %sRevisions > Settings > Scheduled Revisions%s." +msgstr "" +"Le revisioni programmate non sono disponibili perché WP-Cron è disabilitato " +"su questo sito. Vedere %sRevisioni > Impostazioni > Revisioni programmate%s." + +#: admin/admin_rvy.php:199 +msgctxt "groups per page (screen options)" +msgid "Revisions" +msgstr "Revisioni" + +#: admin/admin_rvy.php:238 +msgid "Revisions" +msgstr "Revisioni" + +#: admin/admin_rvy.php:283 admin/admin_rvy.php:284 +#: admin/revision-archive_rvy.php:80 +msgid "Revision Archive" +msgstr "Archivio revisioni" + +#: admin/admin_rvy.php:299 admin/options.php:241 +msgid "PublishPress Revisions Settings" +msgstr "Impostazione di PublishPress Revisions" + +#: admin/admin_rvy.php:299 admin/options.php:92 +msgid "Settings" +msgstr "Impostazioni" + +#: admin/admin_rvy.php:306 admin/admin_rvy.php:307 includes/CoreAdmin.php:93 +msgid "Upgrade to Pro" +msgstr "Aggiornare a Pro" + +#: admin/admin_rvy.php:384 +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "Se ti piace %s, lasciaci una valutazione di %s!" + +#: admin/admin_rvy.php:395 +msgid "About" +msgstr "Informazioni sul plugin" + +#: admin/admin_rvy.php:397 +msgid "Documentation" +msgstr "Documentazione" + +#: admin/admin_rvy.php:399 +msgid "Contact" +msgstr "Contatto" + +#: admin/agents_checklist_rvy.php:75 +msgid "show current users (%d)" +msgstr "mostra utenti correnti (%d)" + +#: admin/agents_checklist_rvy.php:77 +msgid "show eligible users (%d)" +msgstr "mostra utenti idonei (%d)" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "filtro:" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "seleziona" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "deseleziona" + +#: admin/class-list-table-archive.php:157 +msgid "Revision Author: %s" +msgstr "Autore revisione: %s" + +#: admin/class-list-table-archive.php:174 +msgid "Post Author: %s" +msgstr "Autore articolo: %s" + +#: admin/class-list-table-archive.php:197 +msgid "Search results for \"%s\"" +msgstr "Risultati della ricerca per \"%s\"" + +#: admin/class-list-table-archive.php:385 admin/class-list-table_rvy.php:1050 +#: admin/class-list-table_rvy.php:1317 admin/post-edit-block-ui_rvy.php:94 +#: admin/post-edit_rvy.php:52 admin/RevisionEditSubmitMetabox.php:62 +msgid "Delete Revision" +msgstr "Elimina revisione" + +#: admin/class-list-table-archive.php:426 +msgid "Count" +msgstr "Conteggio" + +#: admin/class-list-table-archive.php:427 admin/class-list-table_rvy.php:548 +msgid "Post Type" +msgstr "Tipo di articolo" + +#: admin/class-list-table-archive.php:428 rvy_init-functions.php:454 +msgid "Revised By" +msgstr "Rivisto da" + +#: admin/class-list-table-archive.php:429 rvy_init-functions.php:455 +msgid "Revision Date" +msgstr "Data della revisione" + +#: admin/class-list-table-archive.php:430 +msgid "Method" +msgstr "Metodo" + +#: admin/class-list-table-archive.php:431 +msgid "Approved By" +msgstr "Approvato da" + +#: admin/class-list-table-archive.php:432 +msgid "Published Date" +msgstr "Data di pubblicazione" + +#: admin/class-list-table-archive.php:433 +msgid "Published Author" +msgstr "Autore della pubblicazione" + +#: admin/class-list-table-archive.php:461 +msgid "just now" +msgstr "appena adesso" + +#: admin/class-list-table-archive.php:464 +msgid "%s minutes ago" +msgstr "%s minuti fa" + +#: admin/class-list-table-archive.php:469 +msgid "%s hours ago" +msgstr "%s ore fa" + +#: admin/class-list-table-archive.php:511 +msgid "Revisions are disabled for %s post type" +msgstr "Le revisioni sono disabilitate il tipo di contenuto %s" + +#: admin/class-list-table-archive.php:566 +#: admin/class-list-table-archive.php:571 +msgid "Submitted Rev." +msgstr "Revisione inviata" + +#: admin/class-list-table-archive.php:573 +msgid "Direct Edit" +msgstr "Modifica diretta" + +#: admin/class-list-table-archive.php:634 +msgid "Reset Filters" +msgstr "Reimposta i filtri" + +#: admin/class-list-table-archive.php:657 +msgid "All post types" +msgstr "Tutti i tipi di contenuto" + +#: admin/class-list-table-archive.php:693 +msgid "All" +msgstr "Tutto" + +#: admin/class-list-table-archive.php:707 +msgid "My Revisions" +msgstr "Le mie revisioni" + +#: admin/class-list-table-archive.php:752 +msgid "Compare Changes in %s" +msgstr "Confronta le modifiche in %s" + +#: admin/class-list-table-archive.php:756 admin/class-list-table_rvy.php:1358 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:178 +#: admin/post-edit_rvy.php:192 +msgctxt "revisions" +msgid "Compare" +msgstr "Confronta" + +#. translators: %s: post title +#: admin/class-list-table-archive.php:771 admin/class-list-table_rvy.php:1342 +#: admin/post-editor-workflow-ui_rvy.php:199 +msgid "Preview Revision" +msgstr "Anteprima revisione" + +#: admin/class-list-table-archive.php:783 +msgid "List Revisions of this Post" +msgstr "Elenca le revisioni di questo articolo" + +#: admin/class-list-table-archive.php:784 +msgid "Filter" +msgstr "Filtro" + +#: admin/class-list-table-archive.php:796 +msgid "Delete Past Revision" +msgstr "Elimina revisione precedente" + +#: admin/class-list-table-archive.php:882 +msgid "No revisions found." +msgstr "Nessuna revisone trovata." + +#: admin/class-list-table_rvy.php:547 admin/post-editor-workflow-ui_rvy.php:31 +msgid "Status" +msgstr "Stato" + +#: admin/class-list-table_rvy.php:601 admin/class-list-table_rvy.php:1224 +msgid "Y/m/d g:i:s a" +msgstr "D/m/y g:i:s a" + +#: admin/class-list-table_rvy.php:611 admin/class-list-table_rvy.php:1232 +msgid "Y/m/d g:i a" +msgstr "D/m/y g:i a" + +#: admin/class-list-table_rvy.php:618 +msgid "Scheduled publication: %s" +msgstr "Pubblicazione pianificata: %s" + +#: admin/class-list-table_rvy.php:621 +msgid "Requested publication: %s" +msgstr "Pubblicazione richiesta: %s" + +#: admin/class-list-table_rvy.php:666 admin/history_rvy.php:786 +msgid "No author" +msgstr "Senza autore" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:708 +msgid "View only revisions of %s" +msgstr "Visualizza solo le revisioni di %s" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:720 admin/class-list-table_rvy.php:728 +msgid "View published post" +msgstr "Visualizza l'articolo pubblicato" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:752 +msgid "Compare Past Revisions" +msgstr "Confronta le revisioni passate" + +#: admin/class-list-table_rvy.php:753 +msgid "History" +msgstr "Cronologia" + +#: admin/class-list-table_rvy.php:1006 +msgid "My Activity" +msgstr "La mia attività" + +#: admin/class-list-table_rvy.php:1014 +msgid "All %s" +msgstr "Tutti %s" + +#: admin/class-list-table_rvy.php:1046 +msgid "Unschedule" +msgstr "Non programmato" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1050 admin/class-list-table_rvy.php:1313 +#: admin/post-edit-block-ui_rvy.php:94 admin/post-edit_rvy.php:52 +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Discard Revision" +msgstr "Scarta la revisione" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1357 +msgid "Compare Changes" +msgstr "Confronta le modifiche" + +#: admin/class-list-table_rvy.php:1366 +msgctxt "revisions" +msgid "Decline" +msgstr "Rifiuta" + +#: admin/edit-revision-classic-ui_rvy.php:63 +msgid "Publish on approval" +msgstr "Pubblicare su approvazione" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "" +"Confronta questa revisione con la copia pubblicata o con altre revisioni" + +#: admin/edit-revision-classic-ui_rvy.php:106 +msgid "Revision updated. %sView Preview%s" +msgstr "Revisione aggiornata. %sVisualizza anteprima%s" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "Revisione aggiornata." + +#: admin/history_rvy.php:191 +msgid "Compare %s of \"%s\"" +msgstr "Compara %s di \"%s\"" + +#: admin/history_rvy.php:535 admin/options.php:767 +msgid "Post Date" +msgstr "Data articolo" + +#: admin/history_rvy.php:536 +msgid "Post Parent" +msgstr "Articoli genitore" + +#: admin/history_rvy.php:537 +msgid "Menu Order" +msgstr "Ordinamento menu" + +#: admin/history_rvy.php:538 +msgid "Comment Status" +msgstr "Stato del commento" + +#: admin/history_rvy.php:539 +msgid "Ping Status" +msgstr "Stato di ping" + +#: admin/history_rvy.php:674 +msgid "Page Template" +msgstr "Template Pagina" + +#: admin/history_rvy.php:677 +msgid "Featured Image" +msgstr "Immagine in evidenza" + +#: admin/history_rvy.php:681 +msgid "Beaver Builder Data" +msgstr "Dati Beaver Builder" + +#: admin/history_rvy.php:682 +msgid "Beaver Builder Settings" +msgstr "Impostazioni di Beaver Builder" + +#: admin/history_rvy.php:914 +msgid "Scheduled for " +msgstr "Programmato per " + +#: admin/history_rvy.php:919 +msgid "Requested for " +msgstr "Richiesto per " + +#: admin/history_rvy.php:924 +msgid "Modified " +msgstr "Modificato " + +#: admin/history_rvy.php:929 +msgid "%s%s from now" +msgstr "%s%s da adesso" + +#: admin/history_rvy.php:940 +msgid "M j, Y @ g:i a" +msgstr "J M, Y @ g:i a" + +#: admin/history_rvy.php:985 +msgid "M j, Y @ H:i" +msgstr "J M, Y @ H:i" + +#: admin/history_rvy.php:986 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "j M @ H:i" + +#: admin/history_rvy.php:1072 front_rvy.php:479 front_rvy.php:504 +#: rvy_init-functions.php:260 rvy_init-functions.php:278 +#: rvy_init-functions.php:317 rvy_init-functions.php:334 +#: rvy_init-functions.php:351 +msgid "Approve" +msgstr "Approva" + +#: admin/history_rvy.php:1072 +msgid "Preview / Approve" +msgstr "Anteprima/Approva" + +#: admin/history_rvy.php:1074 admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +#: admin/post-editor-workflow-ui_rvy.php:199 +#: admin/RevisionEditSubmitMetabox.php:123 +msgid "Preview" +msgstr "Anteprima" + +#: admin/history_rvy.php:1168 +msgid "Preview / Restore" +msgstr "Anteprima/ripristina" + +#: admin/history_rvy.php:1175 +msgid "Manage" +msgstr "Gestisci" + +#: admin/history_rvy.php:1176 +msgid "List" +msgstr "Elenco" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "Ambito di impostazione" + +#: admin/options.php:96 +msgid "Post Types" +msgstr "Tipi di contenuto" + +#: admin/options.php:97 +msgid "Revisors" +msgstr "Revisori" + +#: admin/options.php:98 +msgid "Statuses" +msgstr "Stati" + +#: admin/options.php:99 +msgid "Revision Creation" +msgstr "Creazione di revisioni" + +#: admin/options.php:100 admin/options.php:111 +msgid "Revision Submission" +msgstr "Invio revisione" + +#: admin/options.php:102 +msgid "Queue" +msgstr "Coda" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "Anteprima/approvazione" + +#: admin/options.php:104 +msgid "Options" +msgstr "Opzioni" + +#: admin/options.php:105 +msgid "Notifications" +msgstr "Notifiche" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" +"Usare etichette alternative: \"Copia di lavoro\" > \"Richiesta di modifica\" " +"> \"Modifica programmata\"" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" +"Capacità di ruolo aggiuntiva richiesta per creare una nuova copia di lavoro" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "Capacità di ruolo aggiuntiva richiesta per creare una nuova revisione" + +#: admin/options.php:121 admin/options.php:124 +msgid "Enable %s" +msgstr "Abilitare %s" + +#: admin/options.php:122 +msgid "Limit to one active revision per post" +msgstr "Limita ad una revisione attiva per articolo" + +#: admin/options.php:123 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" +"Invia automaticamente le revisioni create da un utente con le capacità di " +"pubblicazione" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a Change Request" +msgstr "" +"Capacità di ruolo aggiuntiva richiesta per inviare una richiesta di modifica" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a revision" +msgstr "Capacità di ruolo aggiuntiva richiesta per inviare una revisione" + +#: admin/options.php:126 +msgid "Editing others' revisions requires role capability" +msgstr "Per modificare le revisioni altrui è necessaria una capacità di ruolo" + +#: admin/options.php:127 +msgid "Listing others' revisions requires role capability" +msgstr "Per elencare le revisioni altrui è necessaria una capacità di ruolo" + +#: admin/options.php:128 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" +"Gli utenti possono sempre amministrare le revisioni dei propri articoli " +"modificabili" + +#: admin/options.php:129 +msgid "Also notify on Revision Update" +msgstr "Notifica anche su aggiornamento della revisione" + +#: admin/options.php:130 +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" +"Pubblicazione della revisione: azioni API per imitare l'aggiornamento " +"dell'articolo" + +#: admin/options.php:131 +msgid "Hide html tags on Compare Revisions screen" +msgstr "Nascondi i tag HTML nella schermata \"Confronta revisioni\"" + +#: admin/options.php:132 +msgid "Use WP-Cron scheduling" +msgstr "Utilizza la programmazione WP-Cron" + +#: admin/options.php:133 +msgid "Site uses a custom trigger for WP-Cron tasks" +msgstr "Il sito utilizza un trigger personalizzato per le attività di WP-Cron" + +#: admin/options.php:134 +msgid "Asynchronous Publishing" +msgstr "Pubblicazione asincrona" + +#: admin/options.php:135 admin/options.php:136 +msgid "Update Publish Date" +msgstr "Aggiorna data pubblicazione" + +#: admin/options.php:137 admin/options.php:138 +msgid "Update Modified Date" +msgstr "Aggiorna la data di modifica" + +#: admin/options.php:139 +msgid "Email original Author when a %s is submitted" +msgstr "Invia una email agli autori originali quando una %s è stata inviata" + +#: admin/options.php:140 +msgid "Email the original Author when a %s is approved" +msgstr "Invia una email agli autori originali quando una %s è stata approvata" + +#: admin/options.php:141 +msgid "Email the Revisor when a %s is approved" +msgstr "Invia una email ai revisori quando una %s è stata approvata" + +#: admin/options.php:142 +msgid "Email the original Author when a %s is published" +msgstr "Invia una email agli autori originali quando una %s è stata pubblicata" + +#: admin/options.php:143 +msgid "Email the Revisor when a %s is published" +msgstr "Invia una email ai revisori quando una %s è stata pubblicata" + +#: admin/options.php:144 +msgid "Enable notification buffer" +msgstr "Attiva buffer delle notifche" + +#: admin/options.php:145 +msgid "All custom post types available to Revisors" +msgstr "Tutti i tipi di articoli personalizzati disponibili per i revisori" + +#: admin/options.php:146 +msgid "Prevent Revisors from editing other user's drafts" +msgstr "Impedisci ai revisori di modificare le bozze di altri utenti" + +#: admin/options.php:148 +msgid "Show Preview Links" +msgstr "Mostra i link di anteprima" + +#: admin/options.php:149 +msgid "Preview Link Type" +msgstr "Anteprima tipo di collegamento" + +#: admin/options.php:150 +msgid "Modify preview link for better theme compatibility" +msgstr "Adatta i link di anteprima per una migliore compatibilità con il tema" + +#: admin/options.php:151 +msgid "Extra preview button in Gutenberg Editor top bar" +msgstr "" +"Pulsante extra di anteprima nella barra superiore dell'editor Gutenberg" + +#: admin/options.php:152 +msgid "Theme Compat: For front page revision preview, set home flag" +msgstr "" +"Compatibilità con il tema: Per l'anteprima della revisione della home page, " +"impostare il contrassegno home" + +#: admin/options.php:153 +msgid "Approve Button on Compare Revisions screen" +msgstr "Pulsante approva nella schermata «Confronta revisioni»" + +#: admin/options.php:154 +msgid "Copy revision comments to published post" +msgstr "Copia i commenti di revisione nell'articolo pubblicato" + +#: admin/options.php:156 +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" +"Includi %s nelle viste \"La mia attività\", \"Revisioni dei miei articoli\"" + +#: admin/options.php:157 +msgid "On Revision publication, delete Editorial Comments" +msgstr "Quando la revisione viene pubblicata, eliminare i commenti editoriali" + +#: admin/options.php:158 +msgid "Enable deletion queue" +msgstr "Abilita la coda di cancellazione" + +#: admin/options.php:159 +msgid "Enable deletion in Revision Archive" +msgstr "Abilita l'eliminazione nell'archivio revisioni" + +#: admin/options.php:160 +msgid "Revision Restore: Non-Administrators need capability" +msgstr "" +"Ripristino delle revisioni: i non amministratori hanno bisogno di una " +"capacità" + +#: admin/options.php:166 +msgid "Email designated Publishers when a %s is submitted" +msgstr "Invia una email agli editori designati quando una %s è stata inviata" + +#: admin/options.php:167 +msgid "Email designated Publishers when a %s is published" +msgstr "" +"Invia una email agli editori designati quando una %s è stata pubblicata" + +#: admin/options.php:168 +msgid "Email designated Publishers when a %s is approved" +msgstr "" +"Invia una email agli editori prestabiliti quando una %s è stata approvata" + +#: admin/options.php:170 +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" +"Invia una email agli editor e amministratori quando una %s è stata inviata" + +#: admin/options.php:171 +msgid "Email Editors and Administrators when a %s is published" +msgstr "" +"Invia una email agli editor e amministratori quando una %s è stata pubblicata" + +#: admin/options.php:172 +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" +"Invia una email agli editor e amministratori quando una %s è stata approvata" + +#: admin/options.php:239 +msgid "PublishPress Revisions Site Settings" +msgstr "Impostazioni del sito per PublishPress Revisions" + +#: admin/options.php:269 +msgid "" +"These are the default settings for options which can be adjusted per-site." +msgstr "" +"Queste sono le impostazioni predefinite per le opzioni che possono essere " +"modificate per ogni sito." + +#: admin/options.php:307 +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress Revisions " +"settings. %s" +msgstr "" +"Utilizza questa scheda per fare dei cambiamenti delle impostazioni di " +"PublishPress Revisions su TUTTA LA RETE. %s" + +#: admin/options.php:310 +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" +"Puoi anche specificare %1$spredefinite per le impostazioni specifiche del " +"sito%2$s." + +#: admin/options.php:313 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" +"Qui puoi modificare il valore predefinito per le impostazioni che sono " +"controllate separatamente su ogni sito." + +#: admin/options.php:323 admin/options.php:325 +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" +"Tieni presente che potrebbero essere disponibili anche %1$s impostazioni di " +"rete%2$s." + +#: admin/options.php:350 +msgid "License" +msgstr "Licenza" + +#: admin/options.php:403 +msgid "Enable revision submission for these Post Types:" +msgstr "Abilita l'invio delle revisoni per questi tipi di contenuto:" + +#: admin/options.php:463 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" +"Nota: il codice di terze parti può causare l'incompatibilità di alcuni tipi " +"di articoli con PublishPress Revisions." + +#: admin/options.php:477 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" +"Il ruolo utente \"Revisore\" è ora disponibile. Includere anche le " +"funzionalità per tutti i tipi di articoli personalizzati in questo ruolo?" + +#: admin/options.php:482 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" +"Se selezionata, verrà selezionata anche la funzionalità edit_others_drafts " +"per gli utenti privi di funzionalità di pubblicazione a livello di sito" + +#: admin/options.php:497 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for " +"Approval\", \"Scheduled Revision\"" +msgstr "" +"Le etichette predefinite sono \"Non inviato per l'approvazione\", \"Inviato " +"per l'approvazione\", \"Revisione programmata\"." + +#: admin/options.php:511 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" +"Questa restrizione si applica agli utenti che non sono editor completi per " +"il tipo di contenuto. Per abilitare un ruolo, aggiungi le capacità: " +"copy_posts, copy_others_pages, ecc." + +#: admin/options.php:516 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" +"Per espandere l'elenco \"Articoli/Pagine\" per i non-editori, aggiungi le " +"capacità: list_others_pages, list_published_posts, ecc." + +#: admin/options.php:520 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" +"Per abilitare un ruolo, aggiungi la capacità di manage_unsubmitted_revisions" + +#: admin/options.php:537 +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" +"Se l'utente non ha un collegamento regolare a Modifica, rinomina il link %s " +"come \"Modifica\"." + +#: admin/options.php:559 +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" +"Abilita il contenuto pubblicato ad essere copiato, modificato, sottoposto ad " +"approvazione e gestito nella %sCoda revisione%s." + +#: admin/options.php:565 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" +"Questa restrizione si applica agli utenti che non sono editori completi per " +"il tipo di articolo. Per abilitare un ruolo, aggiungi le capacità: " +"revise_posts, revise_others_pages, ecc." + +#: admin/options.php:568 admin/options.php:592 +msgid "When a %s is published, update post publish date to current time." +msgstr "" +"Quando un %s viene pubblicato, aggiorna la data di pubblicazione " +"dell'articolo all'ora corrente." + +#: admin/options.php:571 admin/options.php:595 +msgid "When a %s is published, update post modified date to current time." +msgstr "" +"Quando un %s viene pubblicato, aggiorna la data di modifica dell'articolo " +"all'ora corrente." + +#: admin/options.php:589 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" +"Se un articolo o una pagina attualmente pubblicati vengono modificati e " +"viene impostata una data futura, la modifica non verrà applicata fino alla " +"data selezionata." + +#: admin/options.php:600 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" +"Pubblica le revisioni programmate utilizzando il meccanismo WP-Cron. Su " +"alcuni siti, la pubblicazione fallirà se questa impostazione è disattivata." + +#: admin/options.php:604 +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" +"Pubblica le revisioni pianificate in modo asincrono, tramite una richiesta " +"http secondaria dal server. Di solito è la soluzione migliore poiché elimina " +"i ritardi, ma alcuni server potrebbero non supportarla." + +#: admin/options.php:609 +msgid "" +"The WP-Cron trigger is disabled, but scheduled tasks are still excecuted " +"using a custom trigger." +msgstr "" +"Il trigger di WP-Cron è disattivato, ma le attività pianificate vengono " +"comunque eseguite utilizzando un trigger personalizzato." + +#: admin/options.php:626 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" +"Questa restrizione si applica agli utenti che non sono editor completi per " +"il tipo di articolo. Per abilitare un ruolo, forniscigli la funzionalità " +"edit_others_revisions." + +#: admin/options.php:629 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" +"Questa restrizione si applica agli utenti che non sono editor completi per " +"il tipo di articolo. Per abilitare un ruolo, forniscigli la funzionalità in " +"capacità in list_others_revisions." + +#: admin/options.php:632 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" +"Ignora le restrizioni di cui sopra per le revisioni altrui degli articoli " +"dell'utente connesso." + +#: admin/options.php:641 +msgid "Regenerate \"post has revision\" flags" +msgstr "Rigenera i flag «l'articolo ha una revisione»" + +#: admin/options.php:656 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators." +msgstr "" +"Per i temi che bloccano l'anteprima di revisione, nascondi i link di " +"anteprima ai non amministratori" + +#: admin/options.php:668 +msgid "Published Post Slug" +msgstr "Slug dell'articolo pubblicato" + +#: admin/options.php:668 +msgid "Revision Slug" +msgstr "Slug della revisione" + +#: admin/options.php:668 +msgid "Revision ID only" +msgstr "Solo ID revisione" + +#: admin/options.php:679 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" +"Alcuni temi o plugin potrebbero richiedere il tipo di collegamento Slug " +"revisione o ID revisione per il corretto caricamento del modello e la " +"visualizzazione dei campi." + +#: admin/options.php:688 +msgid "The revision preview argument is configured by constant definition: %s" +msgstr "" +"L'argomento anteprima di revisione è configurato dalla definizione della " +"costante: %s" + +#: admin/options.php:695 +msgid "" +"Adjust preview links to use \"rv_preview\" argument instead of \"preview\". " +"Experiment to see which works best with your theme." +msgstr "" +"Adatta i link di anteprima in modo che utilizzino l'argomento \"rv_preview\" " +"invece di \"preview\". Sperimenta per vedere quale funziona meglio con il " +"tuo tema." + +#: admin/options.php:704 +msgid "" +"Some themes may require this setting for correct revision preview display." +msgstr "" +"Per alcuni temi può essere obbligatoria questa impostazione per una corretta " +"visualizzazione dell'anteprima di revisione." + +#: admin/options.php:710 +msgid "If disabled, Compare screen links to Revision Preview for approval." +msgstr "" +"Se disabilitata, la schermata «Confronta» si collega all'anteprima della " +"revisione per l'approvazione." + +#: admin/options.php:738 +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" +"Per avere una compatibilità con Advanced Custom Fields, Beaver Builder e " +"WPML, aggiorna a %sPublishPress Revisions Pro%s." + +#: admin/options.php:748 +msgid "This may improve compatibility with some plugins." +msgstr "Ciò potrebbe migliorare la compatibilità con alcuni plugin." + +#: admin/options.php:767 +msgid "Modification Date" +msgstr "Data di modifica" + +#: admin/options.php:777 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" +"Mostra didascalie descrittive per le impostazioni di PublishPress Revisions" + +#: admin/options.php:791 +msgid "" +"Non-Administrators cannot restore a revision without the restore_revisions " +"capability" +msgstr "" +"I non amministratori non possono ripristinare una revisione senza la " +"capacità restore_revisions" + +#: admin/options.php:813 admin/options.php:834 +msgid "Never" +msgstr "Mai" + +#: admin/options.php:813 admin/options.php:834 +msgid "By default" +msgstr "Per impostazione predefinita" + +#: admin/options.php:813 admin/options.php:834 +msgid "Always" +msgstr "Sempre" + +#: admin/options.php:823 admin/options.php:869 +msgid "select recipients" +msgstr "seleziona recipienti" + +#: admin/options.php:883 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" +"Per evitare errori di notifica, il buffer di messaggi di posta elettronica " +"serve per l'invio ritardato quando vengono superati i limiti di un minuto, " +"ora o giorno" + +#: admin/options.php:904 +msgid "Notification Buffer" +msgstr "Buffer delle notifiche" + +#: admin/options.php:932 +msgid "Notification Log" +msgstr "Registro delle notifiche" + +#: admin/options.php:961 +msgid "Purge Notification Buffer" +msgstr "Elimina buffer di notifica" + +#: admin/options.php:967 +msgid "Truncate Notification Log" +msgstr "Troncare il registro delle notifiche" + +#: admin/options.php:973 +msgid "Sent in last minute: %d / %d" +msgstr "Inviato negli ultimi minuti: %d/%d" + +#: admin/options.php:974 +msgid "Sent in last hour: %d / %d" +msgstr "Inviato nell'ultima ora: %d/%d" + +#: admin/options.php:975 +msgid "Sent in last day: %d / %d" +msgstr "Inviato lo scorso giorno: %d/%d" + +#: admin/options.php:982 +msgid "Seconds until next buffer processing time: %d" +msgstr "Secondi al successivo tempo di elaborazione del buffer: %d" + +#: admin/options.php:992 +msgid "Show Notification Log / Buffer" +msgstr "Mostra registro/buffer delle notifiche" + +#: admin/options.php:994 +msgid "Show with message content" +msgstr "Mostra con il contenuto del messaggio" + +#: admin/options.php:1005 includes/CoreAdmin.php:88 +msgid "WPML Translation Management" +msgstr "Gestione delle traduzioni con WPML" + +#: admin/options.php:1012 +msgid "Sync \"Needs Update\" flags" +msgstr "Sincronizzare le segnalazioni di \"Deve essere aggiornato\"" + +#: admin/options.php:1016 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" +"Impostare \"Deve essere aggiornato\" per ogni articolo con traduzioni che è " +"stato aggiornato (eventualmente con l'approvazione di una revisione) più " +"recentemente delle sue traduzioni." + +#: admin/options.php:1054 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" +"Specifica le impostazioni di PublishPress Revisions per controllare ampiezza " +"rete. Le impostazioni deselezionate vengono controllate separatamente su " +"ogni sito." + +#: admin/options.php:1064 +msgctxt "opentag option_tabname closetag (explanatory note)" +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "%1$s%2$s%3$s (%4$s)" + +#: admin/options.php:1100 +msgid "network-wide control of \"%s\"" +msgstr "controllo ampiezza di rete di \"%s\"" + +#: admin/options.php:1130 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" +"Tutte le impostazioni in questo modulo (comprese quelle nelle schede non " +"selezionate) verranno ripristinate ai valori PREDEFINITI. Sei sicuro?" + +#: admin/post-edit-block-ui_rvy.php:149 admin/post-edit_rvy.php:263 +msgid "Author" +msgstr "Autore" + +#: admin/post-editor-workflow-ui_rvy.php:35 +msgid "(on approval)" +msgstr "(in fase di approvazione)" + +#: admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +msgid "Preview this Revision" +msgstr "Visualizza questa revisione" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Publish" +msgstr "Visualizza/pubblica" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Approve" +msgstr "Visualizza/approva" + +#: admin/post-editor-workflow-ui_rvy.php:59 +#: admin/post-editor-workflow-ui_rvy.php:67 admin/post-edit_rvy.php:153 +msgid "View saved revision" +msgstr "Visualizza revisione salvata" + +#: admin/post-editor-workflow-ui_rvy.php:62 +msgid "View / Moderate saved revision" +msgstr "Visualizza/modera revisione salvata" + +#: admin/post-editor-workflow-ui_rvy.php:70 +msgid "View / Submit saved revision" +msgstr "Visualizza/Invia revisione salvata" + +#: admin/post-editor-workflow-ui_rvy.php:79 +msgid "View unsaved changes" +msgstr "Visualizza modifiche non salvate" + +#: admin/post-editor-workflow-ui_rvy.php:83 +msgid "%s%s Revision Edit" +msgid_plural "%s%s Revision Edits" +msgstr[0] "%s%s modifica revisione" +msgstr[1] "%s%s modifiche revisioni" + +#: admin/post-editor-workflow-ui_rvy.php:94 +msgid "Revision Submission Error" +msgstr "Errore di invio della revisione" + +#: admin/post-editor-workflow-ui_rvy.php:108 +#: admin/post-editor-workflow-ui_rvy.php:200 front_rvy.php:437 +msgid "Edit" +msgstr "Modifica" + +#: admin/post-editor-workflow-ui_rvy.php:115 +msgid "Approving the Revision..." +msgstr "La revisione è in fase di approvazione…" + +#: admin/post-editor-workflow-ui_rvy.php:142 rvy_init-functions.php:264 +#: rvy_init-functions.php:282 rvy_init-functions.php:300 +#: rvy_init-functions.php:320 rvy_init-functions.php:337 +#: rvy_init-functions.php:354 rvy_init-functions.php:458 +msgid "Update Revision" +msgstr "Aggiorna revisione" + +#: admin/post-editor-workflow-ui_rvy.php:200 +msgid "Edit Revision" +msgstr "Modifica revisione" + +#: admin/post-editor-workflow-ui_rvy.php:206 +msgid "Update post before creating %s." +msgstr "Aggiornare l'articolo prima di creare una %s." + +#: admin/post-editor-workflow-ui_rvy.php:213 +msgid "Error Creating Revision" +msgstr "Si è verificato un errore durante la creazione della revisione" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#: admin/post-editor-workflow-ui_rvy.php:235 +msgid "Update" +msgstr "Aggiorna" + +#: admin/post-editor-workflow-ui_rvy.php:229 +msgid "For custom field changes, edit a scheduled %s." +msgstr "Per le modifiche ai campi personalizzati, modifica un %s programmato." + +#: admin/post-edit_rvy.php:27 admin/post-edit_rvy.php:85 +msgid "Current Time" +msgstr "Ora attuale" + +#: admin/post-edit_rvy.php:111 +msgid "View revision in progress" +msgstr "Visualizza la revisione in corso" + +#: admin/post-edit_rvy.php:150 +msgid "View / moderate saved revision" +msgstr "Visualizza/modera revisione salvata" + +#: admin/revision-action_rvy.php:421 admin/revision-action_rvy.php:507 +msgid "[%s] Revision Approval Notice" +msgstr "[%s] Avviso di approvazione della revisione" + +#: admin/revision-action_rvy.php:422 +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "Una revisione a %1$s \"%2$s\" è stata approvata." + +#: admin/revision-action_rvy.php:426 +msgid "The submitter was %1$s." +msgstr "Il mittente era %1$s." + +#: admin/revision-action_rvy.php:430 admin/revision-action_rvy.php:512 +msgid "It will be published on %s" +msgstr "Sarà pubblicata il %s" + +#: admin/revision-action_rvy.php:434 admin/revision-action_rvy.php:516 +msgid "Preview it here: " +msgstr "Visualizza qui l'anteprima: " + +#: admin/revision-action_rvy.php:437 admin/revision-action_rvy.php:519 +msgid "Editor: " +msgstr "Editore: " + +#: admin/revision-action_rvy.php:439 admin/revision-action_rvy.php:521 +#: admin/revision-action_rvy.php:1352 admin/revision-action_rvy.php:1377 +#: admin/revision-action_rvy.php:1439 +msgid "View it online: " +msgstr "Visualizzala online: " + +#: admin/revision-action_rvy.php:508 +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "La revisione che hai inviato per il %1$s \"%2$s\" è stata approvata." + +#: admin/revision-action_rvy.php:1348 admin/revision-action_rvy.php:1370 +msgid "[%s] %s Publication Notice" +msgstr "[%s] %s Notifica di pubblicazione" + +#: admin/revision-action_rvy.php:1349 +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "" +"La revisione programmata che hai inviato per il %1$s \"%2$s\" è stata " +"pubblicata." + +#: admin/revision-action_rvy.php:1371 +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "Una revisione programmata del tuo %1$s \"%2$s\" è stata pubblicata." + +#: admin/revision-archive_rvy.php:11 +msgid "Revision for:" +msgstr "Revisone per:" + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "Non sei autorizzato a gestire le revisioni." + +#: admin/revision-queue_rvy.php:13 +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "%s e %s sono entrambi disabilitati. Vai a Revisioni > Impostazioni." + +#: admin/revision-queue_rvy.php:46 +msgid "%s revision submitted." +msgid_plural "%s revisions submitted." +msgstr[0] "%s revisione inviata." +msgstr[1] "%s revisioni inviate." + +#: admin/revision-queue_rvy.php:47 +msgid "%s revision declined." +msgid_plural "%s revisions declined." +msgstr[0] "%s revisione rifiutata." +msgstr[1] "%s revisioni rifiutate." + +#: admin/revision-queue_rvy.php:48 +msgid "%s revision approved." +msgid_plural "%s revisions approved." +msgstr[0] "%s revisione approvata." +msgstr[1] "%s revisioni approvate." + +#: admin/revision-queue_rvy.php:49 +msgid "%s revision unscheduled." +msgid_plural "%s revisions unscheduled." +msgstr[0] "%s revisione non programmata." +msgstr[1] "%s revisioni non programmate." + +#: admin/revision-queue_rvy.php:50 +msgid "%s revision published." +msgid_plural "%s revisions published." +msgstr[0] "%s revisione pubblicata." +msgstr[1] "%s revisioni pubblicate." + +#: admin/revision-queue_rvy.php:93 +msgctxt "Author Name" +msgid "%s: " +msgstr "%s: " + +#: admin/revision-queue_rvy.php:106 +msgctxt "Posts / Pages / etc." +msgid "of %s" +msgstr "di %s" + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +msgid "%sPost Author: %s" +msgstr "%sAutore articolo: %s" + +#: admin/revision-queue_rvy.php:121 +msgctxt "PublishedPostName (other filter captions)" +msgid "Revision Queue for \"%s\"%s" +msgstr "Coda di revisione per \"%s\"%s" + +#: admin/revision-queue_rvy.php:123 +msgid "Revision Queue %s" +msgstr "Coda revisione %s" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "" +"Gli editori riceveranno una notifica (ma non possono essere selezionati qui)." + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "Non verranno inviate notifiche email." + +#. translators: revision date format, see http://php.net/date +#: admin/revision-ui_rvy.php:73 +msgctxt "revision date format" +msgid "j F, Y @ g:i a" +msgstr "j F, Y @ g:i a" + +#: admin/revision-ui_rvy.php:92 +msgid "%1$s (Current)" +msgstr "%1$s (corrente)" + +#: admin/revision-ui_rvy.php:96 +msgid "%1$s (Autosave)" +msgstr "%1$s (Salvataggio automatico)" + +#: admin/revision-ui_rvy.php:102 +msgctxt "revision schedule date format" +msgid "j F, Y, g:i a" +msgstr "j F, Y, g:i a" + +#: admin/revision-ui_rvy.php:106 +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" +"%1$s (Pubblicazione richiesta: " +"%2$s)" + +#: admin/revision-ui_rvy.php:108 +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "" +"%1$s (Data di pubblicazione: %2$s)" + +#: admin/revision-ui_rvy.php:277 +msgid "The revision will be deleted. Are you sure?" +msgstr "La revisione verrà eliminata. Sei sicuro?" + +#: admin/revision-ui_rvy.php:370 +msgid "Modified Date" +msgstr "Data modificata" + +#: admin/RevisionEditSubmitMetabox.php:124 +msgid "Preview revision in progress" +msgstr "Anteprima della revisione in corso" + +#. translators: Publish box date formt, see http://php.net/date +#: admin/RevisionEditSubmitMetabox.php:180 +msgid "M j, Y @ G:i" +msgstr "J M Y @ G:i" + +#: admin/RevisionEditSubmitMetabox.php:191 +msgid "Publish %son approval%s" +msgstr "Pubblicare %sprevia approvazione%s" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" +"Nota: Per la visualizzazione visiva delle revisioni, " +"aggiungi il codice seguente a foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "Nessuna revisione specificata." + +#: admin/revisions.php:56 +msgid "Past" +msgstr "Passate" + +#: admin/revisions.php:119 +msgid "Revisions of %s" +msgstr "Revisioni di %s" + +#: admin/revisions.php:149 +msgid "The requested revision does not exist." +msgstr "La revisione richiesta non esiste." + +#: admin/revisions.php:219 +msgid "Past Revisions" +msgstr "Revisioni passate" + +#: admin/revisions.php:235 +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "%1$s %2$s (%3$s)%4$s" + +#: admin/revisions.php:256 +msgid "no %s revisions available." +msgstr "nessuna revisione di %s disponibile." + +#: front_rvy.php:403 +msgid "%sView Queue%s" +msgstr "%sVisualizza la coda%s" + +#: front_rvy.php:412 +msgid "%sCompare%s%sView Published Post%s" +msgstr "%sConfronta%s%sVisualizza l'articolo pubblicato%s" + +#: front_rvy.php:426 +msgid "%sView Published Post%s" +msgstr "%sVisualizza l'articolo pubblicato%s" + +#: front_rvy.php:482 rvy_init-functions.php:274 rvy_init-functions.php:330 +msgid "Submit" +msgstr "Invia" + +#: front_rvy.php:489 front_rvy.php:525 front_rvy.php:541 +msgid "Publish now" +msgstr "Pubblica ora" + +#: front_rvy.php:494 front_rvy.php:496 front_rvy.php:529 front_rvy.php:531 +msgid "This is a %s. %s %s %s" +msgstr "Questa è una %s. %s %s %s" + +#: front_rvy.php:508 +msgid "Decline" +msgstr "Rifiuta" + +#: front_rvy.php:518 front_rvy.php:520 +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "Questa è una %s (data di pubblicazione richiesta: %s). %s %s %s" + +#: front_rvy.php:544 front_rvy.php:546 +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "Questa è una %s (per la pubblicazione il %s). %s %s %s" + +#: front_rvy.php:561 front_rvy.php:563 +msgid "This is the Current Revision. %s" +msgstr "Questa è la revisione corrente. %s" + +#: front_rvy.php:575 +msgid "Restore" +msgstr "Ripristina" + +#: front_rvy.php:579 front_rvy.php:581 +msgid "This is a Past Revision (from %s). %s %s" +msgstr "Questa è una revisione precedente (da %s). %s %s" + +#: includes/CoreAdmin.php:73 +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "Aggiorna a PublishPress Revisions Pro" + +#: includes/CoreAdmin.php:78 +msgid "" +"Upgrade to PublishPress Revisions Pro for integration with key features of " +"these plugins:" +msgstr "" +"Aggiorna a PublishPress Revisions Pro per l'integrazione con le funzioni " +"chiave di questi plugin:" + +#: includes/CoreAdmin.php:81 +msgid "Elementor" +msgstr "Elementor" + +#: includes/CoreAdmin.php:82 +msgid "Divi Builder" +msgstr "Divi Builder" + +#: includes/CoreAdmin.php:83 +msgid "Beaver Builder" +msgstr "Beaver Builder" + +#: includes/CoreAdmin.php:84 +msgid "Advanced Custom Fields" +msgstr "Advanced Custom Fields" + +#: includes/CoreAdmin.php:85 +msgid "Pods" +msgstr "Pods" + +#: includes/CoreAdmin.php:86 +msgid "WooCommerce" +msgstr "WooCommerce" + +#: includes/CoreAdmin.php:87 +msgid "WPML" +msgstr "WPML" + +#: includes/CoreAdmin.php:89 +msgid "plugin integration details..." +msgstr "dettagli sull'integrazione del plugin…" + +#: includes/CoreAdmin.php:100 +msgid "Need PublishPress Revisions Support?" +msgstr "Hai bisogno del supporto di PublishPress Revisions?" + +#: includes/CoreAdmin.php:105 +msgid "If you need help or have a new feature request, let us know." +msgstr "" +"Se hai bisogno di aiuto o hai una nuova richiesta di funzionalità, faccelo " +"sapere." + +#: includes/CoreAdmin.php:107 +msgid "Request Support" +msgstr "RIchiesta di supporto" + +#: includes/CoreAdmin.php:116 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" +"Una documentazione dettagliata è disponibile anche sul sito del plugin." + +#: includes/CoreAdmin.php:118 +msgid "View Knowledge Base" +msgstr "Vedi la documentazione" + +#: lib/debug.php:110 +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "%1$s query in %2$s secondi. %3$s MB usati." + +#: revision-creation_rvy.php:185 +msgid "Could not insert revision into the database" +msgstr "Impossibile inserire la revisione nel database" + +#: revision-workflow_rvy.php:157 +msgid "[%s] %s Updated" +msgstr "[%s] %s aggiornato" + +#: revision-workflow_rvy.php:159 +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "%1$s ha aggiornato un %2$s del %3$s \"%4$s\"." + +#: revision-workflow_rvy.php:161 +msgid "[%s] %s" +msgstr "[%s] %s" + +#: revision-workflow_rvy.php:163 +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" +"%1$s ha inviato le modifiche al %2$s \"%3$s\". Puoi rivedere le modifiche " +"per una possibile pubblicazione:" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "Anteprima e approvazione: " + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "Coda revisione: " + +#: revision-workflow_rvy.php:176 +msgid "Edit %s: " +msgstr "Modifica %s: " + +#: revisionary.php:120 +msgid "This plugin can be deleted." +msgstr "Questo plugin può essere eliminato." + +#: rvy_init-functions.php:77 +msgid "Every 2 Minutes" +msgstr "Ogni 2 minuti" + +#: rvy_init-functions.php:254 rvy_init-functions.php:266 +msgid "Working Copy" +msgstr "Copia di lavoro" + +#: rvy_init-functions.php:255 +msgid "Create Working Copy" +msgstr "Crea copia di lavoro" + +#: rvy_init-functions.php:256 +msgid "Copy" +msgstr "Copia" + +#: rvy_init-functions.php:257 +msgid "Creating Working Copy..." +msgstr "Creazione della copia di lavoro…" + +#: rvy_init-functions.php:258 +msgid "Working Copy ready" +msgstr "Copia di lavoro pronta" + +#: rvy_init-functions.php:259 rvy_init-functions.php:277 +msgid "Approve Changes" +msgstr "Approvare le modifiche" + +#: rvy_init-functions.php:261 rvy_init-functions.php:279 +msgid "Approving Changes..." +msgstr "Approvando le modifiche…" + +#: rvy_init-functions.php:262 rvy_init-functions.php:280 +#: rvy_init-functions.php:298 +msgid "Publish Changes" +msgstr "Pubblica le modifiche" + +#: rvy_init-functions.php:263 rvy_init-functions.php:281 +#: rvy_init-functions.php:299 rvy_init-functions.php:319 +#: rvy_init-functions.php:336 rvy_init-functions.php:353 +msgid "Save Revision" +msgstr "Salva revisione" + +#: rvy_init-functions.php:265 +msgid "Working Copies" +msgstr "Copie di lavoro" + +#: rvy_init-functions.php:267 +msgid "Working Copies (%d)" +msgid_plural "Working Copies (%d)" +msgstr[0] "Copia di lavoro (%d)" +msgstr[1] "Copie di lavoro (%d)" + +#: rvy_init-functions.php:272 rvy_init-functions.php:284 +msgid "Change Request" +msgstr "Richiesta di modifica" + +#: rvy_init-functions.php:273 +msgid "Submit Change Request" +msgstr "Invia richiesta di modifica" + +#: rvy_init-functions.php:275 +msgid "Submitting Changes..." +msgstr "Invio delle modifiche…" + +#: rvy_init-functions.php:276 +msgid "Changes Submitted" +msgstr "Modifiche inviate" + +#: rvy_init-functions.php:283 +msgid "Change Requests" +msgstr "Richieste di modifica" + +#: rvy_init-functions.php:285 +msgid "Change Requests (%d)" +msgid_plural "Change Requests (%d)" +msgstr[0] "Richieste di modifica (%d)" +msgstr[1] "Richieste di modifiche (%d)" + +#: rvy_init-functions.php:286 +msgid "Enable Change Requests" +msgstr "Abilita le richieste di modifica" + +#: rvy_init-functions.php:291 rvy_init-functions.php:302 +msgid "Scheduled Change" +msgstr "Modifica programmata" + +#: rvy_init-functions.php:292 rvy_init-functions.php:293 +#: rvy_init-functions.php:296 rvy_init-functions.php:297 +msgid "Schedule Changes" +msgstr "Modifiche alla programmazione" + +#: rvy_init-functions.php:294 +msgid "Scheduling Changes..." +msgstr "Programmazione delle modifiche…" + +#: rvy_init-functions.php:295 +msgid "Changes are Scheduled." +msgstr "Le modifiche sono state programmate." + +#: rvy_init-functions.php:301 +msgid "Scheduled Changes" +msgstr "Modifiche programmate" + +#: rvy_init-functions.php:303 +msgid "Scheduled Changes (%d)" +msgid_plural "Scheduled Changes (%d)" +msgstr[0] "Modifica programmata (%d)" +msgstr[1] "Modifiche programmate (%d)" + +#: rvy_init-functions.php:311 +msgid "Unsubmitted Revision" +msgstr "Revisione non inviata" + +#: rvy_init-functions.php:312 rvy_init-functions.php:313 +msgid "New Revision" +msgstr "Nuova revisione" + +#: rvy_init-functions.php:314 +msgid "Creating Revision..." +msgstr "Creazione della revisione…" + +#: rvy_init-functions.php:315 +msgid "The Revision is ready to edit." +msgstr "La revisione è pronta per la modifica." + +#: rvy_init-functions.php:315 +msgid "Revision ready to edit." +msgstr "Revisioni pronte per la modifica." + +#: rvy_init-functions.php:316 rvy_init-functions.php:333 +#: rvy_init-functions.php:350 +msgid "Approve Revision" +msgstr "Approva la revisione" + +#: rvy_init-functions.php:318 rvy_init-functions.php:335 +#: rvy_init-functions.php:352 +msgid "Publish Revision" +msgstr "Pubblica revisione" + +#: rvy_init-functions.php:321 +msgid "Unsubmitted Revisions" +msgstr "Revisioni non inviate" + +#: rvy_init-functions.php:322 +msgid "Not Submitted" +msgstr "Non inviata" + +#: rvy_init-functions.php:323 +msgid "Not Submitted for Approval (%s)" +msgid_plural "Not Submitted for Approval (%s)" +msgstr[0] "Non inviata per l'approvazione(%s)" +msgstr[1] "Non inviate per l'approvazione(%s)" + +#: rvy_init-functions.php:328 +msgid "Submitted Revision" +msgstr "Revisione inviata" + +#: rvy_init-functions.php:329 rvy_init-functions.php:461 +msgid "Submit Revision" +msgstr "Invia revisione" + +#: rvy_init-functions.php:331 +msgid "Submitting Revision..." +msgstr "Invio della revisione…" + +#: rvy_init-functions.php:332 +msgid "The Revision is Submitted" +msgstr "La revisione è stata inviata" + +#: rvy_init-functions.php:332 +msgid "Revision Submitted" +msgstr "Revisione inviata" + +#: rvy_init-functions.php:338 +msgid "Submitted Revisions" +msgstr "Revisioni inviate" + +#: rvy_init-functions.php:339 +msgid "Submitted" +msgstr "Inviato" + +#: rvy_init-functions.php:340 +msgid "Submitted for Approval (%s)" +msgid_plural "Submitted for Approval (%s)" +msgstr[0] "Inviata per l'approvazione (%s)" +msgstr[1] "Inviate per l'approvazione (%s)" + +#: rvy_init-functions.php:345 +msgid "Scheduled Revision" +msgstr "Revisione programmata" + +#: rvy_init-functions.php:346 rvy_init-functions.php:347 +msgid "Schedule Revision" +msgstr "Revisione programmata" + +#: rvy_init-functions.php:348 +msgid "Scheduling Revision..." +msgstr "Programmazione della revisione…" + +#: rvy_init-functions.php:349 +msgid "The Revision is Scheduled" +msgstr "La revisione è stata programmata" + +#: rvy_init-functions.php:349 +msgid "Revision Scheduled" +msgstr "Revisione programmata" + +#: rvy_init-functions.php:355 +msgid "Scheduled Revisions" +msgstr "Revisioni programmate" + +#: rvy_init-functions.php:356 +msgid "Scheduled" +msgstr "Programmato" + +#: rvy_init-functions.php:357 +msgid "Scheduled Revision (%s)" +msgid_plural "Scheduled Revisions (%s)" +msgstr[0] "Revisione programmata (%s)" +msgstr[1] "Revisioni programmate (%s)" + +#: rvy_init-functions.php:448 +msgid "%sMy Copies & Changes%s(%s)
    " +msgid_plural "%sMy Copies & Changes%s(%s)
    " +msgstr[0] "%sLa mia copia e le mie modifiche%s(%s)" +msgstr[1] "%sLe mie copie e le mie modifiche%s(%s)" + +#: rvy_init-functions.php:449 +msgid "%sMy Revisions%s(%s)" +msgid_plural "%sMy Revisions%s(%s)" +msgstr[0] "%sLa mia revisione%s(%s)" +msgstr[1] "%sLe mie revisioni%s(%s)" + +#: rvy_init-functions.php:451 +msgid "%sRevisions to My Posts%s(%s)" +msgid_plural "%sRevisions to My Posts%s(%s)" +msgstr[0] "%sRevisioni del mio articolo%s(%s)" +msgstr[1] "%sRevisioni dei miei articoli%s(%s)" + +#: rvy_init-functions.php:456 +msgid "Post Author" +msgstr "Autore articolo" + +#: rvy_init-functions.php:457 +msgid "Published Post" +msgstr "Articolo pubblicato" + +#: rvy_init-functions.php:462 +msgid "Submit Changes" +msgstr "Invia le modifiche" + +#: rvy_init-functions.php:663 +msgid "Revisor" +msgstr "Revisore" + +#: rvy_init-functions.php:675 +msgctxt "User role" +msgid "Revisor" +msgstr "Revisore" + +#: rvy_init-functions.php:1153 +msgid "Revision Workflow" +msgstr "Workflow revisione" + +#~ msgid "View / Approve saved revision" +#~ msgstr "Visualizza/Approva revisione salvata" + +#~ msgid "Move to Trash" +#~ msgstr "Sposta nel cestino" + +#~ msgid "Status:" +#~ msgstr "Stato:" + +#, php-format +#~ msgid "Scheduled for: %s" +#~ msgstr "Programmato per: %s" + +#, php-format +#~ msgid "Publish on: %s" +#~ msgstr "Pubblica il: %s" + +#~ msgid "Error in deleting." +#~ msgstr "Errore durante l'eliminazione." + +#~ msgid "Scheduled Rev." +#~ msgstr "Revisione programmata" + +#~ msgid "Delete" +#~ msgstr "Elimina" + +#~ msgid "Schedule" +#~ msgstr "Programma" + +#, php-format +#~ msgid "%s ago" +#~ msgstr "%s fa" + +#~ msgid "Missed schedule" +#~ msgstr "Programma mancato" + +#~ msgid "View" +#~ msgstr "Visualizza" + +#~ msgid "Show more details" +#~ msgstr "Mostra più dettagli" + +#~ msgid "Publish" +#~ msgstr "Pubblica" + +#~ msgid "Delete Permanently" +#~ msgstr "Elimina definitivamente" + +#~ msgid "Filter by category" +#~ msgstr "Filtra per categoria" + +#~ msgid "Select All" +#~ msgstr "Seleziona tutto" + +#, php-format +#~ msgid "“%s” (Edit)" +#~ msgstr "“%s” (Modifica)" + +#~ msgid "Enable public preview" +#~ msgstr "Abilita anteprima pubblica" + +#~ msgid "Return to editor" +#~ msgstr "Torna all'editor" + +#~ msgid "(no title)" +#~ msgstr "(senza titolo)" + +#, php-format +#~ msgid "%s%s ago" +#~ msgstr "%s%s fa" + +#, php-format +#~ msgid "Additional role capability required to manage %s" +#~ msgstr "Capacità di ruolo aggiuntiva richiesta per gestire %s" + +#, php-format +#~ msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +#~ msgstr "" +#~ "Elenco articoli/pagine: utilizzare la didascalia \"Modifica\" per il link " +#~ "%s" + +#~ msgid "Display Hints" +#~ msgstr "Visualizza suggerimenti" + +#~ msgid "Compare Past Revisions ordering:" +#~ msgstr "Ordine per confrontare le revisioni precedenti:" + +#, php-format +#~ msgid "%s capabilities" +#~ msgstr "Capacità %s" + +#~ msgid "Preview / Submit" +#~ msgstr "Anteprima/Invia" + +#~ msgid "View / Submit" +#~ msgstr "Visualizza/Invia" + +#, php-format +#~ msgid "It was submitted by %1$s." +#~ msgstr "È stata inviata da %1$s." + +#, php-format +#~ msgid "[%s] %s Publication" +#~ msgstr "[%s] %s Pubblicazione" + +#, php-format +#~ msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +#~ msgstr "È stata pubblicata una revisione pianificata per %1$s \"%2$s\"." + +#, php-format +#~ msgid "%s revision permanently deleted." +#~ msgstr "%s revisione eliminata definitivamente." + +#~ msgid "Undo" +#~ msgstr "Annulla azione" + +#, php-format +#~ msgid "Preview “%s”" +#~ msgstr "Anteprima “%s”" + +#~ msgid "Actions" +#~ msgstr "Azioni" + +#~ msgid "Bulk Actions" +#~ msgstr "Azioni di gruppo" + +#~ msgid "Pending" +#~ msgstr "In attesa" + +#~ msgid "" +#~ "This plugin is outdated. You already have a more recent version " +#~ "installed. Please remove this version." +#~ msgstr "" +#~ "Questo plugin è obsoleto. Hai già installata una versione più recente. " +#~ "Questa versione dovresti rimuoverla." + +#, php-format +#~ msgid "" +#~ "This plugin is not installed in the standard folder. The current path is " +#~ "%1$s but it is expected to be %2$s." +#~ msgstr "" +#~ "Questo plugin non è installato nella cartella standard. Il percorso " +#~ "attuale è %1$s invece dovrebbe essere %2$s." + +#, php-format +#~ msgid "" +#~ "You have activated multiple instances of %s. Please keep only one " +#~ "activated and remove the others." +#~ msgstr "" +#~ "Hai attivato più istanze di %s. Mantienini solo una attivata ed elimina " +#~ "le altre." + +#, php-format +#~ msgid "Please deactivate %1$s when %2$s is activated." +#~ msgstr "Bisogna disattivare %1$s quando viene attivato %2$s." + +#, php-format +#~ msgid "" +#~ "Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +#~ "been useful. Please could you quickly leave a 5-star rating on WordPress." +#~ "org? It really does help to keep %1$s growing." +#~ msgstr "" +#~ "Ehi, stai già usando %1$s nel tuo sito da %2$s e speriamo che il plugin " +#~ "ti sia stato utile. Puoi lasciarci una valutazione a 5 stelle su " +#~ "WordPress.org? Questo ci aiuterà a far crescere %1$s." + +#~ msgid "1 week" +#~ msgstr "1 settimana" + +#~ msgid "1 month" +#~ msgstr "1 mese" + +#~ msgid "3 months" +#~ msgstr "3 mesi" + +#, php-format +#~ msgid "Click here to add your rating for %s" +#~ msgstr "Fai clic qui per aggiungere la tua valutazione di %s" + +#~ msgid "Maybe later" +#~ msgstr "Forse più tardi" + +#~ msgid "I already did" +#~ msgstr "L'ho già fatto" + +#~ msgid "Amazing! We are redirecting you to our site..." +#~ msgstr "Fantastico! Ti stiamo reindirizzando al nostro sito…" + +#, php-format +#~ msgid "" +#~ "Another copy of PublishPress Revisions (or Revisionary) is already " +#~ "activated (version %1$s: \"%2$s\")" +#~ msgstr "" +#~ "Un'altra copia di PublishPress Revisions (o Revisionary) è già attivata " +#~ "(versione %1$s: \"%2$s\")" + +#, php-format +#~ msgid "" +#~ "Another copy of PublishPress Revisions (or Revisionary) is already " +#~ "activated (version %1$s)" +#~ msgstr "" +#~ "Un'altra copia di PublishPress Revisions (o Revisionary) è già attivata " +#~ "(versione %1$s)" + +#~ msgctxt "revision date short format" +#~ msgid "j M @ g:i a" +#~ msgstr "j M @ g:i a" + +#~ msgctxt "post revision" +#~ msgid "%1$s by %2$s" +#~ msgstr "%1$s da %2$s" diff --git a/wp-content/plugins/revisionary/languages/revisionary-sv_SV.mo b/wp-content/plugins/revisionary/languages/revisionary-sv_SV.mo new file mode 100644 index 0000000000000000000000000000000000000000..ec247bd29b10a4b65fc4d19194d83c12cc84407d GIT binary patch literal 26585 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\n" +"Language-Team: \n" +"Language: sv_SE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0.1\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;_c;_x;_n;_ex;__ngettext;esc_html__;esc_html_e\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPath-1: admin\n" +"X-Poedit-SearchPath-2: classes\n" +"X-Poedit-SearchPath-3: includes\n" +"X-Poedit-SearchPath-4: lib\n" +"X-Poedit-SearchPathExcluded-0: includes-pro\n" + +#: admin/RevisionEditSubmitMetabox.php:60 admin/class-list-table_rvy.php:1181 +msgid "Delete Revision" +msgstr "Ta bort revision" + +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Move to Trash" +msgstr "Flytta till papperskorg" + +#: admin/RevisionEditSubmitMetabox.php:118 +#: admin/RevisionEditSubmitMetabox.php:121 admin/class-list-table_rvy.php:609 +#: admin/class-list-table_rvy.php:1200 admin/history_rvy.php:1067 +#: admin/history_rvy.php:1162 admin/post-edit_rvy.php:85 +#: admin/post-editor-workflow-ui_rvy.php:48 +#: admin/post-editor-workflow-ui_rvy.php:89 +#: admin/post-editor-workflow-ui_rvy.php:185 admin/revision-ui_rvy.php:260 +msgid "Preview" +msgstr "Förhandsgranska" + +#: admin/RevisionEditSubmitMetabox.php:119 admin/post-edit_rvy.php:100 +msgid "View / moderate saved revision" +msgstr "Visa / moderera sparad revision" + +#: admin/RevisionEditSubmitMetabox.php:122 admin/post-edit_rvy.php:103 +msgid "View saved revision" +msgstr "Visa sparad revision" + +#: admin/RevisionEditSubmitMetabox.php:144 +msgid "Status:" +msgstr "Status:" + +#: admin/RevisionEditSubmitMetabox.php:177 +msgid "M j, Y @ G:i" +msgstr "j M Y @ H:i" + +#: admin/RevisionEditSubmitMetabox.php:182 +#, php-format +msgid "Scheduled for: %s" +msgstr "Schemalagd till den: %s" + +#: admin/RevisionEditSubmitMetabox.php:185 +#, php-format +msgid "Publish on: %s" +msgstr "Publicera på: %s" + +#: admin/RevisionEditSubmitMetabox.php:188 +#, fuzzy, php-format +#| msgid "Publish on: %s" +msgid "Publish %son approval%s" +msgstr "Publicera på: %s" + +#: admin/RevisionEditSubmitMetabox.php:193 admin/admin-posts_rvy.php:187 +#: admin/class-list-table_rvy.php:576 admin/class-list-table_rvy.php:1162 +#: admin/post-editor-workflow-ui_rvy.php:94 +#: admin/post-editor-workflow-ui_rvy.php:186 front_rvy.php:296 +msgid "Edit" +msgstr "Redigera" + +#: admin/admin-init_rvy.php:136 admin/admin-init_rvy.php:248 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "Tyvärr, du har inte tillåtelse att godkänna den här revisionen." + +#: admin/admin-init_rvy.php:177 +#, fuzzy +#| msgid "Sorry, you are not allowed to delete this revision." +msgid "Sorry, you are not allowed to submit this revision." +msgstr "Tyvärr har du inte tillåtelse att radera den här versionen." + +#: admin/admin-init_rvy.php:213 +#, fuzzy +#| msgid "Sorry, you are not allowed to delete this revision." +msgid "Sorry, you are not allowed to decline this revision." +msgstr "Tyvärr har du inte tillåtelse att radera den här versionen." + +#: admin/admin-init_rvy.php:277 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "Tyvärr har du inte tillåtelse att radera den här versionen." + +#: admin/admin-init_rvy.php:282 +msgid "Error in deleting." +msgstr "Fel vid borttagning." + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "Revisionen återställdes." + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "Revisionen schemalagd att publiceras." + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "Revisionen publicerades." + +#: admin/admin-posts_rvy.php:140 rvy_init.php:488 +msgid "Revision" +msgstr "Revision" + +#: admin/admin-posts_rvy.php:157 +msgid "Has Revision" +msgstr "Har revision" + +#: admin/admin-posts_rvy.php:172 admin/admin_rvy.php:213 +msgid "Revision Queue" +msgstr "Revisionskö" + +#: admin/admin_lib-mu_rvy.php:10 admin/options.php:227 +msgid "PublishPress Revisions Network Settings" +msgstr "PublishPress Revisions nätverksinställningar" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "Nätverksinställningar" + +#: admin/admin_lib-mu_rvy.php:21 admin/options.php:229 +msgid "PublishPress Revisions Network Defaults" +msgstr "PublishPress Revisions standardinställningar för nätverk" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "Nätverksstandard" + +#: admin/admin_rvy.php:194 admin/admin_rvy.php:210 +msgid "Revisions" +msgstr "Revisioner" + +#: admin/admin_rvy.php:226 admin/options.php:233 +msgid "PublishPress Revisions Settings" +msgstr "PublishPress Revisions inställningar" + +#: admin/admin_rvy.php:226 admin/options.php:92 +msgid "Settings" +msgstr "Inställningar" + +#: admin/admin_rvy.php:233 admin/admin_rvy.php:234 includes/CoreAdmin.php:92 +msgid "Upgrade to Pro" +msgstr "Uppgradera till Pro" + +#: admin/admin_rvy.php:306 +#, php-format +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "Om du gillar %s, Ge oss gärna ett %s betyg. Tack!" + +#: admin/admin_rvy.php:317 +msgid "About" +msgstr "Om" + +#: admin/admin_rvy.php:319 +msgid "Documentation" +msgstr "Dokumentation" + +#: admin/admin_rvy.php:321 +msgid "Contact" +msgstr "Kontakt" + +#: admin/agents_checklist_rvy.php:75 +#, php-format +msgid "show current users (%d)" +msgstr "visa nuvarande användare (%d)" + +#: admin/agents_checklist_rvy.php:77 +#, php-format +msgid "show eligible users (%d)" +msgstr "visa kvalificerade användare (%d)" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "filter:" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "markera" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "avmarkera" + +#: admin/class-list-table_rvy.php:427 admin/post-editor-workflow-ui_rvy.php:29 +msgid "Status" +msgstr "Status" + +#: admin/class-list-table_rvy.php:428 +msgid "Post Type" +msgstr "Posttyp" + +#: admin/class-list-table_rvy.php:438 +msgid "Schedule" +msgstr "Schemalägg" + +#: admin/class-list-table_rvy.php:481 admin/class-list-table_rvy.php:1093 +msgid "Y/m/d g:i:s a" +msgstr "Y-m-d H:i" + +#: admin/class-list-table_rvy.php:489 admin/class-list-table_rvy.php:1098 +#: admin/history_rvy.php:980 +#, php-format +msgid "%s ago" +msgstr "%s sedan" + +#: admin/class-list-table_rvy.php:491 admin/class-list-table_rvy.php:1101 +msgid "Y/m/d g:i a" +msgstr "Y-m-d H:i:s" + +#: admin/class-list-table_rvy.php:498 +#, php-format +msgid "Scheduled publication: %s" +msgstr "Schemalagd publicering: %s" + +#: admin/class-list-table_rvy.php:501 +#, php-format +msgid "Requested publication: %s" +msgstr "Begärt publicering: %s" + +#: admin/class-list-table_rvy.php:505 +msgid "Missed schedule" +msgstr "Missat schema " + +#: admin/class-list-table_rvy.php:546 admin/history_rvy.php:779 +msgid "No author" +msgstr "Ingen författare" + +#: admin/class-list-table_rvy.php:588 +#, php-format +msgid "View only revisions of %s" +msgstr "Visa bara revisioner av %s" + +#: admin/class-list-table_rvy.php:589 +msgid "Filter" +msgstr "Filter" + +#: admin/class-list-table_rvy.php:600 admin/class-list-table_rvy.php:608 +msgid "View published post" +msgstr "Visa publicerade inlägg" + +#: admin/class-list-table_rvy.php:601 +msgid "View" +msgstr "Visa" + +#: admin/class-list-table_rvy.php:632 +msgid "Compare Past Revisions" +msgstr "Jämför tidigare versioner" + +#: admin/class-list-table_rvy.php:633 +msgid "History" +msgstr "Historia" + +#: admin/class-list-table_rvy.php:661 +msgid "Show more details" +msgstr "" + +#: admin/class-list-table_rvy.php:886 +msgid "My Activity" +msgstr "" + +#: admin/class-list-table_rvy.php:894 +#, php-format +msgid "All %s" +msgstr "Alla %s" + +#: admin/class-list-table_rvy.php:918 front_rvy.php:341 rvy_init.php:309 +#: rvy_init.php:365 +#, fuzzy +#| msgid "Submitted " +msgid "Submit" +msgstr "Skicka schemalagd revision" + +#: admin/class-list-table_rvy.php:921 admin/history_rvy.php:1065 +#: front_rvy.php:338 front_rvy.php:359 rvy_init.php:295 rvy_init.php:313 +#: rvy_init.php:352 rvy_init.php:369 rvy_init.php:386 +msgid "Approve" +msgstr "Godkänn" + +#: admin/class-list-table_rvy.php:922 +msgid "Decline" +msgstr "" + +#: admin/class-list-table_rvy.php:923 +msgid "Publish" +msgstr "Publicera" + +#: admin/class-list-table_rvy.php:926 admin/revision-ui_rvy.php:270 +msgid "Unschedule" +msgstr "Ta bort schemaläggning" + +#: admin/class-list-table_rvy.php:930 admin/post-edit-block-ui_rvy.php:67 +#: admin/post-edit_rvy.php:51 +msgid "Delete Permanently" +msgstr "Ta bort permanent" + +#: admin/class-list-table_rvy.php:950 +msgid "Filter by category" +msgstr "Filtrera på kategori" + +#: admin/class-list-table_rvy.php:1005 +msgid "Select All" +msgstr "Välj alla" + +#: admin/class-list-table_rvy.php:1081 +#, php-format +msgid "“%s” (Edit)" +msgstr "“%s” (Redigera)" + +#: admin/class-list-table_rvy.php:1171 rvy_init.php:291 +#, fuzzy +msgid "Copy" +msgstr "Kopiera" + +#: admin/class-list-table_rvy.php:1182 admin/revision-ui_rvy.php:391 +msgid "Delete" +msgstr "Ta bort" + +#: admin/class-list-table_rvy.php:1199 +#: admin/post-editor-workflow-ui_rvy.php:185 +msgid "Preview Revision" +msgstr "Förhandsgranska revision" + +#: admin/class-list-table_rvy.php:1214 +msgid "Compare Changes" +msgstr "Jämför ändringar" + +#: admin/class-list-table_rvy.php:1215 +#: admin/edit-revision-classic-ui_rvy.php:92 admin/post-edit_rvy.php:125 +#: admin/post-edit_rvy.php:139 +#, fuzzy +#| msgctxt "revisions" +#| msgid "Compare" +msgid "Compare" +msgstr "Jämför" + +#: admin/edit-revision-block-ui_rvy.php:20 +msgid "Enable public preview" +msgstr "Aktivera offentlig förhandsgranskning" + +#: admin/edit-revision-classic-ui_rvy.php:63 +#, fuzzy +#| msgid "Publish immediately" +msgid "Publish on approval" +msgstr "Publicera direkt" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "Jämför denna revision med publicerad kopia, eller med andra revisioner" + +#: admin/edit-revision-classic-ui_rvy.php:106 +#, php-format +msgid "Revision updated. %sView Preview%s" +msgstr "Revision uppdaterad. %sVisa förhandsgranskning%s" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "Revision uppdaterad." + +#: admin/history_rvy.php:189 +#, fuzzy, php-format +#| msgid "Compare %s of “%s”" +msgid "Compare %s of \"%s\"" +msgstr "Jämför %s av “%s”" + +#: admin/history_rvy.php:195 +#, fuzzy +#| msgid "← Return to editor" +msgid "Return to editor" +msgstr "← Gå tillbaka till redigeraren" + +#: admin/history_rvy.php:428 admin/history_rvy.php:431 +msgid "(no title)" +msgstr "(ingen titel)" + +#: admin/history_rvy.php:528 admin/options.php:710 +msgid "Post Date" +msgstr "Inläggsdatum" + +#: admin/history_rvy.php:529 +msgid "Post Parent" +msgstr "Förälder" + +#: admin/history_rvy.php:530 +msgid "Menu Order" +msgstr "Menyordning" + +#: admin/history_rvy.php:531 +msgid "Comment Status" +msgstr "Kommentarstatus" + +#: admin/history_rvy.php:532 +msgid "Ping Status" +msgstr "Ping Status" + +#: admin/history_rvy.php:667 +msgid "Page Template" +msgstr "Sidmall" + +#: admin/history_rvy.php:670 +msgid "Featured Image" +msgstr "Utvald bild" + +#: admin/history_rvy.php:674 +msgid "Beaver Builder Data" +msgstr "Beaver Builder Data" + +#: admin/history_rvy.php:675 +msgid "Beaver Builder Settings" +msgstr "Beaver Builder inställningar" + +#: admin/history_rvy.php:907 +msgid "Scheduled for " +msgstr "Schemalägg för" + +#: admin/history_rvy.php:912 +msgid "Requested for " +msgstr "Begärt för" + +#: admin/history_rvy.php:917 +#, fuzzy +#| msgid "Modified Date" +msgid "Modified " +msgstr "Senast ändrad" + +#: admin/history_rvy.php:922 +#, php-format +msgid "%s%s ago" +msgstr "%s%s sedan" + +#: admin/history_rvy.php:922 +#, php-format +msgid "%s%s from now" +msgstr "%s%s från nu" + +#: admin/history_rvy.php:933 +msgid "M j, Y @ g:i a" +msgstr "j M Y H:i" + +#: admin/history_rvy.php:934 +#, fuzzy +#| msgctxt "revision date short format" +#| msgid "j M @ g:i a" +msgid "j M @ g:i a" +msgstr "j M kl. H:i" + +#: admin/history_rvy.php:978 +msgid "M j, Y @ H:i" +msgstr "M j, Y @ H:i" + +#: admin/history_rvy.php:979 +#, fuzzy +#| msgctxt "revision date short format" +#| msgid "j M @ H:i" +msgid "j M @ H:i" +msgstr "j M @ H:i" + +#: admin/history_rvy.php:1065 +#, fuzzy +#| msgid "Preview / Approval" +msgid "Preview / Approve" +msgstr "Förhandsgranska / Godkänn" + +#: admin/history_rvy.php:1161 +msgid "Preview / Restore" +msgstr "Förhandsgranska / Återställ" + +#: admin/history_rvy.php:1168 +msgid "Manage" +msgstr "Hantera" + +#: admin/history_rvy.php:1169 +msgid "List" +msgstr "Lista" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "Inställningsområde" + +#: admin/options.php:96 +#, fuzzy +#| msgid "Post Type" +msgid "Post Types" +msgstr "Posttyp" + +#: admin/options.php:97 +#, fuzzy +#| msgid "Revisor" +msgid "Revisors" +msgstr "Förhindra att revisorer redigerar andra användares utkast" + +#: admin/options.php:98 +#, fuzzy +#| msgid "Status" +msgid "Statuses" +msgstr "Status" + +#: admin/options.php:99 +#, fuzzy +#| msgid "Revision Options" +msgid "Revision Creation" +msgstr "Revisionsinställningar" + +#: admin/options.php:100 admin/options.php:111 +#, fuzzy +#| msgid "Revision Submission Error" +msgid "Revision Submission" +msgstr "Fel vid inlämning av revision" + +#: admin/options.php:102 +#, fuzzy +msgid "Queue" +msgstr "Revisionskö %s" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "Förhandsgranska / Godkänn" + +#: admin/options.php:104 +#, fuzzy +#| msgid "Actions" +msgid "Options" +msgstr "Åtgärder" + +#: admin/options.php:105 +#, fuzzy +#| msgid "Notification Log" +msgid "Notifications" +msgstr "Notifikation Log" + +#: admin/options.php:117 +msgid "" +"Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled " +"Change\"" +msgstr "" + +#: admin/options.php:118 +#, php-format +msgid "Additional role capability required to manage %s" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "" + +#: admin/options.php:120 +#, php-format +msgid "Posts / Pages list: Use \"Edit\" caption for %s link" +msgstr "" + +#: admin/options.php:121 admin/options.php:123 +#, php-format +msgid "Enable %s" +msgstr "" + +#: admin/options.php:122 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" + +#: admin/options.php:124 +msgid "Additional role capability required to submit a Change Request" +msgstr "" + +#: admin/options.php:124 +msgid "Additional role capability required to submit a revision" +msgstr "" + +#: admin/options.php:125 +msgid "Editing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:126 +msgid "Listing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:127 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" + +#: admin/options.php:128 +msgid "Also notify on Revision Update" +msgstr "" + +#: admin/options.php:129 +#, fuzzy +#| msgid "Revision publication triggers API actions to mimic post update" +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" +"Revisionspublikation utlöser API-åtgärder för att efterlikna uppdatering av " +"inlägg" + +#: admin/options.php:130 +#, fuzzy +#| msgid "Approve Button on Compare Revisions screen" +msgid "Hide html tags on Compare Revisions screen" +msgstr "Godkännknapp på jämför revisionskärmen" + +#: admin/options.php:131 +msgid "Use WP-Cron scheduling" +msgstr "" + +#: admin/options.php:132 +msgid "Asynchronous Publishing" +msgstr "Asynkron publicering" + +#: admin/options.php:133 admin/options.php:134 +msgid "Update Publish Date" +msgstr "Uppdatera publiceringsdatum" + +#: admin/options.php:135 admin/options.php:136 +#, fuzzy +#| msgid "Modified Date" +msgid "Update Modified Date" +msgstr "Senast ändrad" + +#: admin/options.php:137 +#, fuzzy, php-format +#| msgid "Email original Author when a Pending Revision is submitted" +msgid "Email original Author when a %s is submitted" +msgstr "Skicka originalförfattaren e-post när en väntande version skickas in" + +#: admin/options.php:138 +#, fuzzy, php-format +#| msgid "Email the original Author when a Pending Revision is approved" +msgid "Email the original Author when a %s is approved" +msgstr "" +"Skicka e-post till den ursprungliga författaren när en väntande revision är " +"godkänd" + +#: admin/options.php:139 +#, fuzzy, php-format +#| msgid "Email the Revisor when a Pending Revision is approved" +msgid "Email the Revisor when a %s is approved" +msgstr "Skicka e-post till revisor när en väntande revision är godkänd" + +#: admin/options.php:140 +#, fuzzy, php-format +#| msgid "Email the original Author when a Scheduled Revision is published" +msgid "Email the original Author when a %s is published" +msgstr "" +"Skicka e-post till den ursprungliga författaren när en schemalagd revision " +"publiceras" + +#: admin/options.php:141 +#, fuzzy, php-format +#| msgid "Email the Revisor when a Scheduled Revision is published" +msgid "Email the Revisor when a %s is published" +msgstr "Skicka e-post till revisor när en schemalagd revision publiceras" + +#: admin/options.php:142 +msgid "Enable notification buffer" +msgstr "Aktviera notifikationsbuffer" + +#: admin/options.php:143 +msgid "All custom post types available to Revisors" +msgstr "Alla anpassade inläggstyper tillgängliga för Revisorer" + +#: admin/options.php:144 +#, fuzzy +#| msgid "Prevent Revisors from editing other user's drafts" +msgid "Prevent Revisors from editing other user's drafts" +msgstr "Förhindra att revisorer redigerar andra användares utkast" + +#: admin/options.php:145 +msgid "Display Hints" +msgstr "Visa tips" + +#: admin/options.php:146 +msgid "Show Preview Links" +msgstr "Visa förhandsgranskningslänkar" + +#: admin/options.php:147 +msgid "Preview Link Type" +msgstr "Förhandsgransknings länktyp" + +#: admin/options.php:148 +msgid "Approve Button on Compare Revisions screen" +msgstr "Godkännknapp på jämför revisionskärmen" + +#: admin/options.php:149 +msgid "Copy revision comments to published post" +msgstr "Kopiera revisionskommentarer till publicerat inlägg" + +#: admin/options.php:150 +#, fuzzy +#| msgid "Compare Past Revisions" +msgid "Compare Past Revisions ordering:" +msgstr "Jämför tidigare versioner" + +#: admin/options.php:151 +#, php-format +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" + +#: admin/options.php:152 +msgid "On Revision publication, delete Editorial Comments" +msgstr "" + +#: admin/options.php:158 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Pending Revision is submitted" +msgid "Email designated Publishers when a %s is submitted" +msgstr "Skicka e-post till utgivare när en väntande revision skickas in" + +#: admin/options.php:159 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Scheduled Revision is published" +msgid "Email designated Publishers when a %s is published" +msgstr "Skicka e-post till utgivare när en schemalagd revision publiceras" + +#: admin/options.php:160 +#, fuzzy, php-format +#| msgid "Email designated Publishers when a Pending Revision is approved" +msgid "Email designated Publishers when a %s is approved" +msgstr "Skicka e-post till utgivare när en väntande revision godkänns" + +#: admin/options.php:162 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Pending Revision is submitted" +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" +"Skicka e-post till redaktörer och administratörer när väntande revisioner " +"skickas in" + +#: admin/options.php:163 +#, fuzzy, php-format +#| msgid "" +#| "Email Editors and Administrators when a Scheduled Revision is published" +msgid "Email Editors and Administrators when a %s is published" +msgstr "" +"Skicka e-post till redaktörer och administratörer när en schemalagd revision " +"publiceras" + +#: admin/options.php:164 +#, fuzzy, php-format +#| msgid "Email Editors and Administrators when a Pending Revision is approved" +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" +"Skicka e-post till redaktörer och administratörer när en väntande version är " +"godkänd" + +#: admin/options.php:231 +msgid "PublishPress Revisions Site Settings" +msgstr "PublishPress Revisions webbplatsinställningar" + +#: admin/options.php:261 +msgid "" +"These are the default settings for options which can be " +"adjusted per-site." +msgstr "" +"Det här är STANDARD inställningarna för alternativ som kan " +"justeras per webbplats." + +#: admin/options.php:299 +#, php-format +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" +"Du kan också specificera %1$sstandardinställningar för platsspecifika " +"inställningar%2$s." + +#: admin/options.php:300 +#, php-format +msgid "" +"Use this tab to make NETWORK-WIDE changes to PublishPress " +"Revisions settings. %s" +msgstr "" +"Använd denna tabb för att göra NÄRVERKSOMFATTANDE ändringar " +"av PublishPress Revisionsinställningar. %s" + +#: admin/options.php:302 +msgid "" +"Here you can change the default value for settings which are controlled " +"separately on each site." +msgstr "" +"Här kan du ändra standardvärdet för inställningar som styrs separat på varje " +"webbplats." + +#: admin/options.php:312 admin/options.php:314 +#, php-format +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" +"Notera att %1$s nätverksövergripande inställningar%2$s också kan komma att " +"bli tillgängliga." + +#: admin/options.php:335 +msgid "License" +msgstr "" + +#: admin/options.php:385 +msgid "Enable revisions for these Post Types:" +msgstr "" + +#: admin/options.php:431 +#, fuzzy, php-format +msgid "%s capabilities" +msgstr "%s Behörigheter" + +#: admin/options.php:445 +msgid "" +"Note: Third party code may cause some post types to be incompatible with " +"PublishPress Revisions." +msgstr "" + +#: admin/options.php:459 +msgid "" +"The user role \"Revisor\" role is now available. Include capabilities for " +"all custom post types in this role?" +msgstr "" +"Användarrollen \"Revisor\" är nu tillgänglig. Inkludera funktioner för alla " +"anpassade inläggstyper i den här rollen?" + +#: admin/options.php:464 +msgid "" +"If checked, users lacking site-wide publishing capabilities will also be " +"checked for the edit_others_drafts capability" +msgstr "" +"Om alternativet väljs kommer användare som saknar webbplatsövergripande " +"publiceringsbehörigheter även att flaggas för behörighet att ändra andras " +"utkast" + +#: admin/options.php:479 +msgid "" +"Default labels are \"Not Submitted for Approval\", \"Submitted for Approval" +"\", \"Scheduled Revision\"" +msgstr "" + +#: admin/options.php:493 +#, fuzzy +#| msgid "" +#| "This restriction applies to users who are not full editors for the post " +#| "type. To enable a role, give it the list_others_revisions capability." +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" +"Denna begränsning gäller användare som inte är fullständiga redaktörer för " +"inläggstypen. För att aktivera en roll, ge den behörighet " +"list_others_revisions." + +#: admin/options.php:498 +msgid "" +"To expand the Posts / Pages listing for non-Editors, add capabilities: " +"list_others_pages, list_published_posts, etc." +msgstr "" + +#: admin/options.php:502 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" + +#: admin/options.php:512 +#, php-format +msgid "" +"If the user does not have a regular Edit link, recaption the %s link as " +"\"Edit\"" +msgstr "" + +#: admin/options.php:534 +#, php-format +msgid "" +"Enable published content to be copied, edited, submitted for approval and " +"managed in %sRevision Queue%s." +msgstr "" + +#: admin/options.php:540 +#, fuzzy +#| msgid "" +#| "This restriction applies to users who are not full editors for the post " +#| "type. To enable a role, give it the list_others_revisions capability." +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, add capabilities: revise_posts, revise_others_pages, " +"etc." +msgstr "" +"Denna begränsning gäller användare som inte är fullständiga redaktörer för " +"inläggstypen. För att aktivera en roll, ge den behörighet " +"list_others_revisions." + +#: admin/options.php:543 admin/options.php:567 +#, fuzzy, php-format +#| msgid "When a pending revision is published, also update the publish date." +msgid "When a %s is published, update post publish date to current time." +msgstr "" +"När en pågående revision publiceras, uppdatera också publiceringsdatumet." + +#: admin/options.php:546 admin/options.php:570 +#, php-format +msgid "When a %s is published, update post modified date to current time." +msgstr "" + +#: admin/options.php:564 +msgid "" +"If a currently published post or page is edited and a future date set, the " +"change will not be applied until the selected date." +msgstr "" +"Om ett för närvarande publicerat inlägg eller sida redigeras och ett " +"framtida datum ställs in kommer ändringen inte att tillämpas förrän på det " +"valda datumet." + +#: admin/options.php:575 +msgid "" +"Publish scheduled revisions using the WP-Cron mechanism. On some sites, " +"publication will fail if this setting is disabled." +msgstr "" + +#: admin/options.php:579 +msgid "" +"Publish scheduled revisions asynchronously, via a secondary http request " +"from the server. This is usually best since it eliminates delay, but some " +"servers may not support it." +msgstr "" +"Publicera schemalagda versioner asynkront via en sekundär http-begäran från " +"servern. Detta är oftast bäst eftersom det eliminerar fördröjning, men vissa " +"servrar stöder det kanske inte." + +#: admin/options.php:596 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the edit_others_revisions capability." +msgstr "" +"Denna begränsning gäller användare som inte är fullständiga redaktörer för " +"inläggstypen. För att aktivera en roll, ge den behörigheten " +"edit_others_revisions." + +#: admin/options.php:599 +msgid "" +"This restriction applies to users who are not full editors for the post " +"type. To enable a role, give it the list_others_revisions capability." +msgstr "" +"Denna begränsning gäller användare som inte är fullständiga redaktörer för " +"inläggstypen. För att aktivera en roll, ge den behörighet " +"list_others_revisions." + +#: admin/options.php:602 +msgid "" +"Bypass the above restrictions for others' revisions to logged in user's own " +"posts." +msgstr "" + +#: admin/options.php:611 +msgid "Regenerate \"post has revision\" flags" +msgstr "" + +#: admin/options.php:626 +msgid "" +"For themes that block revision preview, hide preview links from non-" +"Administrators" +msgstr "" +"För teman som blockerar förhandsgranskning av revision, göm " +"förhandsgranskning från icke-administratörer" + +#: admin/options.php:638 +msgid "Published Post Slug" +msgstr "Publicerat inlägg slug" + +#: admin/options.php:638 +msgid "Revision Slug" +msgstr "Revision Slug" + +#: admin/options.php:638 +msgid "Revision ID only" +msgstr "Bara revision ID" + +#: admin/options.php:649 +msgid "" +"Some themes or plugins may require Revision Slug or Revision ID link type " +"for proper template loading and field display." +msgstr "" +"Vissa teman eller plugin kan kräva länktyp Revision Slug eller Revision ID " +"för korrekt mallläsning och fältvisning." + +#: admin/options.php:659 +msgid "If disabled, Compare screen links to Revision Preview for approval" +msgstr "" +"Om inaktiverad, Länkar jämförskärmen till revisionsförhandsgranskning för " +"godkännande" + +#: admin/options.php:681 +#, fuzzy, php-format +#| msgid "" +#| "For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +#| "upgrade to
    PublishPress Revisions Pro." +msgid "" +"For compatibility with Advanced Custom Fields, Beaver Builder and WPML, " +"upgrade to %sPublishPress Revisions Pro%s." +msgstr "" +"För kompatibilitet med Advanced Custom Fields, Beaver Builder och WPML, " +"uppgradera till PublishPress Revisions " +"Pro." + +#: admin/options.php:691 +msgid "This may improve compatibility with some plugins." +msgstr "Detta kan förbättra kompatibiliteten med vissa plugins." + +#: admin/options.php:710 +#, fuzzy +#| msgid "Modified Date" +msgid "Modification Date" +msgstr "Senast ändrad" + +#: admin/options.php:720 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" +"Visa beskrivande bildtexter för inställningar för PublishPress Revisions" + +#: admin/options.php:748 admin/options.php:769 +msgid "Never" +msgstr "Aldrig" + +#: admin/options.php:748 admin/options.php:769 +msgid "By default" +msgstr "Som standard" + +#: admin/options.php:748 admin/options.php:769 +msgid "Always" +msgstr "Alltid" + +#: admin/options.php:758 admin/options.php:804 +msgid "select recipients" +msgstr "välj mottagare" + +#: admin/options.php:818 +msgid "" +"To avoid notification failures, buffer emails for delayed sending once " +"minute, hour or day limits are exceeded" +msgstr "" +"För att undvika notifikationsfel kommer bufferemails bli försenade tills " +"minut., timme. eller dagsbegränsingar överskrids" + +#: admin/options.php:839 +msgid "Notification Buffer" +msgstr "Notifikationsbuffer" + +#: admin/options.php:867 +msgid "Notification Log" +msgstr "Notifikation Log" + +#: admin/options.php:896 +msgid "Purge Notification Buffer" +msgstr "Töm Notifikation Buffer" + +#: admin/options.php:902 +msgid "Truncate Notification Log" +msgstr "Avkorta aviseringslogg" + +#: admin/options.php:908 +#, php-format +msgid "Sent in last minute: %d / %d" +msgstr "Senast inskickade minuter: %d / %d" + +#: admin/options.php:909 +#, php-format +msgid "Sent in last hour: %d / %d" +msgstr "Senast inskickade timme: %d / %d" + +#: admin/options.php:910 +#, php-format +msgid "Sent in last day: %d / %d" +msgstr "Senast inskickade dag: %d / %d" + +#: admin/options.php:917 +#, php-format +msgid "Seconds until next buffer processing time: %d" +msgstr "Sekunder till nästa bufferbehandlingstid: %d" + +#: admin/options.php:926 +msgid "Show Notification Log / Buffer" +msgstr "Visa notifikations Log / Buffer" + +#: admin/options.php:928 +msgid "Show with message content" +msgstr "Visa med meddelandets innehåll" + +#: admin/options.php:939 includes/CoreAdmin.php:89 +msgid "WPML Translation Management" +msgstr "" + +#: admin/options.php:946 +msgid "Sync \"Needs Update\" flags" +msgstr "" + +#: admin/options.php:950 +msgid "" +"Set \"Needs Update\" for any post with translations which was updated " +"(possibly by revision approval) more recently than its translations." +msgstr "" + +#: admin/options.php:988 +msgid "" +"Specify which PublishPress Revisions Settings to control network-wide. " +"Unselected settings are controlled separately on each site." +msgstr "" +"Ange vilka publiceringsinställningar för PublishPress som ska kontrolleras " +"över hela nätverket. Ovalda inställningar kontrolleras separat på varje " +"webbplats." + +#: admin/options.php:998 +#, php-format +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "" + +#: admin/options.php:1034 +#, php-format +msgid "network-wide control of \"%s\"" +msgstr "nätverksövergripande kontroll av \"%s\"" + +#: admin/options.php:1064 +msgid "" +"All settings in this form (including those on unselected tabs) will be reset " +"to DEFAULTS. Are you sure?" +msgstr "" +"Alla inställningar i det här formuläret (inklusive de på ej markerade " +"flikar) kommer att återställas till STANDARD. Är du säker?" + +#: admin/post-edit_rvy.php:26 admin/post-edit_rvy.php:71 +msgid "Current Time" +msgstr "Aktuell tid" + +#: admin/post-editor-workflow-ui_rvy.php:32 +#, fuzzy +msgid "(on approval)" +msgstr "[%s] Meddelande om godkännande av revision" + +#: admin/post-editor-workflow-ui_rvy.php:48 +#: admin/post-editor-workflow-ui_rvy.php:89 +#, fuzzy +#| msgid "Preview Revision" +msgid "Preview this Revision" +msgstr "Förhandsgranska revision" + +#: admin/post-editor-workflow-ui_rvy.php:50 +msgid "View / Publish" +msgstr "Visa / Publicera" + +#: admin/post-editor-workflow-ui_rvy.php:50 +msgid "View / Approve" +msgstr "Visa / Godkänn" + +#: admin/post-editor-workflow-ui_rvy.php:53 +#, fuzzy +#| msgid "View / moderate saved revision" +msgid "View / Approve saved revision" +msgstr "Visa / moderera sparad revision" + +#: admin/post-editor-workflow-ui_rvy.php:55 +#, fuzzy +#| msgid "Preview it" +msgid "Preview / Submit" +msgstr "Förhandsgranska den" + +#: admin/post-editor-workflow-ui_rvy.php:55 +#, fuzzy +#| msgid "View / Publish" +msgid "View / Submit" +msgstr "Visa / Publicera" + +#: admin/post-editor-workflow-ui_rvy.php:56 +#, fuzzy +#| msgid "View / moderate saved revision" +msgid "View / Submit saved revision" +msgstr "Visa / moderera sparad revision" + +#: admin/post-editor-workflow-ui_rvy.php:64 +msgid "View unsaved changes" +msgstr "Visa ändringar som inte har sparats" + +#: admin/post-editor-workflow-ui_rvy.php:68 +#, fuzzy, php-format +#| msgid "Revision Edits: %s" +msgid "%s%s Revision Edit" +msgstr "Revisionsändringar: %s" + +#: admin/post-editor-workflow-ui_rvy.php:80 +msgid "Revision Submission Error" +msgstr "Fel vid inlämning av revision" + +#: admin/post-editor-workflow-ui_rvy.php:101 +#, fuzzy +#| msgid "Approve Revision" +msgid "Approving the Revision..." +msgstr "Godkänn revision" + +#: admin/post-editor-workflow-ui_rvy.php:128 rvy_init.php:299 rvy_init.php:317 +#: rvy_init.php:335 rvy_init.php:355 rvy_init.php:372 rvy_init.php:389 +#: rvy_init.php:493 +msgid "Update Revision" +msgstr "Uppdatera revision" + +#: admin/post-editor-workflow-ui_rvy.php:186 +#, fuzzy +#| msgid "Edit Revision: " +msgid "Edit Revision" +msgstr "Redigera revision:" + +#: admin/post-editor-workflow-ui_rvy.php:192 +#, php-format +msgid "Update post before creating %s." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:199 +#, fuzzy +#| msgid "Pending Revision" +msgid "Error Creating Revision" +msgstr "Väntande revision" + +#: admin/post-editor-workflow-ui_rvy.php:201 +#: admin/post-editor-workflow-ui_rvy.php:221 +msgid "Update" +msgstr "Uppdatera" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#, php-format +msgid "For custom field changes, edit a scheduled %s." +msgstr "" + +#: admin/revision-action_rvy.php:404 admin/revision-action_rvy.php:489 +#, php-format +msgid "[%s] Revision Approval Notice" +msgstr "[%s] Meddelande om godkännande av revision" + +#: admin/revision-action_rvy.php:405 +#, php-format +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "En revision till %1$s \"%2$s\" har blivit godkänd." + +#: admin/revision-action_rvy.php:408 +#, php-format +msgid "The submitter was %1$s." +msgstr "Inlämnaren var %1$s" + +#: admin/revision-action_rvy.php:412 admin/revision-action_rvy.php:494 +#, php-format +msgid "It will be published on %s" +msgstr "Den kommer att publiceras %s" + +#: admin/revision-action_rvy.php:416 admin/revision-action_rvy.php:498 +msgid "Preview it here: " +msgstr "Förhandsgranska det här:" + +#: admin/revision-action_rvy.php:419 admin/revision-action_rvy.php:501 +msgid "Editor: " +msgstr "Redaktör:" + +#: admin/revision-action_rvy.php:421 admin/revision-action_rvy.php:503 +#: admin/revision-action_rvy.php:1276 admin/revision-action_rvy.php:1301 +#: admin/revision-action_rvy.php:1363 +msgid "View it online: " +msgstr "Visa den online:" + +#: admin/revision-action_rvy.php:490 +#, php-format +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "Den revision du skickade in till %1$s \"%2$s\" har blivit godkänd." + +#: admin/revision-action_rvy.php:1272 admin/revision-action_rvy.php:1294 +#, fuzzy, php-format +#| msgid "[%s] Scheduled Revision Publication Notice" +msgid "[%s] %s Publication Notice" +msgstr "[%s] Meddelande om schemalagd revision" + +#: admin/revision-action_rvy.php:1273 +#, php-format +msgid "" +"The scheduled revision you submitted for the %1$s \"%2$s\" has been " +"published." +msgstr "" +"Den schemalagda versionen du skickade in till %1$s \"%2$s\" har blivit " +"publicerad." + +#: admin/revision-action_rvy.php:1295 +#, php-format +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "En schemalagd revision till din %1$s \"%2$s\" har blivit publicerad." + +#: admin/revision-action_rvy.php:1298 admin/revision-action_rvy.php:1360 +#, php-format +msgid "It was submitted by %1$s." +msgstr "Den blev inlämnad av %1$s." + +#: admin/revision-action_rvy.php:1355 +#, fuzzy, php-format +#| msgid "[%s] Scheduled Revision Publication" +msgid "[%s] %s Publication" +msgstr "[%s] Schemalagd revisionspublikation" + +#: admin/revision-action_rvy.php:1357 +#, php-format +msgid "A scheduled revision to the %1$s \"%2$s\" has been published." +msgstr "En schemalagd revision till %1$s \"%2$s\" har blivit publicerad." + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "Du får inte hantera ändringar." + +#: admin/revision-queue_rvy.php:14 +#, fuzzy, php-format +#| msgid "" +#| "Pending Revisions and Scheduled Revisions are both disabled. See " +#| "Revisions > Settings." +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "" +"Väntande revisioner och schemalagda revisioner är båda inaktiverade. Se " +"Revisioner > Inställningar." + +#: admin/revision-queue_rvy.php:46 +#, fuzzy, php-format +#| msgid "%s revision published." +#| msgid_plural "%s revisions published." +msgid "%s revision submitted." +msgstr "%s revision publicerad." + +#: admin/revision-queue_rvy.php:47 +#, fuzzy, php-format +#| msgid "%s revision published." +#| msgid_plural "%s revisions published." +msgid "%s revision declined." +msgstr "%s revision publicerad." + +#: admin/revision-queue_rvy.php:48 +#, fuzzy, php-format +#| msgid "%s revision approved." +#| msgid_plural "%s revisions approved." +msgid "%s revision approved." +msgstr "%s revision godkänd." + +#: admin/revision-queue_rvy.php:49 +#, fuzzy, php-format +#| msgid "%s revision unscheduled." +#| msgid_plural "%s revisions unscheduled." +msgid "%s revision unscheduled." +msgstr "%s revision oplanerad" + +#: admin/revision-queue_rvy.php:50 +#, fuzzy, php-format +#| msgid "%s revision published." +#| msgid_plural "%s revisions published." +msgid "%s revision published." +msgstr "%s revision publicerad." + +#: admin/revision-queue_rvy.php:51 +#, fuzzy, php-format +#| msgid "%s revision permanently deleted." +#| msgid_plural "%s revisions permanently deleted." +msgid "%s revision permanently deleted." +msgstr "%s revision permanent borttagen." + +#: admin/revision-queue_rvy.php:93 +#, fuzzy, php-format +#| msgctxt "Author Name" +#| msgid "%s: " +msgid "%s: " +msgstr "%s: " + +#: admin/revision-queue_rvy.php:106 +#, fuzzy, php-format +#| msgctxt "Posts / Pages / etc." +#| msgid "of %s" +msgid "of %s" +msgstr "av %s" + +#: admin/revision-queue_rvy.php:113 admin/revision-queue_rvy.php:114 +#, php-format +msgid "%sPost Author: %s" +msgstr "%sInläggsförfattare: %s" + +#: admin/revision-queue_rvy.php:121 +#, fuzzy, php-format +#| msgctxt "PublishedPostName (other filter captions)" +#| msgid "Revision Queue for \"%s\"%s" +msgid "Revision Queue for \"%s\"%s" +msgstr "Revisionskö för \"%s\"%s" + +#: admin/revision-queue_rvy.php:123 +#, php-format +msgid "Revision Queue %s" +msgstr "Revisionskö %s" + +#: admin/revision-queue_rvy.php:129 +#, fuzzy, php-format +#| msgid "Search results for “%s”" +msgid "Search results for \"%s\"" +msgstr "Söresultat för “%s”" + +#: admin/revision-queue_rvy.php:157 +msgid "Undo" +msgstr "Ångra" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "Utgivare kommer att meddelas (men kan inte väljas här)." + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "Inga e-postaviseringar kommer att skickas." + +#: admin/revision-ui_rvy.php:73 +#, fuzzy +#| msgctxt "revision date format" +#| msgid "j F, Y @ g:i a" +msgid "j F, Y @ g:i a" +msgstr "j M, Y kl: H:i" + +#: admin/revision-ui_rvy.php:92 +#, php-format +msgid "%1$s (Current)" +msgstr "%1$s (nuvarande)" + +#: admin/revision-ui_rvy.php:96 +#, php-format +msgid "%1$s (Autosave)" +msgstr "%1$s (Autospara)" + +#: admin/revision-ui_rvy.php:102 +#, fuzzy +#| msgctxt "revision schedule date format" +#| msgid "j F, Y, g:i a" +msgid "j F, Y, g:i a" +msgstr "j M, Y, H:i" + +#: admin/revision-ui_rvy.php:106 +#, php-format +msgid "" +"%1$s (Requested publication: %2$s)" +msgstr "" +"%1$s (Begärd publicering: %2$s)" + +#: admin/revision-ui_rvy.php:108 +#, php-format +msgid "" +"%1$s (Publish date: %2$s)" +msgstr "" +"%1$s (Publiceringsdatum: %2$s)" + +#: admin/revision-ui_rvy.php:260 +#, php-format +msgid "Preview “%s”" +msgstr "Förhandsgranska ”%s”" + +#: admin/revision-ui_rvy.php:276 +msgid "The revision will be deleted. Are you sure?" +msgstr "Revisionen kommer att tas bort. Är du säker?" + +#: admin/revision-ui_rvy.php:332 +#, fuzzy, php-format +#| msgctxt "post revision" +#| msgid "%1$s by %2$s" +msgid "%1$s by %2$s" +msgstr "%1$s av %2$s" + +#: admin/revision-ui_rvy.php:369 +msgid "Modified Date" +msgstr "Senast ändrad" + +#: admin/revision-ui_rvy.php:373 +msgid "Actions" +msgstr "Åtgärder" + +#: admin/revision-ui_rvy.php:390 +msgid "Bulk Actions" +msgstr "Massåtgärder" + +#: admin/revisions.php:20 +msgid "" +"Note: For visual display of revisions, add the following " +"code to foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" +"Notera: Lägg till följande kod för visuell visning av " +"versioner foliopress-wysiwyg.php:
      if " +"( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "Ingen revision specifierad." + +#: admin/revisions.php:56 +msgid "Past" +msgstr "Då" + +#: admin/revisions.php:118 +#, php-format +msgid "Revisions of %s" +msgstr "Revisioner av %s" + +#: admin/revisions.php:144 +msgid "The requested revision does not exist." +msgstr "Den begärda revisionen finns inte." + +#: admin/revisions.php:214 +msgid "Past Revisions" +msgstr "Tidigare revisioner" + +#: admin/revisions.php:227 +#, fuzzy, php-format +#| msgid "%1$s %2$s Revisions" +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "%1$s %2$s Revisioner" + +#: admin/revisions.php:247 +#, php-format +msgid "no %s revisions available." +msgstr "Inga %s revisioner tillgängliga." + +#: front_rvy.php:262 +#, fuzzy, php-format +#| msgid "View %s" +msgid "%sView Queue%s" +msgstr "Visa %s" + +#: front_rvy.php:271 +#, fuzzy, php-format +#| msgid "%sCompare%s%sView Published Post%s" +msgid "%sCompare%s%sView Published Post%s" +msgstr "%sJämför%s%sVisa Publiserat Inlägg%s" + +#: front_rvy.php:285 +#, fuzzy, php-format +#| msgid "View published post" +msgid "%sView Published Post%s" +msgstr "Visa publicerade inlägg" + +#: front_rvy.php:348 front_rvy.php:368 front_rvy.php:378 +msgid "Publish now" +msgstr "Publicera nu" + +#: front_rvy.php:352 front_rvy.php:370 +#, fuzzy, php-format +#| msgid "This is a Pending Revision. %s %s %s" +msgid "This is a %s. %s %s %s" +msgstr "" +"Det här är en väntande revision (begärt publiceringsdatum: %s). %s %s %s" + +#: front_rvy.php:364 +#, fuzzy, php-format +#| msgid "This is a Pending Revision (requested publish date: %s). %s %s %s" +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "" +"Det här är en väntande revision (begärt publiceringsdatum: %s). %s %s %s" + +#: front_rvy.php:379 +#, fuzzy, php-format +#| msgid "This is a Scheduled Revision (for publication on %s). %s %s %s" +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "Det här är en schemalagd revision (för publikation av %s). %s %s %s" + +#: front_rvy.php:391 +#, php-format +msgid "This is the Current Revision. %s" +msgstr "Det här är den aktuella revisionen. %s" + +#: front_rvy.php:397 +msgid "Restore" +msgstr "Återställ" + +#: front_rvy.php:398 +#, php-format +msgid "This is a Past Revision (from %s). %s %s" +msgstr "Det här är en gammal revision (från %s). %s %s" + +#: includes/CoreAdmin.php:74 +#, fuzzy +#| msgid "PublishPress Revisions" +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "PublishPress Revisions" + +#: includes/CoreAdmin.php:79 +msgid "Enhance the power of PublishPress Revisions with the Pro version:" +msgstr "" + +#: includes/CoreAdmin.php:82 +msgid "Elementor integration" +msgstr "" + +#: includes/CoreAdmin.php:83 +msgid "Divi Builder integration" +msgstr "" + +#: includes/CoreAdmin.php:84 +#, fuzzy +#| msgid "Beaver Builder Settings" +msgid "Beaver Builder integration" +msgstr "Beaver Builder inställningar" + +#: includes/CoreAdmin.php:85 +msgid "WooCommerce: Product Variation revisions" +msgstr "" + +#: includes/CoreAdmin.php:86 +#, fuzzy +#| msgid "Strip html tags out of difference display" +msgid "ACF custom field revision, difference display" +msgstr "Ta bort html-taggar ur jämförelsevisningen" + +#: includes/CoreAdmin.php:87 +#, fuzzy +#| msgid "Submit Revision" +msgid "Pods custom field revision" +msgstr "Skicka revision" + +#: includes/CoreAdmin.php:88 +#, fuzzy +#| msgid "Past Revisions" +msgid "WPML: translate revisions" +msgstr "Tidigare revisioner" + +#: includes/CoreAdmin.php:99 +#, fuzzy +#| msgid "PublishPress Revisions" +msgid "Need PublishPress Revisions Support?" +msgstr "PublishPress Revisions" + +#: includes/CoreAdmin.php:104 +msgid "If you need help or have a new feature request, let us know." +msgstr "" + +#: includes/CoreAdmin.php:106 +#, fuzzy +#| msgid "Requested for " +msgid "Request Support" +msgstr "Begärt för" + +#: includes/CoreAdmin.php:115 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" + +#: includes/CoreAdmin.php:117 +msgid "View Knowledge Base" +msgstr "" + +#: lib/debug.php:110 +#, php-format +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "%1$s frågor i %2$s sekunder. %3$s MB använt." + +#: revision-creation_rvy.php:172 +msgid "Could not insert revision into the database" +msgstr "Det gick inte att infoga revisionen i databasen" + +#: revision-workflow_rvy.php:157 +#, php-format +msgid "[%s] %s Updated" +msgstr "" + +#: revision-workflow_rvy.php:159 +#, php-format +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "" + +#: revision-workflow_rvy.php:161 +#, fuzzy, php-format +msgid "[%s] %s" +msgstr "Det här är en väntande revision. %s %s %s" + +#: revision-workflow_rvy.php:163 +#, php-format +msgid "" +"%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for " +"possible publication:" +msgstr "" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "Förhandsgranskning och godkännande:" + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "Revisionskö: " + +#: revision-workflow_rvy.php:176 +#, fuzzy, php-format +#| msgid "Editor: " +msgid "Edit %s: " +msgstr "Redaktör:" + +#: revisionary.php:85 +msgid "This plugin can be deleted." +msgstr "Det här pluginet kan tas bort." + +#: revisionary.php:103 revisionary.php:189 +#, php-format +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s: \"%2$s\")" +msgstr "" +"En annan kopia av PublishPress Revisions (eller Revisionary) är redan " +"aktiverad (version %1$s: \"%2$s\")" + +#: revisionary.php:105 revisionary.php:191 +#, php-format +msgid "" +"Another copy of PublishPress Revisions (or Revisionary) is already activated " +"(version %1$s)" +msgstr "" +"En annan kopia av PublishPress Revisions (eller Revisionary) är redan " +"aktiverad (version %1$s)" + +#: revisionary.php:210 +#, php-format +msgid "PublishPress Revisions requires PHP version %s or higher." +msgstr "PublishPress Revisions kräver PHP version %s eller högre." + +#: revisionary.php:217 +#, php-format +msgid "PublishPress Revisions requires WordPress version %s or higher." +msgstr "PublishPress-versioner kräver WordPress-version %s eller högre." + +#: rvy_init.php:127 +msgid "Every 2 Minutes" +msgstr "Varannan minut" + +#: rvy_init.php:289 rvy_init.php:301 +msgid "Working Copy" +msgstr "" + +#: rvy_init.php:290 +msgid "Create Working Copy" +msgstr "" + +#: rvy_init.php:292 +msgid "Creating Working Copy..." +msgstr "" + +#: rvy_init.php:293 +msgid "Working Copy ready" +msgstr "" + +#: rvy_init.php:294 rvy_init.php:312 +#, fuzzy +#| msgid "Approve saved changes" +msgid "Approve Changes" +msgstr "Godkänn sparade ändringar" + +#: rvy_init.php:296 rvy_init.php:314 +#, fuzzy +#| msgid "Approve saved changes" +msgid "Approving Changes..." +msgstr "Godkänn sparade ändringar" + +#: rvy_init.php:297 rvy_init.php:315 rvy_init.php:333 +#, fuzzy +#| msgid "Publish now" +msgid "Publish Changes" +msgstr "Publicera nu" + +#: rvy_init.php:298 rvy_init.php:316 rvy_init.php:334 rvy_init.php:354 +#: rvy_init.php:371 rvy_init.php:388 +msgid "Save Revision" +msgstr "Spara revision" + +#: rvy_init.php:300 +msgid "Working Copies" +msgstr "" + +#: rvy_init.php:307 rvy_init.php:319 +msgid "Change Request" +msgstr "" + +#: rvy_init.php:308 +msgid "Submit Change Request" +msgstr "" + +#: rvy_init.php:310 +msgid "Submitting Changes..." +msgstr "" + +#: rvy_init.php:311 +#, fuzzy +#| msgid "Submitted " +msgid "Changes Submitted" +msgstr "Inlämnad" + +#: rvy_init.php:318 +msgid "Change Requests" +msgstr "" + +#: rvy_init.php:321 +#, fuzzy +#| msgid "Enable Pending Revisions" +msgid "Enable Change Requests" +msgstr "Aktivera väntande revisioner" + +#: rvy_init.php:326 rvy_init.php:337 +#, fuzzy +#| msgid "Scheduled" +msgid "Scheduled Change" +msgstr "Schemalagd" + +#: rvy_init.php:327 rvy_init.php:328 rvy_init.php:331 rvy_init.php:332 +#, fuzzy +#| msgid "Schedule Revision" +msgid "Schedule Changes" +msgstr "Schemalägg revision" + +#: rvy_init.php:329 +msgid "Scheduling Changes..." +msgstr "" + +#: rvy_init.php:330 +#, fuzzy +#| msgid "%s revision unscheduled." +#| msgid_plural "%s revisions unscheduled." +msgid "Changes are Scheduled." +msgstr "%s revision oplanerad" + +#: rvy_init.php:336 +#, fuzzy +#| msgid "Scheduled" +msgid "Scheduled Changes" +msgstr "Schemalagd" + +#: rvy_init.php:346 +#, fuzzy +#| msgid "Submit Revision" +msgid "Unsubmitted Revision" +msgstr "Skicka revision" + +#: rvy_init.php:347 rvy_init.php:348 +#, fuzzy +#| msgid "Save Revision" +msgid "New Revision" +msgstr "Spara revision" + +#: rvy_init.php:349 +#, fuzzy +#| msgid "Pending Revision" +msgid "Creating Revision..." +msgstr "Väntande revision" + +#: rvy_init.php:350 +#, fuzzy +#| msgid "Revision updated." +msgid "The Revision is ready to edit." +msgstr "Revision uppdaterad." + +#: rvy_init.php:350 +#, fuzzy +#| msgid "Revision updated." +msgid "Revision ready to edit." +msgstr "Revision uppdaterad." + +#: rvy_init.php:351 rvy_init.php:368 rvy_init.php:385 +msgid "Approve Revision" +msgstr "Godkänn revision" + +#: rvy_init.php:353 rvy_init.php:370 rvy_init.php:387 +msgid "Publish Revision" +msgstr "Publicera revision" + +#: rvy_init.php:356 +#, fuzzy +#| msgid "Submit Revision" +msgid "Unsubmitted Revisions" +msgstr "Skicka revision" + +#: rvy_init.php:357 +#, fuzzy +#| msgid "Submitted " +msgid "Not Submitted" +msgstr "Inlämnad" + +#: rvy_init.php:363 +#, fuzzy +#| msgid "Submit Revision" +msgid "Submitted Revision" +msgstr "Skicka revision" + +#: rvy_init.php:364 rvy_init.php:496 +msgid "Submit Revision" +msgstr "Skicka revision" + +#: rvy_init.php:366 +#, fuzzy +#| msgid "Submit Revision" +msgid "Submitting Revision..." +msgstr "Skicka revision" + +#: rvy_init.php:367 +#, fuzzy +#| msgid "Revision updated." +msgid "The Revision is Submitted" +msgstr "Den revision du skickade in till %1$s \"%2$s\" har blivit godkänd." + +#: rvy_init.php:367 +#, fuzzy +#| msgid "Revision updated." +msgid "Revision Submitted" +msgstr "Revision uppdaterad." + +#: rvy_init.php:373 +#, fuzzy +#| msgid "Submit Revision" +msgid "Submitted Revisions" +msgstr "Skicka revision" + +#: rvy_init.php:374 +#, fuzzy +#| msgid "Submitted " +msgid "Submitted" +msgstr "Inlämnad" + +#: rvy_init.php:380 +msgid "Scheduled Revision" +msgstr "Schemalagd revision" + +#: rvy_init.php:381 rvy_init.php:382 +msgid "Schedule Revision" +msgstr "Schemalägg revision" + +#: rvy_init.php:383 +#, fuzzy +#| msgid "Schedule Revision" +msgid "Scheduling Revision..." +msgstr "Schemalägg revision" + +#: rvy_init.php:384 +#, fuzzy +#| msgid "%s revision unscheduled." +#| msgid_plural "%s revisions unscheduled." +msgid "The Revision is Scheduled" +msgstr "%s revision oplanerad" + +#: rvy_init.php:384 +#, fuzzy +#| msgid "%s revision unscheduled." +#| msgid_plural "%s revisions unscheduled." +msgid "Revision Scheduled" +msgstr "%s revision oplanerad" + +#: rvy_init.php:390 +msgid "Scheduled Revisions" +msgstr "Schemalagda revisioner" + +#: rvy_init.php:391 +msgid "Scheduled" +msgstr "Schemalagd" + +#: rvy_init.php:489 +msgid "Revised By" +msgstr "Reviderad av" + +#: rvy_init.php:490 +#, fuzzy +#| msgid "Revision updated." +msgid "Revision Date" +msgstr "Revision uppdaterad." + +#: rvy_init.php:491 +msgid "Post Author" +msgstr "Inläggsförfattare" + +#: rvy_init.php:492 +msgid "Published Post" +msgstr "Publicerat inlägg" + +#: rvy_init.php:497 +#, fuzzy +#| msgid "Compare Changes" +msgid "Submit Changes" +msgstr "Jämför ändringar" + +#: rvy_init.php:690 rvy_init.php:702 +msgid "Revisor" +msgstr "Revisor" + +#: rvy_init.php:1129 +msgid "Revision Workflow" +msgstr "Revisionsarbetsflöde" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:212 +msgid "" +"This plugin is outdated. You already have a more recent version installed. " +"Please remove this version." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:243 +#, php-format +msgid "" +"This plugin is not installed in the standard folder. The current path is %s " +"but it is expected to be %s." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:269 +#, php-format +msgid "" +"You have activated multiple instances of %s. Please keep only one activated " +"and remove the others." +msgstr "" + +#: vendor/publishpress/publishpress-instance-protection/core/InstanceChecker.php:289 +#, php-format +msgid "Please deactivate %s when %s is activated." +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:332 +#, php-format +msgid "" +"Hey, you've been using %1$s for %2$s on your site. We hope the plugin has " +"been useful. Please could you quickly leave a 5-star rating on WordPress." +"org? It really does help to keep %1$s growing." +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:342 +msgid "1 week" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:350 +msgid "1 month" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:361 +msgid "3 months" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:615 +#, php-format +msgid "Click here to add your rating for %s" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:621 +msgid "Maybe later" +msgstr "" + +#: vendor/publishpress/wordpress-reviews/ReviewsController.php:626 +msgid "I already did" +msgstr "" + +#: vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php:129 +msgid "Amazing! We are redirecting you to our site..." +msgstr "" + +#~ msgid "Your modification has been saved." +#~ msgstr "Din ändring har sparats." + +#~ msgid "Regenerate revision storage flags (for Revision Queue listing)" +#~ msgstr "Återskapa lagringsflaggor för revision (för listning i revisionskö)" + +#~ msgid "%sView Published Post%s" +#~ msgstr "%sVisa Publiserat Inlägg%s" + +#~ msgid "Schedule for: %s" +#~ msgstr "Schemalägg för: %s" + +#~ msgid "Published on: %s" +#~ msgstr "Publicerad den: %s" + +#~ msgctxt "MonthName 4-DigitYear" +#~ msgid "%1$s %2$d" +#~ msgstr "%1$s %2$d" + +#~ msgctxt "User role" +#~ msgid "Revisor" +#~ msgstr "Revisor" + +#~ msgid "%sMy Published Posts%s(%s)" +#~ msgstr "%sMina publicerade inlägg%s(%s)" + +#~ msgid "Prevent Revisors from viewing others' revisions" +#~ msgstr "Förhindra att revisorer tittar på andras versioner" + +#~ msgid "Reload" +#~ msgstr "Ladda om" + +#~ msgid "" +#~ "This revision is very new, preview may not be synchronized with theme." +#~ msgstr "" +#~ "Denna version är väldigt ny, förhandsgranskningen kanske inte " +#~ "synkroniseras med temat." + +#~ msgid "" +#~ " %s Scheduled " +#~ "Revision" +#~ msgid_plural "" +#~ " %s Scheduled " +#~ "Revisions" +#~ msgstr[0] "" +#~ " %s Schemalagd " +#~ "revision" +#~ msgstr[1] "" +#~ " %s Schemalagda " +#~ "revisioner" + +#~ msgid "" +#~ " %s Pending Revision" +#~ msgid_plural "" +#~ " %s Pending Revisions" +#~ msgstr[0] "" +#~ " %s Väntande Revision" +#~ msgstr[1] "" +#~ " %s Väntande " +#~ "Revisioner" + +#~ msgid "Do not schedule current changes yet, but save to Revision Queue" +#~ msgstr "Planera inte aktuella ändringar ännu, men spara i Revisionskön" + +#~ msgid "" +#~ " %s Revision Edit" +#~ msgid_plural "" +#~ " %s Revision Edits" +#~ msgstr[0] "" +#~ " %s " +#~ "Revisionsändring" +#~ msgstr[1] "" +#~ " %s " +#~ "Revisionsändringar" + +#~ msgid "All dates" +#~ msgstr "Alla datum" + +#~ msgid "Filter by date" +#~ msgstr "Filtrera på datum" + +#~ msgid "%sMy Revisions%s(%s)" +#~ msgstr "%sMina revisioner%s(%s)" + +#~ msgid "Submission" +#~ msgstr "Inlämmning" + +#~ msgid "%s, Sticky" +#~ msgstr "%s, Klistrat" + +#~ msgid "Public" +#~ msgstr "Publik" + +#~ msgid "Public, Sticky" +#~ msgstr "Publik, Klistrad" + +#~ msgid "Visibility:" +#~ msgstr "Synlighet:" + +#~ msgid "Cancel" +#~ msgstr "Avbryt" + +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "Preview Changes" +#~ msgstr "Förhandsgranska ändringar" + +#~ msgid "Save" +#~ msgstr "Spara" + +#~ msgid "Save as %s" +#~ msgstr "Spara som %s" + +#~ msgid "Your site is configured to keep only the last %s revisions." +#~ msgstr "" +#~ "Din webbplats är konfigurerad för att bara behålla de senaste %s " +#~ "revisionerna." + +#~ msgid "Revisions: %s" +#~ msgstr "Revisioner: %s" + +#~ msgid "" +#~ "Revisionary is now PublishPress Revisions! Note the new " +#~ "Revisions menu and %sRevision Queue%s screen, where Pending and Scheduled " +#~ "Revisions are listed. %s" +#~ msgstr "" +#~ "Revisionary är nu PublishPress Revisions! Notera den nya " +#~ "Revisions menyn och %srevisionskö%s skärmen, där väntande och schemalagda " +#~ "revisioner är listade. %s" + +#~ msgid "" +#~ "Welcome to PublishPress Revisions! Here's how it " +#~ "works:%s
  • \"Contributors\" can submit revisions to their published " +#~ "posts.
  • \"Revisors\" can submit revisions to posts and pages " +#~ "published by others.
  • \"Authors\", \"Editors\" and \"Administrators" +#~ "\" can approve revisions or schedule their own revisions.
  • %s%s%s" +#~ msgstr "" +#~ "Välkommen till PublishPress Revisions! Såhär fungerar " +#~ "det:%s
  • \"Medverkande\" kan spara revisioner på sina egna publicerade " +#~ "inlägg.
  • \"Revisorer\" kan spara revisioner på inlägg och sidor " +#~ "som and har publicerat.
  • \"Författare\", \"Redaktörer\" and " +#~ "\"Administratorer\" kan godkänna revisioner eller schemalägga deras egna " +#~ "revisioner.
  • %s%s%s" + +#~ msgid "" +#~ "For more details on setting up PublishPress Revisions, %sread this guide" +#~ "%s." +#~ msgstr "" +#~ "För mer detaljer om hur du konfigurerar PublishPress Revisions, %släs " +#~ "denna guide%s." + +#~ msgid "%sPending Revisions: %s" +#~ msgstr "%sVäntande revisioner: %s" + +#~ msgid "%sScheduled Revisions: %s" +#~ msgstr "%sSchemalagda revisioner: %s" + +#~ msgid "Edit %s Revision" +#~ msgstr "Ändra %s revision" + +#~ msgid "%1$s %2$s Revision" +#~ msgstr "%1$s %2$s Revision" + +#~ msgid "" +#~ "Enable Contributors to submit revisions to their own published content. " +#~ "Revisors and users who have the edit_others (but not edit_published) " +#~ "capability for the post type can submit revisions to other user's " +#~ "content. These Pending Revisions are listed in %sRevision Queue%s." +#~ msgstr "" +#~ "Gör det möjligt för medverkande att spara ändringar på sitt eget " +#~ "publicerade innehåll. Revisorer och användare som har ”redigera " +#~ "andras” (men inte ”redigera publicerat”) för posttypen kan spara " +#~ "ändringar till andra användares innehåll. Dessa väntande versioner listas " +#~ "i %sRevisionskön%s." + +#~ msgid "Enable Scheduled Revisions" +#~ msgstr "Aktivera schemalagda revisioner" + +#~ msgid "Contact the PublishPress team" +#~ msgstr "Kontakta PublishPress-teamet" + +#~ msgid "PublishPress Revisions Documentation" +#~ msgstr "PublishPress Revisions Dokumentation" + +#~ msgid "About PublishPress Revisions" +#~ msgstr "Om PublishPress Revisions" + +#~ msgid "Do not publish current changes yet, but save to Revision Queue" +#~ msgstr "Publicera inte aktuella ändringar ännu, men spara i Revisionskön" + +#~ msgid "Save as Pending Revision" +#~ msgstr "Spara som väntande revision" + +#~ msgid "Invalid page template." +#~ msgstr "Ogiltig sidmall." + +#~ msgid "Invalid taxonomy: %s" +#~ msgstr "Ogiltig taxonomi: %s" + +#~ msgid "Revision Scheduling Error" +#~ msgstr "fel vid schemaläggning av revision" + +#~ msgid "Sorry, an error occurred while attempting to schedule your revision!" +#~ msgstr "Tyvärr uppstod ett fel när du försökte schemlägga din revision!" + +#~ msgid "Sorry, an error occurred while attempting to submit your revision!" +#~ msgstr "Tyvärr uppstod ett fel när du försökte skicka in din revision!" + +#~ msgid "Invalid featured media ID." +#~ msgstr "Ogiltigt media-ID." + +#~ msgid "View Revision Queue" +#~ msgstr "Visa revisionskö" + +#~ msgid "Keep editing the revision" +#~ msgstr "Forsätt redigera revisionen" + +#~ msgid "Scheduled (%s)" +#~ msgid_plural "Scheduled (%s)" +#~ msgstr[0] "Schemalagd (%s)" +#~ msgstr[1] "Schemalagd (%s)" + +#~ msgid "Pending (%s)" +#~ msgid_plural "Pending (%s)" +#~ msgstr[0] "Väntande (%s)" +#~ msgstr[1] "Väntande (%s)" + +#~ msgid "Pending" +#~ msgstr "Väntande" + +#~ msgid "" +#~ "Maintain published content with teamwork and precision using the " +#~ "Revisions model to submit, approve and schedule changes." +#~ msgstr "" +#~ "Underhåll publicerat innehåll med lagarbete och precision med hjälp av " +#~ "Revisionsmodellen för att skicka, godkänna och schemalägga ändringar." + +#~ msgid "https://publishpress.com/revisionary/" +#~ msgstr "https://publishpress.com/revisionary/" + +#~ msgid "Scheduled Revision Created" +#~ msgstr "Schemalagd revision skapad" + +#~ msgid "Pending Revision Created" +#~ msgstr "Väntade revision skapad" + +#~ msgid "" +#~ "Autosave disabled when editing a published post/page to create a pending " +#~ "revision." +#~ msgstr "" +#~ "Autoinaktiveras när du redigerar en publicerad post / sida för att skapa " +#~ "en pågående revision." + +#~ msgid "Return to Edit %s" +#~ msgstr "Gå tillbaka till redigering %s" + +#~ msgid "Return to Edit Pages" +#~ msgstr "Gå tillbaka till redigering av sidor" + +#~ msgid "Return to Edit Posts" +#~ msgstr "Gå tillbaka till redigering av inlägg" + +#~ msgid "Go back to submit another revision" +#~ msgstr "Gå tillbaka för att skicka ytterligare en revision" + +#~ msgid "It will be published when an editor approves it." +#~ msgstr "Den kommer att publiceras när en redaktör godkänner det." + +#~ msgid "" +#~ "If approved by an editor, it will be published on the date you specified." +#~ msgstr "" +#~ "Om den godkänns av en redaktör kommer den att publiceras på det datum du " +#~ "angav." + +#~ msgid "Your modification has been saved for editorial review." +#~ msgstr "Din ändring har sparats för redaktionell granskning." + +#~ msgid "Go back to schedule another revision" +#~ msgstr "Gå tillbaka för att planera en ny version" + +#~ msgid "Your modification was saved as a Scheduled Revision." +#~ msgstr "Din ändring sparades som en schemalagd revision." + +#~ msgid "Sorry, an error occurred while attempting to save your revision." +#~ msgstr "Tyvärr, ett fel uppstod när du försökte spara din revision." + +#~ msgid "A pending revision to the %1$s \"%2$s\" has been submitted." +#~ msgstr "En väntande version till den %1$s \"%2$s\" har blivit inskickad." + +#~ msgid "[%s] Pending Revision Notification" +#~ msgstr "[%s] Väntande revisionsmeddelande" + +#~ msgid "Dismiss" +#~ msgstr "Avfärda" + +#~ msgid "Apply" +#~ msgstr "Verkställ" + +#~ msgid "Revert to Defaults" +#~ msgstr "Återställ till standardvärden" + +#~ msgctxt "option_tabname (explanatory note)" +#~ msgid "%1$s (%2$s)" +#~ msgstr "%1$s (%2$s)" + +#~ msgid "" +#~ "Note: \"by default\" means Pending Revision creators can customize email " +#~ "notification recipients before submitting. For more flexibility in " +#~ "moderation and notification, install the %1$s PressPermit Pro%2$s plugin." +#~ msgstr "" +#~ "Notera: \"som standard\" betyder att väntande revision skapare kan " +#~ "anpassa mottagare av e-postmeddelanden innan de skickar in. För mer " +#~ "flexibilitet i moderering och anmälan, installera %1$s PressPermit Pro " +#~ "%2$s plugin." + +#~ msgid "" +#~ "Note: \"by default\" means Pending Revision creators can customize email " +#~ "notification recipients before submitting. Eligibile \"Publisher\" email " +#~ "recipients are members of the Pending Revision Monitors group who " +#~ "also have the ability to publish the revision. If not " +#~ "explicitly defined, the Monitors group is all users with a primary WP " +#~ "role of Administrator or Editor." +#~ msgstr "" +#~ "Notera: \"som standard\" betyder att väntande revision skapare kan " +#~ "anpassa mottagare av e-postmeddelanden innan de skickar in. Berättigad " +#~ "\"Utgivare\" e-postmottagare är medlemmar i gruppen Väntande " +#~ "revisionsövervakare som också har möjlighet att " +#~ "publicera revisionen. Om den inte uttryckligen definieras är gruppen " +#~ "Monitors alla användare med en primär WP-roll som administratör eller " +#~ "redaktör." + +#~ msgid "" +#~ "When a scheduled revision is published, also update the publish date." +#~ msgstr "" +#~ "När en schemalagd revision publiceras, uppdatera också " +#~ "publiceringsdatumet." + +#~ msgid "Update »" +#~ msgstr "Uppdatera »" + +#~ msgid "Prevent Revisors from editing others' revisions" +#~ msgstr "Förhindra att revisorer redigerar andra revisioner" + +#~ msgid "Email Notification" +#~ msgstr "Epostnotifieringar" + +#~ msgid "Role Definition" +#~ msgstr "Rolldefinition" + +#~ msgid "Enter additional User Names or IDs (comma-separate)" +#~ msgstr "Ange ytterligare användarnamn eller ID (kommaseparat)" + +#~ msgid "%1$s (%2$s)" +#~ msgstr "%1$s (%2$s)" + +#~ msgid "Publishers to Notify of Your Revision" +#~ msgstr "Förläggare att meddela om din revision" + +#~ msgid "Pending Revisions" +#~ msgstr "Väntande revisioner" + +#~ msgid "Submit Scheduled Revision" +#~ msgstr "Skicka schemalagd revision" + +#~ msgid "Workflow…" +#~ msgstr "Arbetsflöde..." + +#~ msgid "%s (revision)" +#~ msgstr "%s (revision)" + +#~ msgid "https://publishpress.com" +#~ msgstr "https://publishpress.com" + +#~ msgid "PublishPress" +#~ msgstr "PublishPress" diff --git a/wp-content/plugins/revisionary/languages/revisionary.pot b/wp-content/plugins/revisionary/languages/revisionary.pot new file mode 100644 index 000000000..bb654764b --- /dev/null +++ b/wp-content/plugins/revisionary/languages/revisionary.pot @@ -0,0 +1,1743 @@ +# Copyright (C) 2024 PublishPress +# This file is distributed under the same license as the PublishPress Revisions plugin. +msgid "" +msgstr "" +"Project-Id-Version: PublishPress Revisions 3.5.8.2\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/project\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2024-04-25T15:59:38+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.8.1\n" +"X-Domain: revisionary\n" + +#. Plugin Name of the plugin +msgid "PublishPress Revisions" +msgstr "" + +#. Plugin URI of the plugin +msgid "https://publishpress.com/revisionary/" +msgstr "" + +#. Description of the plugin +msgid "Maintain published content with teamwork and precision using the Revisions model to submit, approve and schedule changes." +msgstr "" + +#. Author of the plugin +msgid "PublishPress" +msgstr "" + +#. Author URI of the plugin +msgid "https://publishpress.com" +msgstr "" + +#: admin/admin-init_rvy.php:105 +#: admin/admin-init_rvy.php:335 +msgid "Sorry, you are not allowed to delete this revision." +msgstr "" + +#: admin/admin-init_rvy.php:192 +#: admin/admin-init_rvy.php:306 +msgid "Sorry, you are not allowed to approve this revision." +msgstr "" + +#: admin/admin-init_rvy.php:233 +msgid "Sorry, you are not allowed to submit this revision." +msgstr "" + +#: admin/admin-init_rvy.php:271 +msgid "Sorry, you are not allowed to decline this revision." +msgstr "" + +#: admin/admin-posts_rvy.php:55 +msgid "The revision was restored." +msgstr "" + +#: admin/admin-posts_rvy.php:60 +msgid "The revision was scheduled for publication." +msgstr "" + +#: admin/admin-posts_rvy.php:65 +msgid "The revision was published." +msgstr "" + +#: admin/admin-posts_rvy.php:142 +#: admin/class-list-table-archive.php:425 +#: rvy_init-functions.php:453 +msgid "Revision" +msgstr "" + +#: admin/admin-posts_rvy.php:159 +msgid "Has Revision" +msgstr "" + +#: admin/admin-posts_rvy.php:174 +#: admin/admin_rvy.php:274 +msgid "Revision Queue" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:10 +#: admin/options.php:235 +msgid "PublishPress Revisions Network Settings" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:10 +msgid "Network Settings" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:21 +#: admin/options.php:237 +msgid "PublishPress Revisions Network Defaults" +msgstr "" + +#: admin/admin_lib-mu_rvy.php:21 +msgid "Network Defaults" +msgstr "" + +#: admin/admin_rvy.php:121 +msgid "Scheduled Revisions are not available because WP-Cron is disabled on this site. See %sRevisions > Settings > Scheduled Revisions%s." +msgstr "" + +#: admin/admin_rvy.php:199 +msgctxt "groups per page (screen options)" +msgid "Revisions" +msgstr "" + +#: admin/admin_rvy.php:238 +msgid "Revisions" +msgstr "" + +#: admin/admin_rvy.php:283 +#: admin/admin_rvy.php:284 +#: admin/revision-archive_rvy.php:80 +msgid "Revision Archive" +msgstr "" + +#: admin/admin_rvy.php:299 +#: admin/options.php:241 +msgid "PublishPress Revisions Settings" +msgstr "" + +#: admin/admin_rvy.php:299 +#: admin/options.php:92 +msgid "Settings" +msgstr "" + +#: admin/admin_rvy.php:306 +#: admin/admin_rvy.php:307 +#: includes/CoreAdmin.php:93 +msgid "Upgrade to Pro" +msgstr "" + +#: admin/admin_rvy.php:384 +msgid "If you like %s, please leave us a %s rating. Thank you!" +msgstr "" + +#: admin/admin_rvy.php:395 +msgid "About" +msgstr "" + +#: admin/admin_rvy.php:397 +msgid "Documentation" +msgstr "" + +#: admin/admin_rvy.php:399 +msgid "Contact" +msgstr "" + +#: admin/agents_checklist_rvy.php:75 +msgid "show current users (%d)" +msgstr "" + +#: admin/agents_checklist_rvy.php:77 +msgid "show eligible users (%d)" +msgstr "" + +#: admin/agents_checklist_rvy.php:86 +msgid "filter:" +msgstr "" + +#: admin/agents_checklist_rvy.php:102 +msgid "select" +msgstr "" + +#: admin/agents_checklist_rvy.php:110 +msgid "unselect" +msgstr "" + +#: admin/class-list-table-archive.php:157 +msgid "Revision Author: %s" +msgstr "" + +#: admin/class-list-table-archive.php:174 +msgid "Post Author: %s" +msgstr "" + +#: admin/class-list-table-archive.php:197 +msgid "Search results for \"%s\"" +msgstr "" + +#: admin/class-list-table-archive.php:385 +#: admin/class-list-table_rvy.php:1050 +#: admin/class-list-table_rvy.php:1317 +#: admin/post-edit-block-ui_rvy.php:94 +#: admin/post-edit_rvy.php:52 +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Delete Revision" +msgstr "" + +#: admin/class-list-table-archive.php:426 +msgid "Count" +msgstr "" + +#: admin/class-list-table-archive.php:427 +#: admin/class-list-table_rvy.php:548 +msgid "Post Type" +msgstr "" + +#: admin/class-list-table-archive.php:428 +#: rvy_init-functions.php:454 +msgid "Revised By" +msgstr "" + +#: admin/class-list-table-archive.php:429 +#: rvy_init-functions.php:455 +msgid "Revision Date" +msgstr "" + +#: admin/class-list-table-archive.php:430 +msgid "Method" +msgstr "" + +#: admin/class-list-table-archive.php:431 +msgid "Approved By" +msgstr "" + +#: admin/class-list-table-archive.php:432 +msgid "Published Date" +msgstr "" + +#: admin/class-list-table-archive.php:433 +msgid "Published Author" +msgstr "" + +#: admin/class-list-table-archive.php:461 +msgid "just now" +msgstr "" + +#: admin/class-list-table-archive.php:464 +msgid "%s minutes ago" +msgstr "" + +#: admin/class-list-table-archive.php:469 +msgid "%s hours ago" +msgstr "" + +#: admin/class-list-table-archive.php:511 +msgid "Revisions are disabled for %s post type" +msgstr "" + +#: admin/class-list-table-archive.php:566 +#: admin/class-list-table-archive.php:571 +msgid "Submitted Rev." +msgstr "" + +#: admin/class-list-table-archive.php:573 +msgid "Direct Edit" +msgstr "" + +#: admin/class-list-table-archive.php:634 +msgid "Reset Filters" +msgstr "" + +#: admin/class-list-table-archive.php:657 +msgid "All post types" +msgstr "" + +#: admin/class-list-table-archive.php:693 +msgid "All" +msgstr "" + +#: admin/class-list-table-archive.php:707 +msgid "My Revisions" +msgstr "" + +#: admin/class-list-table-archive.php:752 +msgid "Compare Changes in %s" +msgstr "" + +#: admin/class-list-table-archive.php:756 +#: admin/class-list-table_rvy.php:1358 +#: admin/edit-revision-classic-ui_rvy.php:92 +#: admin/post-edit_rvy.php:178 +#: admin/post-edit_rvy.php:192 +msgctxt "revisions" +msgid "Compare" +msgstr "" + +#. translators: %s: post title +#: admin/class-list-table-archive.php:771 +#: admin/class-list-table_rvy.php:1342 +#: admin/post-editor-workflow-ui_rvy.php:199 +msgid "Preview Revision" +msgstr "" + +#: admin/class-list-table-archive.php:783 +msgid "List Revisions of this Post" +msgstr "" + +#: admin/class-list-table-archive.php:784 +msgid "Filter" +msgstr "" + +#: admin/class-list-table-archive.php:796 +msgid "Delete Past Revision" +msgstr "" + +#: admin/class-list-table-archive.php:882 +msgid "No revisions found." +msgstr "" + +#: admin/class-list-table_rvy.php:547 +#: admin/post-editor-workflow-ui_rvy.php:31 +msgid "Status" +msgstr "" + +#: admin/class-list-table_rvy.php:601 +#: admin/class-list-table_rvy.php:1224 +msgid "Y/m/d g:i:s a" +msgstr "" + +#: admin/class-list-table_rvy.php:611 +#: admin/class-list-table_rvy.php:1232 +msgid "Y/m/d g:i a" +msgstr "" + +#: admin/class-list-table_rvy.php:618 +msgid "Scheduled publication: %s" +msgstr "" + +#: admin/class-list-table_rvy.php:621 +msgid "Requested publication: %s" +msgstr "" + +#: admin/class-list-table_rvy.php:666 +#: admin/history_rvy.php:786 +msgid "No author" +msgstr "" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:708 +msgid "View only revisions of %s" +msgstr "" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:720 +#: admin/class-list-table_rvy.php:728 +msgid "View published post" +msgstr "" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:752 +msgid "Compare Past Revisions" +msgstr "" + +#: admin/class-list-table_rvy.php:753 +msgid "History" +msgstr "" + +#: admin/class-list-table_rvy.php:1006 +msgid "My Activity" +msgstr "" + +#: admin/class-list-table_rvy.php:1014 +msgid "All %s" +msgstr "" + +#: admin/class-list-table_rvy.php:1046 +msgid "Unschedule" +msgstr "" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1050 +#: admin/class-list-table_rvy.php:1313 +#: admin/post-edit-block-ui_rvy.php:94 +#: admin/post-edit_rvy.php:52 +#: admin/RevisionEditSubmitMetabox.php:62 +msgid "Discard Revision" +msgstr "" + +#. translators: %s: post title +#: admin/class-list-table_rvy.php:1357 +msgid "Compare Changes" +msgstr "" + +#: admin/class-list-table_rvy.php:1366 +msgctxt "revisions" +msgid "Decline" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:63 +msgid "Publish on approval" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:93 +msgid "Compare this revision to published copy, or to other revisions" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:106 +msgid "Revision updated. %sView Preview%s" +msgstr "" + +#: admin/edit-revision-classic-ui_rvy.php:108 +msgid "Revision updated." +msgstr "" + +#: admin/history_rvy.php:191 +msgid "Compare %s of \"%s\"" +msgstr "" + +#: admin/history_rvy.php:535 +#: admin/options.php:767 +msgid "Post Date" +msgstr "" + +#: admin/history_rvy.php:536 +msgid "Post Parent" +msgstr "" + +#: admin/history_rvy.php:537 +msgid "Menu Order" +msgstr "" + +#: admin/history_rvy.php:538 +msgid "Comment Status" +msgstr "" + +#: admin/history_rvy.php:539 +msgid "Ping Status" +msgstr "" + +#: admin/history_rvy.php:674 +msgid "Page Template" +msgstr "" + +#: admin/history_rvy.php:677 +msgid "Featured Image" +msgstr "" + +#: admin/history_rvy.php:681 +msgid "Beaver Builder Data" +msgstr "" + +#: admin/history_rvy.php:682 +msgid "Beaver Builder Settings" +msgstr "" + +#: admin/history_rvy.php:914 +msgid "Scheduled for " +msgstr "" + +#: admin/history_rvy.php:919 +msgid "Requested for " +msgstr "" + +#: admin/history_rvy.php:924 +msgid "Modified " +msgstr "" + +#: admin/history_rvy.php:929 +msgid "%s%s from now" +msgstr "" + +#: admin/history_rvy.php:940 +msgid "M j, Y @ g:i a" +msgstr "" + +#: admin/history_rvy.php:985 +msgid "M j, Y @ H:i" +msgstr "" + +#: admin/history_rvy.php:986 +msgctxt "revision date short format" +msgid "j M @ H:i" +msgstr "" + +#: admin/history_rvy.php:1072 +#: front_rvy.php:479 +#: front_rvy.php:504 +#: rvy_init-functions.php:260 +#: rvy_init-functions.php:278 +#: rvy_init-functions.php:317 +#: rvy_init-functions.php:334 +#: rvy_init-functions.php:351 +msgid "Approve" +msgstr "" + +#: admin/history_rvy.php:1072 +msgid "Preview / Approve" +msgstr "" + +#: admin/history_rvy.php:1074 +#: admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +#: admin/post-editor-workflow-ui_rvy.php:199 +#: admin/RevisionEditSubmitMetabox.php:123 +msgid "Preview" +msgstr "" + +#: admin/history_rvy.php:1168 +msgid "Preview / Restore" +msgstr "" + +#: admin/history_rvy.php:1175 +msgid "Manage" +msgstr "" + +#: admin/history_rvy.php:1176 +msgid "List" +msgstr "" + +#: admin/options.php:92 +msgid "Setting Scope" +msgstr "" + +#: admin/options.php:96 +msgid "Post Types" +msgstr "" + +#: admin/options.php:97 +msgid "Revisors" +msgstr "" + +#: admin/options.php:98 +msgid "Statuses" +msgstr "" + +#: admin/options.php:99 +msgid "Revision Creation" +msgstr "" + +#: admin/options.php:100 +#: admin/options.php:111 +msgid "Revision Submission" +msgstr "" + +#: admin/options.php:102 +msgid "Queue" +msgstr "" + +#: admin/options.php:103 +msgid "Preview / Approval" +msgstr "" + +#: admin/options.php:104 +msgid "Options" +msgstr "" + +#: admin/options.php:105 +msgid "Notifications" +msgstr "" + +#: admin/options.php:117 +msgid "Use alternate labeling: \"Working Copy\" > \"Change Request\" > \"Scheduled Change\"" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a Working Copy" +msgstr "" + +#: admin/options.php:119 +msgid "Additional role capability required to create a new revision" +msgstr "" + +#: admin/options.php:121 +#: admin/options.php:124 +msgid "Enable %s" +msgstr "" + +#: admin/options.php:122 +msgid "Limit to one active revision per post" +msgstr "" + +#: admin/options.php:123 +msgid "Auto-submit revisions created by a user with publishing capability" +msgstr "" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a Change Request" +msgstr "" + +#: admin/options.php:125 +msgid "Additional role capability required to submit a revision" +msgstr "" + +#: admin/options.php:126 +msgid "Editing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:127 +msgid "Listing others' revisions requires role capability" +msgstr "" + +#: admin/options.php:128 +msgid "Users can always administer revisions to their own editable posts" +msgstr "" + +#: admin/options.php:129 +msgid "Also notify on Revision Update" +msgstr "" + +#: admin/options.php:130 +msgid "Revision Publication: API actions to mimic Post Update" +msgstr "" + +#: admin/options.php:131 +msgid "Hide html tags on Compare Revisions screen" +msgstr "" + +#: admin/options.php:132 +msgid "Use WP-Cron scheduling" +msgstr "" + +#: admin/options.php:133 +msgid "Site uses a custom trigger for WP-Cron tasks" +msgstr "" + +#: admin/options.php:134 +msgid "Asynchronous Publishing" +msgstr "" + +#: admin/options.php:135 +#: admin/options.php:136 +msgid "Update Publish Date" +msgstr "" + +#: admin/options.php:137 +#: admin/options.php:138 +msgid "Update Modified Date" +msgstr "" + +#: admin/options.php:139 +msgid "Email original Author when a %s is submitted" +msgstr "" + +#: admin/options.php:140 +msgid "Email the original Author when a %s is approved" +msgstr "" + +#: admin/options.php:141 +msgid "Email the Revisor when a %s is approved" +msgstr "" + +#: admin/options.php:142 +msgid "Email the original Author when a %s is published" +msgstr "" + +#: admin/options.php:143 +msgid "Email the Revisor when a %s is published" +msgstr "" + +#: admin/options.php:144 +msgid "Enable notification buffer" +msgstr "" + +#: admin/options.php:145 +msgid "All custom post types available to Revisors" +msgstr "" + +#: admin/options.php:146 +msgid "Prevent Revisors from editing other user's drafts" +msgstr "" + +#: admin/options.php:148 +msgid "Show Preview Links" +msgstr "" + +#: admin/options.php:149 +msgid "Preview Link Type" +msgstr "" + +#: admin/options.php:150 +msgid "Modify preview link for better theme compatibility" +msgstr "" + +#: admin/options.php:151 +msgid "Extra preview button in Gutenberg Editor top bar" +msgstr "" + +#: admin/options.php:152 +msgid "Theme Compat: For front page revision preview, set home flag" +msgstr "" + +#: admin/options.php:153 +msgid "Approve Button on Compare Revisions screen" +msgstr "" + +#: admin/options.php:154 +msgid "Copy revision comments to published post" +msgstr "" + +#: admin/options.php:156 +msgid "Include %s in My Activity, Revisions to My Posts views" +msgstr "" + +#: admin/options.php:157 +msgid "On Revision publication, delete Editorial Comments" +msgstr "" + +#: admin/options.php:158 +msgid "Enable deletion queue" +msgstr "" + +#: admin/options.php:159 +msgid "Enable deletion in Revision Archive" +msgstr "" + +#: admin/options.php:160 +msgid "Revision Restore: Non-Administrators need capability" +msgstr "" + +#: admin/options.php:166 +msgid "Email designated Publishers when a %s is submitted" +msgstr "" + +#: admin/options.php:167 +msgid "Email designated Publishers when a %s is published" +msgstr "" + +#: admin/options.php:168 +msgid "Email designated Publishers when a %s is approved" +msgstr "" + +#: admin/options.php:170 +msgid "Email Editors and Administrators when a %s is submitted" +msgstr "" + +#: admin/options.php:171 +msgid "Email Editors and Administrators when a %s is published" +msgstr "" + +#: admin/options.php:172 +msgid "Email Editors and Administrators when a %s is approved" +msgstr "" + +#: admin/options.php:239 +msgid "PublishPress Revisions Site Settings" +msgstr "" + +#: admin/options.php:269 +msgid "These are the default settings for options which can be adjusted per-site." +msgstr "" + +#: admin/options.php:307 +msgid "Use this tab to make NETWORK-WIDE changes to PublishPress Revisions settings. %s" +msgstr "" + +#: admin/options.php:310 +msgid "You can also specify %1$sdefaults for site-specific settings%2$s." +msgstr "" + +#: admin/options.php:313 +msgid "Here you can change the default value for settings which are controlled separately on each site." +msgstr "" + +#: admin/options.php:323 +#: admin/options.php:325 +msgid "Note that %1$s network-wide settings%2$s may also be available." +msgstr "" + +#: admin/options.php:350 +msgid "License" +msgstr "" + +#: admin/options.php:403 +msgid "Enable revision submission for these Post Types:" +msgstr "" + +#: admin/options.php:463 +msgid "Note: Third party code may cause some post types to be incompatible with PublishPress Revisions." +msgstr "" + +#: admin/options.php:477 +msgid "The user role \"Revisor\" role is now available. Include capabilities for all custom post types in this role?" +msgstr "" + +#: admin/options.php:482 +msgid "If checked, users lacking site-wide publishing capabilities will also be checked for the edit_others_drafts capability" +msgstr "" + +#: admin/options.php:497 +msgid "Default labels are \"Not Submitted for Approval\", \"Submitted for Approval\", \"Scheduled Revision\"" +msgstr "" + +#: admin/options.php:511 +msgid "This restriction applies to users who are not full editors for the post type. To enable a role, add capabilities: copy_posts, copy_others_pages, etc." +msgstr "" + +#: admin/options.php:516 +msgid "To expand the Posts / Pages listing for non-Editors, add capabilities: list_others_pages, list_published_posts, etc." +msgstr "" + +#: admin/options.php:520 +msgid "To enable a role, add the manage_unsubmitted_revisions capability" +msgstr "" + +#: admin/options.php:537 +msgid "If the user does not have a regular Edit link, recaption the %s link as \"Edit\"" +msgstr "" + +#: admin/options.php:559 +msgid "Enable published content to be copied, edited, submitted for approval and managed in %sRevision Queue%s." +msgstr "" + +#: admin/options.php:565 +msgid "This restriction applies to users who are not full editors for the post type. To enable a role, add capabilities: revise_posts, revise_others_pages, etc." +msgstr "" + +#: admin/options.php:568 +#: admin/options.php:592 +msgid "When a %s is published, update post publish date to current time." +msgstr "" + +#: admin/options.php:571 +#: admin/options.php:595 +msgid "When a %s is published, update post modified date to current time." +msgstr "" + +#: admin/options.php:589 +msgid "If a currently published post or page is edited and a future date set, the change will not be applied until the selected date." +msgstr "" + +#: admin/options.php:600 +msgid "Publish scheduled revisions using the WP-Cron mechanism. On some sites, publication will fail if this setting is disabled." +msgstr "" + +#: admin/options.php:604 +msgid "Publish scheduled revisions asynchronously, via a secondary http request from the server. This is usually best since it eliminates delay, but some servers may not support it." +msgstr "" + +#: admin/options.php:609 +msgid "The WP-Cron trigger is disabled, but scheduled tasks are still excecuted using a custom trigger." +msgstr "" + +#: admin/options.php:626 +msgid "This restriction applies to users who are not full editors for the post type. To enable a role, give it the edit_others_revisions capability." +msgstr "" + +#: admin/options.php:629 +msgid "This restriction applies to users who are not full editors for the post type. To enable a role, give it the list_others_revisions capability." +msgstr "" + +#: admin/options.php:632 +msgid "Bypass the above restrictions for others' revisions to logged in user's own posts." +msgstr "" + +#: admin/options.php:641 +msgid "Regenerate \"post has revision\" flags" +msgstr "" + +#: admin/options.php:656 +msgid "For themes that block revision preview, hide preview links from non-Administrators." +msgstr "" + +#: admin/options.php:668 +msgid "Published Post Slug" +msgstr "" + +#: admin/options.php:668 +msgid "Revision Slug" +msgstr "" + +#: admin/options.php:668 +msgid "Revision ID only" +msgstr "" + +#: admin/options.php:679 +msgid "Some themes or plugins may require Revision Slug or Revision ID link type for proper template loading and field display." +msgstr "" + +#: admin/options.php:688 +msgid "The revision preview argument is configured by constant definition: %s" +msgstr "" + +#: admin/options.php:695 +msgid "Adjust preview links to use \"rv_preview\" argument instead of \"preview\". Experiment to see which works best with your theme." +msgstr "" + +#: admin/options.php:704 +msgid "Some themes may require this setting for correct revision preview display." +msgstr "" + +#: admin/options.php:710 +msgid "If disabled, Compare screen links to Revision Preview for approval." +msgstr "" + +#: admin/options.php:738 +msgid "For compatibility with Advanced Custom Fields, Beaver Builder and WPML, upgrade to %sPublishPress Revisions Pro%s." +msgstr "" + +#: admin/options.php:748 +msgid "This may improve compatibility with some plugins." +msgstr "" + +#: admin/options.php:767 +msgid "Modification Date" +msgstr "" + +#: admin/options.php:777 +msgid "Show descriptive captions for PublishPress Revisions settings" +msgstr "" + +#: admin/options.php:791 +msgid "Non-Administrators cannot restore a revision without the restore_revisions capability" +msgstr "" + +#: admin/options.php:813 +#: admin/options.php:834 +msgid "Never" +msgstr "" + +#: admin/options.php:813 +#: admin/options.php:834 +msgid "By default" +msgstr "" + +#: admin/options.php:813 +#: admin/options.php:834 +msgid "Always" +msgstr "" + +#: admin/options.php:823 +#: admin/options.php:869 +msgid "select recipients" +msgstr "" + +#: admin/options.php:883 +msgid "To avoid notification failures, buffer emails for delayed sending once minute, hour or day limits are exceeded" +msgstr "" + +#: admin/options.php:904 +msgid "Notification Buffer" +msgstr "" + +#: admin/options.php:932 +msgid "Notification Log" +msgstr "" + +#: admin/options.php:961 +msgid "Purge Notification Buffer" +msgstr "" + +#: admin/options.php:967 +msgid "Truncate Notification Log" +msgstr "" + +#: admin/options.php:973 +msgid "Sent in last minute: %d / %d" +msgstr "" + +#: admin/options.php:974 +msgid "Sent in last hour: %d / %d" +msgstr "" + +#: admin/options.php:975 +msgid "Sent in last day: %d / %d" +msgstr "" + +#: admin/options.php:982 +msgid "Seconds until next buffer processing time: %d" +msgstr "" + +#: admin/options.php:992 +msgid "Show Notification Log / Buffer" +msgstr "" + +#: admin/options.php:994 +msgid "Show with message content" +msgstr "" + +#: admin/options.php:1005 +#: includes/CoreAdmin.php:88 +msgid "WPML Translation Management" +msgstr "" + +#: admin/options.php:1012 +msgid "Sync \"Needs Update\" flags" +msgstr "" + +#: admin/options.php:1016 +msgid "Set \"Needs Update\" for any post with translations which was updated (possibly by revision approval) more recently than its translations." +msgstr "" + +#: admin/options.php:1054 +msgid "Specify which PublishPress Revisions Settings to control network-wide. Unselected settings are controlled separately on each site." +msgstr "" + +#: admin/options.php:1064 +msgctxt "opentag option_tabname closetag (explanatory note)" +msgid "%1$s%2$s%3$s (%4$s)" +msgstr "" + +#: admin/options.php:1100 +msgid "network-wide control of \"%s\"" +msgstr "" + +#: admin/options.php:1130 +msgid "All settings in this form (including those on unselected tabs) will be reset to DEFAULTS. Are you sure?" +msgstr "" + +#: admin/post-edit-block-ui_rvy.php:149 +#: admin/post-edit_rvy.php:263 +msgid "Author" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:35 +msgid "(on approval)" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:53 +#: admin/post-editor-workflow-ui_rvy.php:103 +msgid "Preview this Revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Publish" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:55 +msgid "View / Approve" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:59 +#: admin/post-editor-workflow-ui_rvy.php:67 +#: admin/post-edit_rvy.php:153 +msgid "View saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:62 +msgid "View / Moderate saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:70 +msgid "View / Submit saved revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:79 +msgid "View unsaved changes" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:83 +msgid "%s%s Revision Edit" +msgid_plural "%s%s Revision Edits" +msgstr[0] "" +msgstr[1] "" + +#: admin/post-editor-workflow-ui_rvy.php:94 +msgid "Revision Submission Error" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:108 +#: admin/post-editor-workflow-ui_rvy.php:200 +#: front_rvy.php:437 +msgid "Edit" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:115 +msgid "Approving the Revision..." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:142 +#: rvy_init-functions.php:264 +#: rvy_init-functions.php:282 +#: rvy_init-functions.php:300 +#: rvy_init-functions.php:320 +#: rvy_init-functions.php:337 +#: rvy_init-functions.php:354 +#: rvy_init-functions.php:458 +msgid "Update Revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:200 +msgid "Edit Revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:206 +msgid "Update post before creating %s." +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:213 +msgid "Error Creating Revision" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:215 +#: admin/post-editor-workflow-ui_rvy.php:235 +msgid "Update" +msgstr "" + +#: admin/post-editor-workflow-ui_rvy.php:229 +msgid "For custom field changes, edit a scheduled %s." +msgstr "" + +#: admin/post-edit_rvy.php:27 +#: admin/post-edit_rvy.php:85 +msgid "Current Time" +msgstr "" + +#: admin/post-edit_rvy.php:111 +msgid "View revision in progress" +msgstr "" + +#: admin/post-edit_rvy.php:150 +msgid "View / moderate saved revision" +msgstr "" + +#: admin/revision-action_rvy.php:421 +#: admin/revision-action_rvy.php:507 +msgid "[%s] Revision Approval Notice" +msgstr "" + +#: admin/revision-action_rvy.php:422 +msgid "A revision to the %1$s \"%2$s\" has been approved." +msgstr "" + +#: admin/revision-action_rvy.php:426 +msgid "The submitter was %1$s." +msgstr "" + +#: admin/revision-action_rvy.php:430 +#: admin/revision-action_rvy.php:512 +msgid "It will be published on %s" +msgstr "" + +#: admin/revision-action_rvy.php:434 +#: admin/revision-action_rvy.php:516 +msgid "Preview it here: " +msgstr "" + +#: admin/revision-action_rvy.php:437 +#: admin/revision-action_rvy.php:519 +msgid "Editor: " +msgstr "" + +#: admin/revision-action_rvy.php:439 +#: admin/revision-action_rvy.php:521 +#: admin/revision-action_rvy.php:1352 +#: admin/revision-action_rvy.php:1377 +#: admin/revision-action_rvy.php:1439 +msgid "View it online: " +msgstr "" + +#: admin/revision-action_rvy.php:508 +msgid "The revision you submitted for the %1$s \"%2$s\" has been approved." +msgstr "" + +#: admin/revision-action_rvy.php:1348 +#: admin/revision-action_rvy.php:1370 +msgid "[%s] %s Publication Notice" +msgstr "" + +#: admin/revision-action_rvy.php:1349 +msgid "The scheduled revision you submitted for the %1$s \"%2$s\" has been published." +msgstr "" + +#: admin/revision-action_rvy.php:1371 +msgid "A scheduled revision to your %1$s \"%2$s\" has been published." +msgstr "" + +#: admin/revision-archive_rvy.php:11 +msgid "Revision for:" +msgstr "" + +#: admin/revision-queue_rvy.php:9 +msgid "You are not allowed to manage revisions." +msgstr "" + +#: admin/revision-queue_rvy.php:13 +msgid "%s and %s are both disabled. See Revisions > Settings." +msgstr "" + +#: admin/revision-queue_rvy.php:46 +msgid "%s revision submitted." +msgid_plural "%s revisions submitted." +msgstr[0] "" +msgstr[1] "" + +#: admin/revision-queue_rvy.php:47 +msgid "%s revision declined." +msgid_plural "%s revisions declined." +msgstr[0] "" +msgstr[1] "" + +#: admin/revision-queue_rvy.php:48 +msgid "%s revision approved." +msgid_plural "%s revisions approved." +msgstr[0] "" +msgstr[1] "" + +#: admin/revision-queue_rvy.php:49 +msgid "%s revision unscheduled." +msgid_plural "%s revisions unscheduled." +msgstr[0] "" +msgstr[1] "" + +#: admin/revision-queue_rvy.php:50 +msgid "%s revision published." +msgid_plural "%s revisions published." +msgstr[0] "" +msgstr[1] "" + +#: admin/revision-queue_rvy.php:93 +msgctxt "Author Name" +msgid "%s: " +msgstr "" + +#: admin/revision-queue_rvy.php:106 +msgctxt "Posts / Pages / etc." +msgid "of %s" +msgstr "" + +#: admin/revision-queue_rvy.php:113 +#: admin/revision-queue_rvy.php:114 +msgid "%sPost Author: %s" +msgstr "" + +#: admin/revision-queue_rvy.php:121 +msgctxt "PublishedPostName (other filter captions)" +msgid "Revision Queue for \"%s\"%s" +msgstr "" + +#: admin/revision-queue_rvy.php:123 +msgid "Revision Queue %s" +msgstr "" + +#: admin/revision-ui_rvy.php:40 +msgid "Publishers will be notified (but cannot be selected here)." +msgstr "" + +#: admin/revision-ui_rvy.php:42 +msgid "No email notifications will be sent." +msgstr "" + +#. translators: revision date format, see http://php.net/date +#: admin/revision-ui_rvy.php:73 +msgctxt "revision date format" +msgid "j F, Y @ g:i a" +msgstr "" + +#: admin/revision-ui_rvy.php:92 +msgid "%1$s (Current)" +msgstr "" + +#: admin/revision-ui_rvy.php:96 +msgid "%1$s (Autosave)" +msgstr "" + +#: admin/revision-ui_rvy.php:102 +msgctxt "revision schedule date format" +msgid "j F, Y, g:i a" +msgstr "" + +#: admin/revision-ui_rvy.php:106 +msgid "%1$s (Requested publication: %2$s)" +msgstr "" + +#: admin/revision-ui_rvy.php:108 +msgid "%1$s (Publish date: %2$s)" +msgstr "" + +#: admin/revision-ui_rvy.php:277 +msgid "The revision will be deleted. Are you sure?" +msgstr "" + +#: admin/revision-ui_rvy.php:370 +msgid "Modified Date" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:124 +msgid "Preview revision in progress" +msgstr "" + +#. translators: Publish box date formt, see http://php.net/date +#: admin/RevisionEditSubmitMetabox.php:180 +msgid "M j, Y @ G:i" +msgstr "" + +#: admin/RevisionEditSubmitMetabox.php:191 +msgid "Publish %son approval%s" +msgstr "" + +#: admin/revisions.php:20 +msgid "Note: For visual display of revisions, add the following code to foliopress-wysiwyg.php:
      if ( strpos( $_SERVER['REQUEST_URI'], 'admin.php?page=rvy-revisions' ) ) return;" +msgstr "" + +#: admin/revisions.php:50 +msgid "No revision specified." +msgstr "" + +#: admin/revisions.php:56 +msgid "Past" +msgstr "" + +#: admin/revisions.php:119 +msgid "Revisions of %s" +msgstr "" + +#: admin/revisions.php:149 +msgid "The requested revision does not exist." +msgstr "" + +#: admin/revisions.php:219 +msgid "Past Revisions" +msgstr "" + +#: admin/revisions.php:235 +msgid "%1$s %2$s (%3$s)%4$s" +msgstr "" + +#: admin/revisions.php:256 +msgid "no %s revisions available." +msgstr "" + +#: front_rvy.php:403 +msgid "%sView Queue%s" +msgstr "" + +#: front_rvy.php:412 +msgid "%sCompare%s%sView Published Post%s" +msgstr "" + +#: front_rvy.php:426 +msgid "%sView Published Post%s" +msgstr "" + +#: front_rvy.php:482 +#: rvy_init-functions.php:274 +#: rvy_init-functions.php:330 +msgid "Submit" +msgstr "" + +#: front_rvy.php:489 +#: front_rvy.php:525 +#: front_rvy.php:541 +msgid "Publish now" +msgstr "" + +#: front_rvy.php:494 +#: front_rvy.php:496 +#: front_rvy.php:529 +#: front_rvy.php:531 +msgid "This is a %s. %s %s %s" +msgstr "" + +#: front_rvy.php:508 +msgid "Decline" +msgstr "" + +#: front_rvy.php:518 +#: front_rvy.php:520 +msgid "This is a %s (requested publish date: %s). %s %s %s" +msgstr "" + +#: front_rvy.php:544 +#: front_rvy.php:546 +msgid "This is a %s (for publication on %s). %s %s %s" +msgstr "" + +#: front_rvy.php:561 +#: front_rvy.php:563 +msgid "This is the Current Revision. %s" +msgstr "" + +#: front_rvy.php:575 +msgid "Restore" +msgstr "" + +#: front_rvy.php:579 +#: front_rvy.php:581 +msgid "This is a Past Revision (from %s). %s %s" +msgstr "" + +#: includes/CoreAdmin.php:73 +msgid "Upgrade to PublishPress Revisions Pro" +msgstr "" + +#: includes/CoreAdmin.php:78 +msgid "Upgrade to PublishPress Revisions Pro for integration with key features of these plugins:" +msgstr "" + +#: includes/CoreAdmin.php:81 +msgid "Elementor" +msgstr "" + +#: includes/CoreAdmin.php:82 +msgid "Divi Builder" +msgstr "" + +#: includes/CoreAdmin.php:83 +msgid "Beaver Builder" +msgstr "" + +#: includes/CoreAdmin.php:84 +msgid "Advanced Custom Fields" +msgstr "" + +#: includes/CoreAdmin.php:85 +msgid "Pods" +msgstr "" + +#: includes/CoreAdmin.php:86 +msgid "WooCommerce" +msgstr "" + +#: includes/CoreAdmin.php:87 +msgid "WPML" +msgstr "" + +#: includes/CoreAdmin.php:89 +msgid "plugin integration details..." +msgstr "" + +#: includes/CoreAdmin.php:100 +msgid "Need PublishPress Revisions Support?" +msgstr "" + +#: includes/CoreAdmin.php:105 +msgid "If you need help or have a new feature request, let us know." +msgstr "" + +#: includes/CoreAdmin.php:107 +msgid "Request Support" +msgstr "" + +#: includes/CoreAdmin.php:116 +msgid "Detailed documentation is also available on the plugin website." +msgstr "" + +#: includes/CoreAdmin.php:118 +msgid "View Knowledge Base" +msgstr "" + +#: lib/debug.php:110 +msgid "%1$s queries in %2$s seconds. %3$s MB used." +msgstr "" + +#: revision-creation_rvy.php:185 +msgid "Could not insert revision into the database" +msgstr "" + +#: revision-workflow_rvy.php:157 +msgid "[%s] %s Updated" +msgstr "" + +#: revision-workflow_rvy.php:159 +msgid "%1$s updated a %2$s of the %3$s \"%4$s\"." +msgstr "" + +#: revision-workflow_rvy.php:161 +msgid "[%s] %s" +msgstr "" + +#: revision-workflow_rvy.php:163 +msgid "%1$s submitted changes to the %2$s \"%3$s\". You can review the changes for possible publication:" +msgstr "" + +#: revision-workflow_rvy.php:171 +msgid "Preview and Approval: " +msgstr "" + +#: revision-workflow_rvy.php:174 +msgid "Revision Queue: " +msgstr "" + +#: revision-workflow_rvy.php:176 +msgid "Edit %s: " +msgstr "" + +#: revisionary.php:120 +msgid "This plugin can be deleted." +msgstr "" + +#: rvy_init-functions.php:77 +msgid "Every 2 Minutes" +msgstr "" + +#: rvy_init-functions.php:254 +#: rvy_init-functions.php:266 +msgid "Working Copy" +msgstr "" + +#: rvy_init-functions.php:255 +msgid "Create Working Copy" +msgstr "" + +#: rvy_init-functions.php:256 +msgid "Copy" +msgstr "" + +#: rvy_init-functions.php:257 +msgid "Creating Working Copy..." +msgstr "" + +#: rvy_init-functions.php:258 +msgid "Working Copy ready" +msgstr "" + +#: rvy_init-functions.php:259 +#: rvy_init-functions.php:277 +msgid "Approve Changes" +msgstr "" + +#: rvy_init-functions.php:261 +#: rvy_init-functions.php:279 +msgid "Approving Changes..." +msgstr "" + +#: rvy_init-functions.php:262 +#: rvy_init-functions.php:280 +#: rvy_init-functions.php:298 +msgid "Publish Changes" +msgstr "" + +#: rvy_init-functions.php:263 +#: rvy_init-functions.php:281 +#: rvy_init-functions.php:299 +#: rvy_init-functions.php:319 +#: rvy_init-functions.php:336 +#: rvy_init-functions.php:353 +msgid "Save Revision" +msgstr "" + +#: rvy_init-functions.php:265 +msgid "Working Copies" +msgstr "" + +#: rvy_init-functions.php:267 +msgid "Working Copies (%d)" +msgid_plural "Working Copies (%d)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:272 +#: rvy_init-functions.php:284 +msgid "Change Request" +msgstr "" + +#: rvy_init-functions.php:273 +msgid "Submit Change Request" +msgstr "" + +#: rvy_init-functions.php:275 +msgid "Submitting Changes..." +msgstr "" + +#: rvy_init-functions.php:276 +msgid "Changes Submitted" +msgstr "" + +#: rvy_init-functions.php:283 +msgid "Change Requests" +msgstr "" + +#: rvy_init-functions.php:285 +msgid "Change Requests (%d)" +msgid_plural "Change Requests (%d)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:286 +msgid "Enable Change Requests" +msgstr "" + +#: rvy_init-functions.php:291 +#: rvy_init-functions.php:302 +msgid "Scheduled Change" +msgstr "" + +#: rvy_init-functions.php:292 +#: rvy_init-functions.php:293 +#: rvy_init-functions.php:296 +#: rvy_init-functions.php:297 +msgid "Schedule Changes" +msgstr "" + +#: rvy_init-functions.php:294 +msgid "Scheduling Changes..." +msgstr "" + +#: rvy_init-functions.php:295 +msgid "Changes are Scheduled." +msgstr "" + +#: rvy_init-functions.php:301 +msgid "Scheduled Changes" +msgstr "" + +#: rvy_init-functions.php:303 +msgid "Scheduled Changes (%d)" +msgid_plural "Scheduled Changes (%d)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:311 +msgid "Unsubmitted Revision" +msgstr "" + +#: rvy_init-functions.php:312 +#: rvy_init-functions.php:313 +msgid "New Revision" +msgstr "" + +#: rvy_init-functions.php:314 +msgid "Creating Revision..." +msgstr "" + +#: rvy_init-functions.php:315 +msgid "The Revision is ready to edit." +msgstr "" + +#: rvy_init-functions.php:315 +msgid "Revision ready to edit." +msgstr "" + +#: rvy_init-functions.php:316 +#: rvy_init-functions.php:333 +#: rvy_init-functions.php:350 +msgid "Approve Revision" +msgstr "" + +#: rvy_init-functions.php:318 +#: rvy_init-functions.php:335 +#: rvy_init-functions.php:352 +msgid "Publish Revision" +msgstr "" + +#: rvy_init-functions.php:321 +msgid "Unsubmitted Revisions" +msgstr "" + +#: rvy_init-functions.php:322 +msgid "Not Submitted" +msgstr "" + +#: rvy_init-functions.php:323 +msgid "Not Submitted for Approval (%s)" +msgid_plural "Not Submitted for Approval (%s)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:328 +msgid "Submitted Revision" +msgstr "" + +#: rvy_init-functions.php:329 +#: rvy_init-functions.php:461 +msgid "Submit Revision" +msgstr "" + +#: rvy_init-functions.php:331 +msgid "Submitting Revision..." +msgstr "" + +#: rvy_init-functions.php:332 +msgid "The Revision is Submitted" +msgstr "" + +#: rvy_init-functions.php:332 +msgid "Revision Submitted" +msgstr "" + +#: rvy_init-functions.php:338 +msgid "Submitted Revisions" +msgstr "" + +#: rvy_init-functions.php:339 +msgid "Submitted" +msgstr "" + +#: rvy_init-functions.php:340 +msgid "Submitted for Approval (%s)" +msgid_plural "Submitted for Approval (%s)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:345 +msgid "Scheduled Revision" +msgstr "" + +#: rvy_init-functions.php:346 +#: rvy_init-functions.php:347 +msgid "Schedule Revision" +msgstr "" + +#: rvy_init-functions.php:348 +msgid "Scheduling Revision..." +msgstr "" + +#: rvy_init-functions.php:349 +msgid "The Revision is Scheduled" +msgstr "" + +#: rvy_init-functions.php:349 +msgid "Revision Scheduled" +msgstr "" + +#: rvy_init-functions.php:355 +msgid "Scheduled Revisions" +msgstr "" + +#: rvy_init-functions.php:356 +msgid "Scheduled" +msgstr "" + +#: rvy_init-functions.php:357 +msgid "Scheduled Revision (%s)" +msgid_plural "Scheduled Revisions (%s)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:448 +msgid "%sMy Copies & Changes%s(%s)
    " +msgid_plural "%sMy Copies & Changes%s(%s)
    " +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:449 +msgid "%sMy Revisions%s(%s)
    " +msgid_plural "%sMy Revisions%s(%s)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:451 +msgid "%sRevisions to My Posts%s(%s)" +msgid_plural "%sRevisions to My Posts%s(%s)" +msgstr[0] "" +msgstr[1] "" + +#: rvy_init-functions.php:456 +msgid "Post Author" +msgstr "" + +#: rvy_init-functions.php:457 +msgid "Published Post" +msgstr "" + +#: rvy_init-functions.php:462 +msgid "Submit Changes" +msgstr "" + +#: rvy_init-functions.php:663 +msgid "Revisor" +msgstr "" + +#: rvy_init-functions.php:675 +msgctxt "User role" +msgid "Revisor" +msgstr "" + +#: rvy_init-functions.php:1154 +msgid "Revision Workflow" +msgstr "" diff --git a/wp-content/plugins/revisionary/lib/agapetry_wp_admin_lib.php b/wp-content/plugins/revisionary/lib/agapetry_wp_admin_lib.php new file mode 100644 index 000000000..60318c637 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/agapetry_wp_admin_lib.php @@ -0,0 +1,13 @@ +base_prefix ) && ( $wpdb->base_prefix != $wpdb->prefix ) ) ); +} +} + +// returns true GMT timestamp +if ( ! function_exists('agp_time_gmt') ) { +function agp_time_gmt() { + return strtotime( gmdate("Y-m-d H:i:s") ); +} +} + +// date_i18n does not support pre-1970 dates +if ( ! function_exists('agp_date_i18n') ) { +function agp_date_i18n( $datef, $timestamp ) { + if ( $timestamp >= 0 ) + return date_i18n( $datef, $timestamp ); + else + return date( $datef, $timestamp ); +} +} + +// legacy support for obsolete wrapper function +if ( ! function_exists('agp_user_can') ) { +function agp_user_can($reqd_caps, $object_id = 0, $user_id = 0, $args = array() ) { + return current_user_can($reqd_caps, $object_id); +} +} + +if ( ! function_exists('awp_post_type_from_uri') ) { +function awp_post_type_from_uri() { + if (!empty($_SERVER['SCRIPT_NAME'])) { + $script_name = esc_url_raw($_SERVER['SCRIPT_NAME']); + } else { + $script_name = ''; + } + + if ( strpos( $script_name, 'post-new.php' ) || strpos( $script_name, 'edit.php' ) ) { + $object_type = ! empty( $_GET['post_type'] ) ? sanitize_key($_GET['post_type']) : 'post'; + + } elseif ( ! empty( $_GET['post'] ) ) { // post.php + if ( $_post = get_post((int) $_GET['post'] ) ) + $object_type = $_post->post_type; + } + + if ( ! empty($object_type) ) + return $object_type; + else { + global $post; + if ( ! empty($post->post_type) ) + return $post->post_type; + else + return 'post'; + } +} +} + +// wrapper for __(), prevents WP strings from being forced into plugin .po +if ( ! function_exists( '__awp' ) ) { +function __awp( $string, $unused = '' ) { + return esc_html__( $string ); +} +} diff --git a/wp-content/plugins/revisionary/lib/debug.php b/wp-content/plugins/revisionary/lib/debug.php new file mode 100644 index 000000000..2d55725a4 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/debug.php @@ -0,0 +1,121 @@ +add_notice( $msg ); + } + } + + function add_notice( $body, $args = array() ) { + if ( ! $this->notices ) { + add_action( 'all_admin_notices', array( &$this, 'do_notices'), 5 ); + } + + $this->notices[]= (object) array_merge( compact( 'body' ), $args ); + } + + function do_notices() { + foreach( $this->notices as $msg ) { + $style = ( ! empty( $msg->style ) ) ? $msg->style : "color:black"; + $class = ( ! empty( $msg->class ) ) ? $msg->class : ''; + echo "
    " . $msg->body . '
    '; + } + } +} // end class diff --git a/wp-content/plugins/revisionary/lib/vendor/autoload.php b/wp-content/plugins/revisionary/lib/vendor/autoload.php new file mode 100644 index 000000000..a72cc7e09 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/autoload.php @@ -0,0 +1,25 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/InstalledVersions.php b/wp-content/plugins/revisionary/lib/vendor/composer/InstalledVersions.php new file mode 100644 index 000000000..51e734a77 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/LICENSE b/wp-content/plugins/revisionary/lib/vendor/composer/LICENSE new file mode 100644 index 000000000..f27399a04 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/autoload_classmap.php b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_classmap.php new file mode 100644 index 000000000..0fb0a2c19 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/autoload_files.php b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_files.php new file mode 100644 index 000000000..736be8d0e --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_files.php @@ -0,0 +1,13 @@ + $vendorDir . '/publishpress/psr-container/lib/include.php', + '24b27b1b9a32bf58eda571c3e5ae3480' => $vendorDir . '/publishpress/pimple-pimple/lib/include.php', + '41c664bd04a95c2d6a2f2a3e00f06593' => $vendorDir . '/publishpress/wordpress-reviews/ReviewsController.php', + 'a61bc28a742b9f9f2fd5ef4d2d1e2037' => $vendorDir . '/publishpress/wordpress-version-notices/src/include.php', +); diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/autoload_namespaces.php b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_namespaces.php new file mode 100644 index 000000000..15a2ff3ad --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ +register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInitRevisionary::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/autoload_static.php b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_static.php new file mode 100644 index 000000000..8069c5435 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/autoload_static.php @@ -0,0 +1,27 @@ + __DIR__ . '/..' . '/publishpress/psr-container/lib/include.php', + '24b27b1b9a32bf58eda571c3e5ae3480' => __DIR__ . '/..' . '/publishpress/pimple-pimple/lib/include.php', + '41c664bd04a95c2d6a2f2a3e00f06593' => __DIR__ . '/..' . '/publishpress/wordpress-reviews/ReviewsController.php', + 'a61bc28a742b9f9f2fd5ef4d2d1e2037' => __DIR__ . '/..' . '/publishpress/wordpress-version-notices/src/include.php', + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->classMap = ComposerStaticInitRevisionary::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/installed.json b/wp-content/plugins/revisionary/lib/vendor/composer/installed.json new file mode 100644 index 000000000..108c6b889 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/installed.json @@ -0,0 +1,390 @@ +{ + "packages": [ + { + "name": "publishpress/instance-protection", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/publishpress/library-instance-protection.git", + "reference": "4193f84a8a680bf4c0d40cc64976ddcadd92158a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/publishpress/library-instance-protection/zipball/4193f84a8a680bf4c0d40cc64976ddcadd92158a", + "reference": "4193f84a8a680bf4c0d40cc64976ddcadd92158a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "time": "2023-04-18T17:50:38+00:00", + "type": "library", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "PublishPress", + "email": "help@publishpress.com" + } + ], + "description": "Library for protecting WordPress plugins to run twice.", + "homepage": "http://publishpress.com/", + "keywords": [ + "wordpress plugin" + ], + "support": { + "issues": "https://github.com/publishpress/library-instance-protection/issues", + "source": "https://github.com/publishpress/library-instance-protection/tree/2.0.1" + }, + "install-path": "../publishpress/instance-protection" + }, + { + "name": "publishpress/pimple-pimple", + "version": "3.5.0.10", + "version_normalized": "3.5.0.10", + "source": { + "type": "git", + "url": "https://github.com/publishpress/library-pimple-pimple.git", + "reference": "f2784f4b1ccaf195b373a46a74cf3742e7c9f826" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/publishpress/library-pimple-pimple/zipball/f2784f4b1ccaf195b373a46a74cf3742e7c9f826", + "reference": "f2784f4b1ccaf195b373a46a74cf3742e7c9f826", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "publishpress/psr-container": "^2.0.1.10" + }, + "require-dev": { + "brianhenryie/strauss": "^0.14.0", + "codeception/module-asserts": "^1.0", + "codeception/module-cli": "^1.0", + "codeception/module-db": "^1.0", + "codeception/module-filesystem": "^1.0", + "codeception/module-phpbrowser": "^1.0", + "codeception/module-webdriver": "^1.0", + "codeception/util-universalframework": "^1.0", + "lucatume/wp-browser": "^3.1", + "pimple/pimple": "3.5.0", + "publishpress/codeception-extension-extended-copier": "^1.0", + "publishpress/version-loader-generator": "^1.0" + }, + "time": "2023-05-30T18:41:10+00:00", + "type": "library", + "extra": { + "generator": { + "lib-class-test": "class_exists('PublishPress\\Pimple\\Container')", + "action-initialize-priority": "-185", + "action-register-priority": "-200" + }, + "strauss": { + "target_directory": "lib", + "namespace_prefix": "PublishPress\\", + "classmap_prefix": "PublishPress_", + "constant_prefix": "PUBLISHPRESS_", + "include_author": "true", + "classmap_output": "true", + "packages": [ + "pimple/pimple", + "psr/container" + ], + "override_autoload": [], + "exclude_from_copy": { + "packages": [], + "namespaces": [], + "file_patterns": [] + }, + "exclude_from_prefix": { + "packages": [], + "namespaces": [], + "file_patterns": [] + }, + "namespace_replacement_patterns": [], + "delete_vendor_packages": true, + "delete_vendor_files": true + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "PublishPress", + "email": "help@publishpress.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container, prefixed for PublishPress", + "homepage": "https://github.com/silexphp/Pimple/", + "keywords": [ + "container", + "dependency injection", + "publishpress" + ], + "support": { + "issues": "https://github.com/publishpress/library-pimple-pimple/issues", + "source": "https://github.com/publishpress/library-pimple-pimple/tree/3.5.0.10" + }, + "install-path": "../publishpress/pimple-pimple" + }, + { + "name": "publishpress/psr-container", + "version": "2.0.1.10", + "version_normalized": "2.0.1.10", + "source": { + "type": "git", + "url": "https://github.com/publishpress/library-psr-container.git", + "reference": "4ccd2cb058e7b93e96186791ca25870a02e35c5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/publishpress/library-psr-container/zipball/4ccd2cb058e7b93e96186791ca25870a02e35c5d", + "reference": "4ccd2cb058e7b93e96186791ca25870a02e35c5d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "require-dev": { + "brianhenryie/strauss": "^0.14.0", + "codeception/module-asserts": "^1.0", + "codeception/module-cli": "^1.0", + "codeception/module-db": "^1.0", + "codeception/module-filesystem": "^1.0", + "codeception/module-phpbrowser": "^1.0", + "codeception/module-webdriver": "^1.0", + "codeception/util-universalframework": "^1.0", + "lucatume/wp-browser": "^3.1", + "psr/container": "2.0.1", + "publishpress/codeception-extension-extended-copier": "^1.0", + "publishpress/version-loader-generator": "^1.0" + }, + "time": "2023-05-30T18:17:45+00:00", + "type": "library", + "extra": { + "generator": { + "lib-class-test": "interface_exists('PublishPress\\Psr\\Container\\ContainerInterface')", + "action-initialize-priority": "-190", + "action-register-priority": "-200" + }, + "strauss": { + "target_directory": "lib", + "namespace_prefix": "PublishPress\\", + "classmap_prefix": "PublishPress_", + "constant_prefix": "PUBLISHPRESS_", + "include_author": "true", + "classmap_output": "true", + "packages": [ + "psr/container" + ], + "override_autoload": [], + "exclude_from_copy": { + "packages": [], + "namespaces": [], + "file_patterns": [] + }, + "exclude_from_prefix": { + "packages": [], + "namespaces": [], + "file_patterns": [] + }, + "namespace_replacement_patterns": [], + "delete_vendor_packages": true, + "delete_vendor_files": true + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + }, + { + "name": "PublishPress", + "email": "help@publishpress.com" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11), prefixed for PublishPress plugins", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr", + "publishpress" + ], + "support": { + "issues": "https://github.com/publishpress/library-psr-container/issues", + "source": "https://github.com/publishpress/library-psr-container/tree/2.0.1.10" + }, + "install-path": "../publishpress/psr-container" + }, + { + "name": "publishpress/wordpress-reviews", + "version": "v1.1.20", + "version_normalized": "1.1.20.0", + "source": { + "type": "git", + "url": "https://github.com/publishpress/library-wordpress-reviews.git", + "reference": "6d0b687a66439721b0432ef1320fd818cd56309f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/publishpress/library-wordpress-reviews/zipball/6d0b687a66439721b0432ef1320fd818cd56309f", + "reference": "6d0b687a66439721b0432ef1320fd818cd56309f", + "shasum": "" + }, + "require": { + "php": ">=5.6.20" + }, + "require-dev": { + "codeception/module-asserts": "^1.0", + "codeception/module-cli": "^1.0", + "codeception/module-db": "^1.0", + "codeception/module-filesystem": "^1.0", + "codeception/module-phpbrowser": "^1.0", + "codeception/module-rest": "^1.3", + "codeception/module-webdriver": "^1.0", + "codeception/util-universalframework": "^1.0", + "lucatume/wp-browser": "^3", + "overtrue/phplint": "^2.1", + "phpmd/phpmd": "^2.8", + "publishpress/publishpress-plugin-builder": "^1.2", + "squizlabs/php_codesniffer": "^3.5", + "wp-cli/i18n-command": "^2.2", + "wp-cli/wp-cli": "^2.5" + }, + "time": "2023-10-06T17:22:31+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "ReviewsController.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "PublishPress", + "email": "help@publishpress.com" + }, + { + "name": "Daniel Iser", + "homepage": "https://github.com/danieliser/WP-Product-In-Dash-Review-Requests" + } + ], + "description": "Library for showing a five-star review banner.", + "homepage": "http://publishpress.com/", + "keywords": [ + "review", + "reviews", + "wordpress plugin" + ], + "support": { + "issues": "https://github.com/publishpress/library-wordpress-reviews/issues", + "source": "https://github.com/publishpress/library-wordpress-reviews/tree/v1.1.20" + }, + "install-path": "../publishpress/wordpress-reviews" + }, + { + "name": "publishpress/wordpress-version-notices", + "version": "2.1.3", + "version_normalized": "2.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/publishpress/library-wordpress-version-notices.git", + "reference": "8e54558d2427a0f93174ccbc1d02c1ba7e2abc8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/publishpress/library-wordpress-version-notices/zipball/8e54558d2427a0f93174ccbc1d02c1ba7e2abc8d", + "reference": "8e54558d2427a0f93174ccbc1d02c1ba7e2abc8d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "publishpress/pimple-pimple": "^3.5.0.0", + "publishpress/psr-container": "^2.0.1.0" + }, + "require-dev": { + "codeception/module-asserts": "^1.0", + "codeception/module-cli": "^1.0", + "codeception/module-db": "^1.0", + "codeception/module-filesystem": "^1.0", + "codeception/module-phpbrowser": "^1.0", + "codeception/module-rest": "^1.3", + "codeception/module-webdriver": "^1.0", + "codeception/util-universalframework": "^1.0", + "composer/composer": "2.2.12", + "lucatume/wp-browser": "^3", + "overtrue/phplint": "^2.1", + "publishpress/version-loader-generator": "^1.0" + }, + "time": "2023-10-11T15:04:44+00:00", + "type": "library", + "extra": { + "generator": { + "lib-class-test": "class_exists('PublishPress\\WordpressVersionNotices\\ServicesProvider')", + "src-dir": "src", + "action-initialize-priority": "-150", + "action-register-priority": "-190" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "PublishPress", + "email": "help@publishpress.com", + "homepage": "https://publishpress.com", + "role": "Developer" + } + ], + "description": "Library for displaying version notices for Pro plugins in WordPress.", + "support": { + "issues": "https://github.com/publishpress/library-wordpress-version-notices/issues", + "source": "https://github.com/publishpress/library-wordpress-version-notices/tree/2.1.3" + }, + "install-path": "../publishpress/wordpress-version-notices" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/wp-content/plugins/revisionary/lib/vendor/composer/installed.php b/wp-content/plugins/revisionary/lib/vendor/composer/installed.php new file mode 100644 index 000000000..71d4e11f0 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/composer/installed.php @@ -0,0 +1,68 @@ + array( + 'name' => '__root__', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => NULL, + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => NULL, + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'publishpress/instance-protection' => array( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'reference' => '4193f84a8a680bf4c0d40cc64976ddcadd92158a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../publishpress/instance-protection', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'publishpress/pimple-pimple' => array( + 'pretty_version' => '3.5.0.10', + 'version' => '3.5.0.10', + 'reference' => 'f2784f4b1ccaf195b373a46a74cf3742e7c9f826', + 'type' => 'library', + 'install_path' => __DIR__ . '/../publishpress/pimple-pimple', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'publishpress/psr-container' => array( + 'pretty_version' => '2.0.1.10', + 'version' => '2.0.1.10', + 'reference' => '4ccd2cb058e7b93e96186791ca25870a02e35c5d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../publishpress/psr-container', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'publishpress/wordpress-reviews' => array( + 'pretty_version' => 'v1.1.20', + 'version' => '1.1.20.0', + 'reference' => '6d0b687a66439721b0432ef1320fd818cd56309f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../publishpress/wordpress-reviews', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'publishpress/wordpress-version-notices' => array( + 'pretty_version' => '2.1.3', + 'version' => '2.1.3.0', + 'reference' => '8e54558d2427a0f93174ccbc1d02c1ba7e2abc8d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../publishpress/wordpress-version-notices', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/LICENSE b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Autoloader.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Autoloader.php new file mode 100644 index 000000000..d4c6d1448 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Autoloader.php @@ -0,0 +1,189 @@ +register(); + * + * // register the base directories for the namespace prefix + * $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src'); + * $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests'); + * + * The following line would cause the autoloader to attempt to load the + * \Foo\Bar\Qux\Quux class from /path/to/packages/foo-bar/src/Qux/Quux.php: + * + * prefixes[$prefix]) === false) { + $this->prefixes[$prefix] = array(); + } + + // retain the base directory for the namespace prefix + if ($prepend) { + array_unshift($this->prefixes[$prefix], $base_dir); + } else { + array_push($this->prefixes[$prefix], $base_dir); + } + } + + /** + * Loads the class file for a given class name. + * + * @param string $class The fully-qualified class name. + * @return mixed The mapped file name on success, or boolean false on + * failure. + */ + public function loadClass($class) + { + // the current namespace prefix + $prefix = $class; + + // work backwards through the namespace names of the fully-qualified + // class name to find a mapped file name + while (false !== $pos = strrpos($prefix, '\\')) { + + // retain the trailing namespace separator in the prefix + $prefix = substr($class, 0, $pos + 1); + + // the rest is the relative class name + $relative_class = substr($class, $pos + 1); + + // try to load a mapped file for the prefix and relative class + $mapped_file = $this->loadMappedFile($prefix, $relative_class); + if ($mapped_file) { + return $mapped_file; + } + + // remove the trailing namespace separator for the next iteration + // of strrpos() + $prefix = rtrim($prefix, '\\'); + } + + // never found a mapped file + return false; + } + + /** + * Load the mapped file for a namespace prefix and relative class. + * + * @param string $prefix The namespace prefix. + * @param string $relative_class The relative class name. + * @return mixed Boolean false if no mapped file can be loaded, or the + * name of the mapped file that was loaded. + */ + protected function loadMappedFile($prefix, $relative_class) + { + // are there any base directories for this namespace prefix? + if (isset($this->prefixes[$prefix]) === false) { + return false; + } + + // look through base directories for this namespace prefix + foreach ($this->prefixes[$prefix] as $base_dir) { + + // replace the namespace prefix with the base directory, + // replace namespace separators with directory separators + // in the relative class name, append with .php + $file = $base_dir + . str_replace('\\', '/', $relative_class) + . '.php'; + + // if the mapped file exists, require it + if ($this->requireFile($file)) { + // yes, we're done + return $file; + } + } + + // never found it + return false; + } + + /** + * If a file exists, require it from the file system. + * + * @param string $file The file to require. + * @return bool True if the file exists, false if not. + */ + protected function requireFile($file) + { + if (file_exists($file)) { + require $file; + return true; + } + return false; + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Config.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Config.php new file mode 100644 index 000000000..d92b56c02 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/Config.php @@ -0,0 +1,44 @@ +pluginSlug = $config->pluginSlug; + $this->pluginName = $config->pluginName; + $this->pluginFolder = $config->pluginFolder; + $this->isProPlugin = $config->isProPlugin; + $this->freePluginName = $config->freePluginName; + + if (! $this->isProPlugin) { + $this->freePluginName = $this->pluginName; + } + + if (empty($this->pluginFolder)) { + $this->pluginFolder = $this->pluginSlug; + } + + if ( + is_admin() + && ! wp_doing_ajax() + && ! wp_doing_cron() + ) { + add_action('admin_init', [$this, 'init'], $this->isProPlugin ? 7 : 5); + } + } + + public function getVersion() + { + return '2.0.0'; + } + + public function init() + { + global $pagenow; + + if ($pagenow !== 'plugins.php') { + return; + } + + if (! $this->getStateDuplicatedPluginCheck()) { + $this->checkDuplicatedPluginsAndLatestVersions(); + + $this->setFlagDuplicatedPluginCheck(); + } + + if ($this->getStateHasMultiplePluginsActivated()) { + $this->addMultipleInstancesNotice(); + } + + if ($this->isProPlugin && $this->getStateFreePluginLoadedByItself()) { + $this->addFreePluginNotice(); + } + + // This should run once per request. + if (! $this->getStateStyleEnqueued()) { + $this->addPluginsPageStyle(); + $this->setFlagStyleEnqueued(); + } + + if ($this->getStateHasMultiplePaths()) { + // This should run for every instance + add_action('after_plugin_row', [$this, 'addLatestVersionCheck'], 10, 2); + add_action('after_plugin_row', [$this, 'addNonStandardPathCheck'], 10, 2); + } + } + + private function checkDuplicatedPluginsAndLatestVersions() + { + if (! function_exists('get_plugins')) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + $plugins = get_plugins(); + + $pluginFiles = []; + $pluginInstances = []; + $latestVersions = []; + + foreach ($plugins as $pluginFile => $pluginData) { + if ($this->pluginName === $pluginData['Name']) { + $pluginFiles[] = $pluginFile; + + if (is_plugin_active($pluginFile)) { + $pluginInstances[] = $pluginFile; + + if ($pluginData['Name'] === $this->freePluginName) { + $this->setStateFreePluginLoadedByItself(); + } + } + + if (! isset($latestVersions[$this->pluginSlug])) { + $latestVersions[$this->pluginSlug] = $pluginData['Version']; + continue; + } + + if (version_compare($pluginData['Version'], $latestVersions[$this->pluginSlug], '>')) { + $latestVersions[$this->pluginSlug] = $pluginData['Version']; + } + } + } + + if (count($pluginFiles) > 1) { + $this->setStateHasMultiplePaths(); + } + + if (count($pluginInstances) > 1) { + $this->setStateHasMultiplePluginsActivated(); + } + + $this->setStateLatestVersions($latestVersions); + } + + public function addPluginsPageStyle() + { + add_action('admin_enqueue_scripts', function() { + wp_add_inline_style( + 'wp-admin', + ' + tr.ppa-plugin-warning { + background: #fff; + } + + tr.ppa-plugin-warning td { + box-shadow: inset 0 -1px 0 rgb(0 0 0 / 10%); + overflow: hidden; + padding: 0; + } + + tr.ppa-plugin-warning td > div { + margin: 5px 20px 15px 44px; + } + + tr.ppa-plugin-warning td > div.multiple-instances-warning { + background-color: #ffc6c6; + border: 1px solid #edb977; + border-left: 4px solid #e1a04e; + padding-left: 6px; + } + + tr.ppa-plugin-warning td > div.multiple-instances-warning .dashicons { + margin-right: 6px; + vertical-align: bottom; + color: #c18d17; + } + + tr.ppa-plugin-warning td > div.multiple-instances-warning p { + margin: 0.5em 0; + } + + tr.active + tr.ppa-plugin-warning td { + background-color: #f0f6fc; + } + ' + ); + }); + } + + public function addLatestVersionCheck($pluginFile, $pluginData) + { + if ($pluginData['Name'] !== $this->pluginName) { + return; + } + + if ($this->getStateVersionChecked($pluginFile)) { + return; + } + + $latestVersions = $this->getStateLatestVersions(); + + if (! isset($latestVersions[$this->pluginSlug])) { + return; + } + + if (version_compare($pluginData['Version'], $latestVersions[$this->pluginSlug], '<')) { + ?> + + +
    +

    + + +

    +
    + + + setStateVersionChecked($pluginFile); + } + + public function addNonStandardPathCheck($pluginFile, $pluginData) + { + if ($pluginData['Name'] !== $this->pluginName) { + return; + } + + if ($this->getStatePathHasBeenCheckedForPluginFile($pluginFile)) { + return; + } + + $expectedPath = $this->pluginFolder . '/' . $this->pluginSlug . '.php'; + + if ($pluginFile !== $expectedPath) { + ?> + + +
    +

    + + ' . esc_html($pluginFile) . '', + '' . esc_html($expectedPath) . '' + ); + ?> +

    +
    + + + setStatePathHasBeenCheckedForPluginFile($pluginFile); + } + + public function addMultipleInstancesNotice() + { + if ($this->getStateMultipleInstancesNoticeAdded()) { + return; + } + + $pluginName = $this->pluginName; + + add_action('admin_notices', function() use ($pluginName) { + ?> +
    +

    +
    + setStateMultipleInstancesNoticeAdded(); + } + + public function addFreePluginNotice() + { + if (LibState::getPluginState($this->pluginSlug, 'freePluginNoticeAdded')) { + return; + } + + $pluginName = $this->pluginName; + $freePluginName = $this->freePluginName; + + add_action('admin_notices', function() use ($pluginName, $freePluginName) { + ?> +
    +

    +
    + pluginSlug, 'freePluginNoticeAdded'); + } + + private function getStateHasMultiplePaths() + { + return (bool) LibState::getPluginState($this->pluginSlug, 'hasMultiplePaths'); + } + + private function setStateHasMultiplePaths() + { + LibState::setPluginState($this->pluginSlug, 'hasMultiplePaths'); + } + + private function getStateHasMultiplePluginsActivated() + { + return (bool) LibState::getPluginState($this->pluginSlug, 'hasMultipleInstances'); + } + + private function setStateHasMultiplePluginsActivated() + { + LibState::setPluginState($this->pluginSlug, 'hasMultipleInstances'); + } + + private function getStateFreePluginLoadedByItself() + { + return (bool) LibState::getState('freePluginIsLoaded' . $this->freePluginName); + } + + private function setStateFreePluginLoadedByItself() + { + LibState::setState('freePluginIsLoaded' . $this->freePluginName); + } + + private function setStatePathHasBeenCheckedForPluginFile($pluginFile) + { + LibState::setPluginState($this->pluginSlug, 'pathCheck' . $pluginFile); + } + + private function getStatePathHasBeenCheckedForPluginFile($pluginFile) + { + return (bool) LibState::getPluginState($this->pluginSlug, 'pathCheck' . $pluginFile); + } + + private function setStateVersionChecked($pluginFile) + { + LibState::setPluginState($this->pluginSlug, 'versionCheck' . $pluginFile); + } + + private function getStateVersionChecked($pluginFile) + { + return (bool) LibState::getPluginState($this->pluginSlug, 'versionCheck' . $pluginFile); + } + + private function getStateDuplicatedPluginCheck() + { + return (bool) LibState::getPluginState($this->pluginSlug, 'duplicatedPluginsCheck'); + } + + private function setFlagDuplicatedPluginCheck() + { + LibState::setPluginState($this->pluginSlug, 'duplicatedPluginsCheck'); + } + + private function getStateStyleEnqueued() + { + return (bool) LibState::getState(self::STATE_STYLE_ENQUEUED); + } + + private function setFlagStyleEnqueued() + { + LibState::setState(self::STATE_STYLE_ENQUEUED); + } + + private function setStateLatestVersions($latestVersions) + { + LibState::setPluginState($this->pluginSlug, 'latestVersions', $latestVersions); + } + + private function getStateLatestVersions() + { + return (array) LibState::getPluginState($this->pluginSlug, 'latestVersions'); + } + + private function setStateMultipleInstancesNoticeAdded() + { + LibState::setPluginState($this->pluginSlug, 'multipleInstancesNoticeAdded'); + } + + private function getStateMultipleInstancesNoticeAdded() + { + return (bool) LibState::getPluginState($this->pluginSlug, 'multipleInstancesNoticeAdded'); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/LibState.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/LibState.php new file mode 100644 index 000000000..36d91d45a --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/core/LibState.php @@ -0,0 +1,28 @@ +register(); + $autoloader->addNamespace('PublishPressInstanceProtection', __DIR__ . '/core'); +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/phpcs.xml.dist b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/phpcs.xml.dist new file mode 100644 index 000000000..c1c6b1029 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/instance-protection/phpcs.xml.dist @@ -0,0 +1,15 @@ + + + The coding standard for PublishPress Authors. + + ReviewsController.php + + + + + + + + + diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/LICENSE b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/LICENSE new file mode 100644 index 000000000..3e2a9e1e6 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2009-2020 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/Versions.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/Versions.php new file mode 100644 index 000000000..4757a35b2 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/Versions.php @@ -0,0 +1,85 @@ +versions[$versionString])) { + return false; + } + + $this->versions[$versionString] = $initializationCallback; + + return true; + } + + public function getVersions(): array + { + return $this->versions; + } + + public function latestVersion() + { + $keys = array_keys($this->versions); + if (empty($keys)) { + return false; + } + uasort($keys, 'version_compare'); + return end($keys); + } + + public function latestVersionCallback() + { + $latest = $this->latestVersion(); + if (empty($latest) || ! isset($this->versions[$latest])) { + return '__return_null'; + } + + return $this->versions[$latest]; + } + + /** + * @return Versions + * @codeCoverageIgnore + */ + public static function getInstance(): ?Versions + { + if (empty(self::$instance)) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * @codeCoverageIgnore + */ + public static function initializeLatestVersion(): void + { + $self = self::getInstance(); + + call_user_func($self->latestVersionCallback()); + } + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload-classmap.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload-classmap.php new file mode 100644 index 000000000..5ac5740b9 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload-classmap.php @@ -0,0 +1,27 @@ + $strauss_src . '/Versions.php', + 'PublishPress\Pimple\Container' => $strauss_src . '/pimple/pimple/src/Pimple/Container.php', + 'PublishPress\Pimple\Tests\ServiceIteratorTest' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php', + 'PublishPress\Pimple\Tests\PimpleTest' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php', + 'PublishPress\Pimple\Tests\Psr11\ContainerTest' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php', + 'PublishPress\Pimple\Tests\Psr11\ServiceLocatorTest' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php', + 'PublishPress\Pimple\Tests\PimpleServiceProviderInterfaceTest' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php', + 'PublishPress\Pimple\Tests\Fixtures\NonInvokable' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php', + 'PublishPress\Pimple\Tests\Fixtures\Service' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php', + 'PublishPress\Pimple\Tests\Fixtures\Invokable' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php', + 'PublishPress\Pimple\Tests\Fixtures\PimpleServiceProvider' => $strauss_src . '/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php', + 'PublishPress\Pimple\Psr11\Container' => $strauss_src . '/pimple/pimple/src/Pimple/Psr11/Container.php', + 'PublishPress\Pimple\Psr11\ServiceLocator' => $strauss_src . '/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php', + 'PublishPress\Pimple\ServiceProviderInterface' => $strauss_src . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php', + 'PublishPress\Pimple\Exception\FrozenServiceException' => $strauss_src . '/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php', + 'PublishPress\Pimple\Exception\UnknownIdentifierException' => $strauss_src . '/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php', + 'PublishPress\Pimple\Exception\InvalidServiceIdentifierException' => $strauss_src . '/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php', + 'PublishPress\Pimple\Exception\ExpectedInvokableException' => $strauss_src . '/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php', + 'PublishPress\Pimple\ServiceIterator' => $strauss_src . '/pimple/pimple/src/Pimple/ServiceIterator.php', +); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload.php new file mode 100644 index 000000000..35b2b2fc4 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/autoload.php @@ -0,0 +1,20 @@ +register('3.5.0.10', __NAMESPACE__ . '\initialize3Dot5Dot0Dot10'); + } + } + + function initialize3Dot5Dot0Dot10() + { + require_once __DIR__ . '/autoload.php'; + + if (! defined('PUBLISHPRESS_PIMPLE_PIMPLE_VERSION')) { + define('PUBLISHPRESS_PIMPLE_PIMPLE_VERSION', '3.5.0.10'); + } + + do_action('publishpress_pimple_pimple_3Dot5Dot0Dot10_initialized'); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Container.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Container.php new file mode 100644 index 000000000..c7cb0a971 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Container.php @@ -0,0 +1,308 @@ +factories = new \SplObjectStorage(); + $this->protected = new \SplObjectStorage(); + + foreach ($values as $key => $value) { + $this->offsetSet($key, $value); + } + } + + /** + * Sets a parameter or an object. + * + * Objects must be defined as Closures. + * + * Allowing any PHP callable leads to difficult to debug problems + * as function names (strings) are callable (creating a function with + * the same name as an existing parameter would break your container). + * + * @param string $id The unique identifier for the parameter or object + * @param mixed $value The value of the parameter or a closure to define an object + * + * @return void + * + * @throws FrozenServiceException Prevent override of a frozen service + */ + #[\ReturnTypeWillChange] + public function offsetSet($id, $value) + { + if (isset($this->frozen[$id])) { + throw new FrozenServiceException($id); + } + + $this->values[$id] = $value; + $this->keys[$id] = true; + } + + /** + * Gets a parameter or an object. + * + * @param string $id The unique identifier for the parameter or object + * + * @return mixed The value of the parameter or an object + * + * @throws UnknownIdentifierException If the identifier is not defined + */ + #[\ReturnTypeWillChange] + public function offsetGet($id) + { + if (!isset($this->keys[$id])) { + throw new UnknownIdentifierException($id); + } + + if ( + isset($this->raw[$id]) + || !\is_object($this->values[$id]) + || isset($this->protected[$this->values[$id]]) + || !\method_exists($this->values[$id], '__invoke') + ) { + return $this->values[$id]; + } + + if (isset($this->factories[$this->values[$id]])) { + return $this->values[$id]($this); + } + + $raw = $this->values[$id]; + $val = $this->values[$id] = $raw($this); + $this->raw[$id] = $raw; + + $this->frozen[$id] = true; + + return $val; + } + + /** + * Checks if a parameter or an object is set. + * + * @param string $id The unique identifier for the parameter or object + * + * @return bool + */ + #[\ReturnTypeWillChange] + public function offsetExists($id) + { + return isset($this->keys[$id]); + } + + /** + * Unsets a parameter or an object. + * + * @param string $id The unique identifier for the parameter or object + * + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($id) + { + if (isset($this->keys[$id])) { + if (\is_object($this->values[$id])) { + unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); + } + + unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]); + } + } + + /** + * Marks a callable as being a factory service. + * + * @param callable $callable A service definition to be used as a factory + * + * @return callable The passed callable + * + * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object + */ + public function factory($callable) + { + if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.'); + } + + $this->factories->attach($callable); + + return $callable; + } + + /** + * Protects a callable from being interpreted as a service. + * + * This is useful when you want to store a callable as a parameter. + * + * @param callable $callable A callable to protect from being evaluated + * + * @return callable The passed callable + * + * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object + */ + public function protect($callable) + { + if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Callable is not a Closure or invokable object.'); + } + + $this->protected->attach($callable); + + return $callable; + } + + /** + * Gets a parameter or the closure defining an object. + * + * @param string $id The unique identifier for the parameter or object + * + * @return mixed The value of the parameter or the closure defining an object + * + * @throws UnknownIdentifierException If the identifier is not defined + */ + public function raw($id) + { + if (!isset($this->keys[$id])) { + throw new UnknownIdentifierException($id); + } + + if (isset($this->raw[$id])) { + return $this->raw[$id]; + } + + return $this->values[$id]; + } + + /** + * Extends an object definition. + * + * Useful when you want to extend an existing object definition, + * without necessarily loading that object. + * + * @param string $id The unique identifier for the object + * @param callable $callable A service definition to extend the original + * + * @return callable The wrapped callable + * + * @throws UnknownIdentifierException If the identifier is not defined + * @throws FrozenServiceException If the service is frozen + * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter + * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object + */ + public function extend($id, $callable) + { + if (!isset($this->keys[$id])) { + throw new UnknownIdentifierException($id); + } + + if (isset($this->frozen[$id])) { + throw new FrozenServiceException($id); + } + + if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { + throw new InvalidServiceIdentifierException($id); + } + + if (isset($this->protected[$this->values[$id]])) { + @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), E_USER_DEPRECATED); + } + + if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { + throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.'); + } + + $factory = $this->values[$id]; + + $extended = function ($c) use ($callable, $factory) { + return $callable($factory($c), $c); + }; + + if (isset($this->factories[$factory])) { + $this->factories->detach($factory); + $this->factories->attach($extended); + } + + return $this[$id] = $extended; + } + + /** + * Returns all defined value names. + * + * @return array An array of value names + */ + public function keys() + { + return \array_keys($this->values); + } + + /** + * Registers a service provider. + * + * @param array $values An array of values that customizes the provider + * + * @return static + */ + public function register(ServiceProviderInterface $provider, array $values = []) + { + $provider->register($this); + + foreach ($values as $key => $value) { + $this[$key] = $value; + } + + return $this; + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php new file mode 100644 index 000000000..ea7507667 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php @@ -0,0 +1,41 @@ + + */ +class ExpectedInvokableException extends \InvalidArgumentException implements ContainerExceptionInterface +{ +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php new file mode 100644 index 000000000..637165ce4 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php @@ -0,0 +1,48 @@ + + */ +class FrozenServiceException extends \RuntimeException implements ContainerExceptionInterface +{ + /** + * @param string $id Identifier of the frozen service + */ + public function __construct($id) + { + parent::__construct(\sprintf('Cannot override frozen service "%s".', $id)); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php new file mode 100644 index 000000000..e5bdf1a3a --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php @@ -0,0 +1,48 @@ + + */ +class InvalidServiceIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface +{ + /** + * @param string $id The invalid identifier + */ + public function __construct($id) + { + parent::__construct(\sprintf('Identifier "%s" does not contain an object definition.', $id)); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php new file mode 100644 index 000000000..574135484 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php @@ -0,0 +1,48 @@ + + */ +class UnknownIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface +{ + /** + * @param string $id The unknown identifier + */ + public function __construct($id) + { + parent::__construct(\sprintf('Identifier "%s" is not defined.', $id)); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/Container.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/Container.php new file mode 100644 index 000000000..54b924f1f --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/Container.php @@ -0,0 +1,58 @@ + + */ +final class Container implements ContainerInterface +{ + private $pimple; + + public function __construct(PimpleContainer $pimple) + { + $this->pimple = $pimple; + } + + public function get(string $id) + { + return $this->pimple[$id]; + } + + public function has(string $id): bool + { + return isset($this->pimple[$id]); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php new file mode 100644 index 000000000..a553955bf --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php @@ -0,0 +1,78 @@ + + */ +class ServiceLocator implements ContainerInterface +{ + private $container; + private $aliases = []; + + /** + * @param PimpleContainer $container The Container instance used to locate services + * @param array $ids Array of service ids that can be located. String keys can be used to define aliases + */ + public function __construct(PimpleContainer $container, array $ids) + { + $this->container = $container; + + foreach ($ids as $key => $id) { + $this->aliases[\is_int($key) ? $id : $key] = $id; + } + } + + /** + * {@inheritdoc} + */ + public function get(string $id) + { + if (!isset($this->aliases[$id])) { + throw new UnknownIdentifierException($id); + } + + return $this->container[$this->aliases[$id]]; + } + + /** + * {@inheritdoc} + */ + public function has(string $id): bool + { + return isset($this->aliases[$id]) && isset($this->container[$this->aliases[$id]]); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceIterator.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceIterator.php new file mode 100644 index 000000000..f665483bb --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceIterator.php @@ -0,0 +1,92 @@ + + */ +final class ServiceIterator implements \Iterator +{ + private $container; + private $ids; + + public function __construct(Container $container, array $ids) + { + $this->container = $container; + $this->ids = $ids; + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function rewind() + { + \reset($this->ids); + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function current() + { + return $this->container[\current($this->ids)]; + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function key() + { + return \current($this->ids); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function next() + { + \next($this->ids); + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function valid() + { + return null !== \key($this->ids); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceProviderInterface.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceProviderInterface.php new file mode 100644 index 000000000..4b2557540 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/pimple-pimple/lib/pimple/pimple/src/Pimple/ServiceProviderInterface.php @@ -0,0 +1,47 @@ +versions[$versionString])) { + return false; + } + + $this->versions[$versionString] = $initializationCallback; + + return true; + } + + public function getVersions(): array + { + return $this->versions; + } + + public function latestVersion() + { + $keys = array_keys($this->versions); + if (empty($keys)) { + return false; + } + uasort($keys, 'version_compare'); + return end($keys); + } + + public function latestVersionCallback() + { + $latest = $this->latestVersion(); + if (empty($latest) || ! isset($this->versions[$latest])) { + return '__return_null'; + } + + return $this->versions[$latest]; + } + + /** + * @return Versions + * @codeCoverageIgnore + */ + public static function getInstance(): ?Versions + { + if (empty(self::$instance)) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * @codeCoverageIgnore + */ + public static function initializeLatestVersion(): void + { + $self = self::getInstance(); + + call_user_func($self->latestVersionCallback()); + } + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload-classmap.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload-classmap.php new file mode 100644 index 000000000..a83ec2520 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload-classmap.php @@ -0,0 +1,12 @@ + $strauss_src . '/Versions.php', + 'PublishPress\Psr\Container\NotFoundExceptionInterface' => $strauss_src . '/psr/container/src/NotFoundExceptionInterface.php', + 'PublishPress\Psr\Container\ContainerInterface' => $strauss_src . '/psr/container/src/ContainerInterface.php', + 'PublishPress\Psr\Container\ContainerExceptionInterface' => $strauss_src . '/psr/container/src/ContainerExceptionInterface.php', +); \ No newline at end of file diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload.php new file mode 100644 index 000000000..35b2b2fc4 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/autoload.php @@ -0,0 +1,20 @@ +register('2.0.1.10', __NAMESPACE__ . '\initialize2Dot0Dot1Dot10'); + } + } + + function initialize2Dot0Dot1Dot10() + { + require_once __DIR__ . '/autoload.php'; + + if (! defined('PUBLISHPRESS_PSR_CONTAINER_VERSION')) { + define('PUBLISHPRESS_PSR_CONTAINER_VERSION', '2.0.1.10'); + } + + do_action('publishpress_psr_container_2Dot0Dot1Dot10_initialized'); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/psr/container/src/ContainerExceptionInterface.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/psr/container/src/ContainerExceptionInterface.php new file mode 100644 index 000000000..a171a3d71 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/psr-container/lib/psr/container/src/ContainerExceptionInterface.php @@ -0,0 +1,16 @@ + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/ReviewsController.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/ReviewsController.php new file mode 100644 index 000000000..fcff08f8d --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/ReviewsController.php @@ -0,0 +1,710 @@ +. + * + * --------------------------------------------------------------------- + * It includes: + * - Multiple trigger groups which can be ordered by priority. + * - Multiple triggers per group. + * - Customizable messaging per trigger. + * - Link to review page. + * - Request reviews on a per-user basis rather than per site. + * - Allows each user to dismiss it until later or permanently seamlessly via AJAX. + * - Integrates with attached tracking server to keep anonymous records of each trigger's effectiveness. + * - Tracking Server API: https://gist.github.com/danieliser/0d997532e023c46d38e1bdfd50f38801 + * + * Original Author: danieliser + * Original Author URL: https://danieliser.com + * URL: https://github.com/danieliser/WP-Product-In-Dash-Review-Requests + */ + +namespace PublishPress\WordPressReviews; + +use Exception; + +if (class_exists('PublishPress\\WordPressReviews\\ReviewsController')) { + return; +} + +/** + * Class ReviewsController + * + * @package PublishPress\WordPressReviews + */ +class ReviewsController +{ + /** + * @var string + */ + private $pluginSlug; + + /** + * @var string + */ + private $pluginName; + + /** + * @var array + */ + private $metaMap; + + /** + * @var string + */ + private $iconUrl; + + /** + * @param string $pluginSlug + * @param string $pluginName + * @param string $iconUrl + */ + public function __construct($pluginSlug, $pluginName, $iconUrl = '') + { + $this->pluginSlug = $pluginSlug; + $this->pluginName = $pluginName; + $this->iconUrl = esc_url_raw($iconUrl); + + /** + * Filter to replace the meta map with options, filters and actions names. + * + * @param array + * + * @return array + */ + $this->metaMap = apply_filters( + "{$pluginSlug}_wp_reviews_meta_map", + [ + 'action_ajax_handler' => "{$this->pluginSlug}_action", + 'option_installed_on' => "{$this->pluginSlug}_wp_reviews_installed_on", + 'nonce_action' => "{$this->pluginSlug}_wp_reviews_action", + 'user_meta_dismissed_triggers' => "_{$this->pluginSlug}_wp_reviews_dismissed_triggers", + 'user_meta_last_dismissed' => "_{$this->pluginSlug}_wp_reviews_last_dismissed", + 'user_meta_already_did' => "_{$this->pluginSlug}_wp_reviews_already_did", + 'filter_triggers' => "{$this->pluginSlug}_wp_reviews_triggers", + ] + ); + + /** + * Legacy filter to replace the meta map with options, filters and actions names. + * + * @param array + * @return array + * @deprecated 1.1.9 + * + */ + $this->metaMap = apply_filters( + "publishpress_wp_reviews_meta_map_{$this->pluginSlug}", + $this->metaMap + ); + + add_action('admin_enqueue_scripts', [$this, 'enqueueStyle']); + } + + /** + * Initialize the library. + */ + public function init() + { + $this->addHooks(); + } + + /** + * Hook into relevant WP actions. + */ + private function addHooks() + { + if (defined('DOING_AJAX') && DOING_AJAX) { + add_action("wp_ajax_{$this->metaMap['action_ajax_handler']}", [$this, 'ajaxHandler']); + } + + if ($this->screenIsAllowedToDisplayNotice()) { + $this->installationPath(); + add_action('admin_notices', [$this, 'renderAdminNotices']); + add_action('network_admin_notices', [$this, 'renderAdminNotices']); + add_action('user_admin_notices', [$this, 'renderAdminNotices']); + } + } + + /** + * @return bool + */ + private function screenIsAllowedToDisplayNotice() + { + $displayNotice = is_admin(); + + /** + * Deprecated filter to specify a custom conditional to display or not the notice. + * + * @param bool + * @return bool + * @deprecated 1.1.9 + * + */ + $displayNotice = apply_filters( + "publishpress_wp_reviews_display_banner_{$this->pluginSlug}", + $displayNotice + ); + + /** + * Filter to specify a custom conditional to display or not the notice. + * + * @param bool + * + * @return bool + */ + $displayNotice = apply_filters("{$this->pluginSlug}_wp_reviews_allow_display_notice", $displayNotice); + + if (! $this->currentUserIsAdministrator()) { + $displayNotice = false; + } + + return $displayNotice; + } + + private function currentUserIsAdministrator() + { + $currentUser = get_current_user_id(); + $currentUser = get_user_by('ID', $currentUser); + + if (empty($currentUser) || ! is_object($currentUser) && is_wp_error($currentUser)) { + return false; + } + + return in_array('administrator', $currentUser->roles); + } + + /** + * Get the installation date for comparisons. Sets the date to now if none is found. + * + * @return false|string + */ + public function installationPath() + { + $installationPath = get_option($this->metaMap['option_installed_on'], false); + + if (! $installationPath) { + $installationPath = current_time('mysql'); + update_option($this->metaMap['option_installed_on'], $installationPath); + } + + return $installationPath; + } + + /** + * The function called by the ajax request. + */ + public function ajaxHandler() + { + $args = wp_parse_args( + $_REQUEST, + [ + 'group' => $this->getTriggerGroup(), + 'code' => $this->getTriggerCode(), + 'priority' => $this->getCurrentTrigger('priority'), + 'reason' => 'maybe_later', + ] + ); + + if (! wp_verify_nonce($_REQUEST['nonce'], $this->metaMap['nonce_action'])) { + wp_send_json_error(); + } + + try { + $userId = get_current_user_id(); + + $dismissedTriggers = $this->getDismissedTriggerGroups(); + $dismissedTriggers[$args['group']] = (int)$args['priority']; + + update_user_meta($userId, $this->metaMap['user_meta_dismissed_triggers'], $dismissedTriggers); + update_user_meta($userId, $this->metaMap['user_meta_last_dismissed'], current_time('mysql')); + + switch ($args['reason']) { + case 'maybe_later': + update_user_meta($userId, $this->metaMap['user_meta_last_dismissed'], current_time('mysql')); + break; + case 'am_now': + case 'already_did': + $this->setUserAlreadyDid($userId); + break; + } + + wp_send_json_success(); + } catch (Exception $e) { + wp_send_json_error($e); + } + } + + /** + * Get the trigger group. + * + * @return int|string + */ + private function getTriggerGroup() + { + static $selected; + + if (! isset($selected)) { + $selected = []; + } + + if (! array_key_exists($this->pluginSlug, $selected)) { + $dismissedTriggers = $this->getDismissedTriggerGroups(); + + $triggers = $this->getTriggers(); + + foreach ($triggers as $g => $group) { + foreach ($group['triggers'] as $trigger) { + if ( + ! in_array( + false, + $trigger['conditions'] + ) && (empty($dismissedTriggers[$g]) || $dismissedTriggers[$g] < $trigger['priority']) + ) { + $selected[$this->pluginSlug] = $g; + break; + } + } + + if (array_key_exists($this->pluginSlug, $selected)) { + break; + } + } + } + + return $selected[$this->pluginSlug]; + } + + /** + * Returns an array of dismissed trigger groups. + * + * Array contains the group key and highest priority trigger that has been shown previously for each group. + * + * $return = array( + * 'group1' => 20 + * ); + * + * @return array|mixed + */ + private function getDismissedTriggerGroups() + { + $userId = get_current_user_id(); + + $dismissedTriggers = get_user_meta($userId, $this->metaMap['user_meta_dismissed_triggers'], true); + + if (! $dismissedTriggers) { + $dismissedTriggers = []; + } + + return $dismissedTriggers; + } + + /** + * Gets a list of triggers. + * + * @param null $group + * @param null $code + * + * @return bool|mixed|void + */ + private function getTriggers($group = null, $code = null) + { + static $triggers; + + if (! isset($triggers)) { + $triggers = []; + } + + if (! array_key_exists($this->pluginSlug, $triggers)) { + $timeMessage = __( + 'Hey, you\'ve been using %1$s for %2$s on your site. We hope the plugin has been useful. Please could you quickly leave a 5-star rating on WordPress.org? It really does help to keep %1$s growing.', + $this->pluginSlug + ); + + $triggers[$this->pluginSlug] = apply_filters( + $this->metaMap['filter_triggers'], + [ + 'time_installed' => [ + 'triggers' => [ + 'one_week' => [ + 'message' => sprintf($timeMessage, $this->pluginName, __('1 week', $this->pluginSlug)), + 'conditions' => [ + strtotime($this->installationPath() . ' +1 week') < time(), + ], + 'link' => "https://wordpress.org/support/plugin/{$this->pluginSlug}/reviews/?rate=5#rate-response", + 'priority' => 10, + ], + 'one_month' => [ + 'message' => sprintf($timeMessage, $this->pluginName, __('1 month', $this->pluginSlug)), + 'conditions' => [ + strtotime($this->installationPath() . ' +1 month') < time(), + ], + 'link' => "https://wordpress.org/support/plugin/{$this->pluginSlug}/reviews/?rate=5#rate-response", + 'priority' => 20, + ], + 'three_months' => [ + 'message' => sprintf( + $timeMessage, + $this->pluginName, + __('3 months', $this->pluginSlug) + ), + 'conditions' => [ + strtotime($this->installationPath() . ' +3 months') < time(), + ], + 'link' => "https://wordpress.org/support/plugin/{$this->pluginSlug}/reviews/?rate=5#rate-response", + 'priority' => 30, + ], + ], + 'priority' => 10, + ], + ] + ); + + // Sort Groups + uasort($triggers[$this->pluginSlug], [$this, 'rsortByPriority']); + + // Sort each groups triggers. + foreach ($triggers[$this->pluginSlug] as $v) { + uasort($v['triggers'], [$this, 'rsortByPriority']); + } + } + + if (isset($group)) { + if (! array_key_exists($this->pluginSlug, $triggers) + || ! array_key_exists($group, $triggers[$this->pluginSlug])) { + return false; + } + + if (! isset($code)) { + $return = $triggers[$this->pluginSlug][$group]; + } elseif (array_key_exists($code, $triggers[$this->pluginSlug][$group]['triggers'])) { + $return = $triggers[$this->pluginSlug][$group]['triggers'][$code]; + } else { + $return = false; + } + + return $return; + } + + return $triggers[$this->pluginSlug]; + } + + /** + * @return int|string + */ + private function getTriggerCode() + { + static $selected; + + if (! isset($selected)) { + $selected = []; + } + + if (! array_key_exists($this->pluginSlug, $selected)) { + $dismissedTriggers = $this->getDismissedTriggerGroups(); + + foreach ($this->getTriggers() as $g => $group) { + foreach ($group['triggers'] as $t => $trigger) { + if ( + ! in_array( + false, + $trigger['conditions'] + ) && (empty($dismissedTriggers[$g]) || $dismissedTriggers[$g] < $trigger['priority']) + ) { + $selected[$this->pluginSlug] = $t; + break; + } + } + + if (array_key_exists($this->pluginSlug, $selected)) { + break; + } + } + } + + if (! array_key_exists($this->pluginSlug, $selected)) { + return false; + } + + return $selected[$this->pluginSlug]; + } + + /** + * @param null $key + * + * @return bool|mixed|void + */ + private function getCurrentTrigger($key = null) + { + $group = $this->getTriggerGroup(); + $code = $this->getTriggerCode(); + + if (! $group || ! $code) { + return false; + } + + $trigger = $this->getTriggers($group, $code); + + if (empty($key)) { + $return = $trigger; + } elseif (array_key_exists($key, $trigger)) { + $return = $trigger[$key]; + } else { + $return = false; + } + + return $return; + } + + /** + * @param $userId + */ + private function setUserAlreadyDid($userId) + { + update_user_meta($userId, $this->metaMap['user_meta_already_did'], true); + } + + public function enqueueStyle() + { + if (! $this->screenIsAllowedToDisplayNotice()) { + return; + } + + wp_register_style('publishpress_wordpress_reviews_style', false); + wp_enqueue_style('publishpress_wordpress_reviews_style'); + wp_add_inline_style( + 'publishpress_wordpress_reviews_style', + " + .{$this->pluginSlug}-wp-reviews-notice .button, + .{$this->pluginSlug}-wp-reviews-notice p { + font-size: 15px; + } + + .{$this->pluginSlug}-wp-reviews-notice .button:not(.notice-dismiss) { + border-width: 1px; + } + + .{$this->pluginSlug}-wp-reviews-notice .button.button-primary { + background-color: #655897; + border-color: #3d355c; + color: #fff; + } + + .{$this->pluginSlug}-wp-reviews-notice .notice-icon { + float: right; + height: 110px; + margin-top: 10px; + margin-left: 10px; + } + + @media (min-width:1000px) { + .{$this->pluginSlug}-wp-reviews-notice .notice-icon { + height: 90px; + } + } + + @media (min-width:1700px) { + .{$this->pluginSlug}-wp-reviews-notice .notice-icon { + height: 70px; + } + } + " + ); + } + + /** + * Render admin notices if available. + */ + public function renderAdminNotices() + { + if ($this->hideNotices()) { + return; + } + + $group = $this->getTriggerGroup(); + $code = $this->getTriggerCode(); + $priority = $this->getCurrentTrigger('priority'); + $trigger = $this->getCurrentTrigger(); + + // Used to anonymously distinguish unique site+user combinations in terms of effectiveness of each trigger. + $uuid = wp_hash(home_url() . '-' . get_current_user_id()); + + ?> + + + + + userSelectedAlreadyDid(), + $this->lastDismissedDate() && strtotime($this->lastDismissedDate() . ' +2 weeks') > time(), + empty($this->getTriggerCode()), + ]; + + return in_array(true, $conditions); + } + + /** + * Returns true if the user has opted to never see this again. + * + * @return bool + */ + private function userSelectedAlreadyDid() + { + $userId = get_current_user_id(); + + return (bool)get_user_meta($userId, $this->metaMap['user_meta_already_did'], true); + } + + /** + * Gets the last dismissed date. + * + * @return false|string + */ + private function lastDismissedDate() + { + $userId = get_current_user_id(); + + return get_user_meta($userId, $this->metaMap['user_meta_last_dismissed'], true); + } + + /** + * Sort array by priority value + * + * @param $a + * @param $b + * + * @return int + */ + public function sortByPriority($a, $b) + { + if (! isset($a['priority']) || ! isset($b['priority']) || $a['priority'] === $b['priority']) { + return 0; + } + + return ($a['priority'] < $b['priority']) ? -1 : 1; + } + + /** + * Sort array in reverse by priority value + * + * @param $a + * @param $b + * + * @return int + */ + public function rsortByPriority($a, $b) + { + if (! isset($a['priority']) || ! isset($b['priority']) || $a['priority'] === $b['priority']) { + return 0; + } + + return ($a['priority'] < $b['priority']) ? 1 : -1; + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/phpcs.xml.dist b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/phpcs.xml.dist new file mode 100644 index 000000000..c1c6b1029 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-reviews/phpcs.xml.dist @@ -0,0 +1,15 @@ + + + The coding standard for PublishPress Authors. + + ReviewsController.php + + + + + + + + + diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/.env.testing.dist b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/.env.testing.dist new file mode 100644 index 000000000..815d1b4e0 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/.env.testing.dist @@ -0,0 +1,18 @@ +WP_ROOT_FOLDER="/var/www/html" +TEST_SITE_DB_DSN="mysql:host=127.0.0.1:15100;dbname=php80dev" +TEST_SITE_WP_ADMIN_PATH="/wp-admin" +TEST_SITE_DB_NAME="wordpress" +TEST_SITE_DB_HOST="127.0.0.1:32881" +TEST_SITE_DB_USER="root" +TEST_SITE_DB_PASSWORD="root" +TEST_SITE_TABLE_PREFIX="wp_" +TEST_DB_NAME="wordpress" +TEST_DB_HOST="127.0.0.1:32881" +TEST_DB_USER="root" +TEST_DB_PASSWORD="root" +TEST_TABLE_PREFIX="wp_" +TEST_SITE_WP_URL="http://localhost:32880" +TEST_SITE_WP_DOMAIN="localhost:32880" +TEST_SITE_ADMIN_EMAIL="dev@example.com" +TEST_SITE_ADMIN_USERNAME="admin" +TEST_SITE_ADMIN_PASSWORD="admin" diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/codeception.yml b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/codeception.yml new file mode 100644 index 000000000..8420c2cb2 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/codeception.yml @@ -0,0 +1,25 @@ +paths: + tests: tests + output: tests/_output + data: tests/_data + support: tests/_support + envs: tests/_envs +actor_suffix: Tester +extensions: + enabled: + - Codeception\Extension\RunFailed + commands: + - Codeception\Command\GenerateWPUnit + - Codeception\Command\GenerateWPRestApi + - Codeception\Command\GenerateWPRestController + - Codeception\Command\GenerateWPRestPostTypeController + - Codeception\Command\GenerateWPAjax + - Codeception\Command\GenerateWPCanonical + - Codeception\Command\GenerateWPXMLRPC +params: + - .env.testing +settings: + lint: true + report_useless_tests: true + colors: true +bootstrap: bootstrap.php diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/includes.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/includes.php new file mode 100644 index 000000000..5c8b9f4ac --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/includes.php @@ -0,0 +1,25 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + * @deprecated 2.0.2 Use src/include.php instead + **/ diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/license.txt b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/license.txt new file mode 100644 index 000000000..6927bfd45 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/license.txt @@ -0,0 +1,377 @@ +WordPress Version Notices + +Copyright 2020 by the contributors + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +This program incorporates work covered by the following copyright and +permission notices: + + Edit Flow is Copyright 2009-2016 Mohammad Jangda, Daniel Bachhuber, et al. + http://editflow.org/ + Edit Flow was produced by Daniel Bachhuber, Mo Jangda, and Scott Bressler, + with special help from Andrew Spittle and Andrew Witherspoon + + Edit Flow is released under the GPL + +and + + WordPress Version Notices + + WordPress Version Notices is Copyright (c) 2020 PublishPress + + WordPress Version Notices is released under the GPL + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Autoloader.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Autoloader.php new file mode 100644 index 000000000..72c98d392 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Autoloader.php @@ -0,0 +1,51 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Module; + +interface AdInterface +{ + public function init(); + + /** + * @param string $message + * @param string $linkURL + */ + public function display($message = '', $linkURL = ''); +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php new file mode 100644 index 000000000..b1e969bb6 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/MenuLink/Module.php @@ -0,0 +1,230 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Module\MenuLink; + +use PublishPress\WordpressVersionNotices\Template\TemplateLoaderInterface; + +/** + * Class Module + * + * @package PublishPress\WordpressVersionNotices + */ +class Module +{ + const SETTINGS_FILTER = 'pp_version_notice_menu_link_settings'; + + const STYLE_HANDLE = 'pp-version-notice-menu-link-style'; + + const MENU_SLUG_SUFFIX = '-menu-upgrade-link'; + + /** + * @var TemplateLoaderInterface + */ + private $templateLoader; + + /** + * @var array + */ + private $globalSettings = []; + + /** + * @var array + */ + private $urlsMap = []; + + public function __construct(TemplateLoaderInterface $templateLoader) + { + $this->templateLoader = $templateLoader; + } + + public function init() + { + add_action('admin_head', [$this, 'adminHeadAddStyle']); + add_action('init', [$this, 'collectTheSettings'], 50); + add_action('admin_menu', [$this, 'addMenuLink'], 20); + add_action('admin_print_scripts', [$this, 'setUpgradeMenuLink'], 9999); + } + + public function collectTheSettings() + { + if (is_admin()) { + $this->globalSettings = apply_filters(self::SETTINGS_FILTER, []); + } + } + + public function adminHeadAddStyle() + { + ?> + + templateLoader; + + foreach ($this->globalSettings as $pluginName => $settings) { + if (is_array($settings['parent'])) { + foreach ($settings['parent'] as $parent) { + $menuPageURL = menu_page_url($parent, false); + + if (!empty($menuPageURL)) { + $settings['parent'] = $parent; + + break; + } + } + } + + if (!empty($settings['parent'])) { + $submenuSlug = $this->getSubmenuSlug($settings); + + add_submenu_page( + $settings['parent'], + $settings['label'], + $settings['label'], + 'read', + $submenuSlug, + function () use ($settings, $templateLoader) { + $context = [ + 'message' => __( + 'Amazing! We are redirecting you to our site...', + 'wordpress-version-notices' + ), + 'link' => $settings['link'] + ]; + + $templateLoader->displayOutput('menu-link', 'redirect-page', $context); + }, + 9999 + ); + + $this->urlsMap[$pluginName] = [ + 'slug' => $submenuSlug, + 'localUrl' => menu_page_url($submenuSlug, false), + 'redirectTo' => $settings['link'], + ]; + + // Add the CSS class to change the item color and add a reference to the respective URL. + $newItemIndex = false; + if (isset($submenu[$settings['parent']])) { + $newItemIndex = $this->getUpgradeMenuItemIndex($submenu[$settings['parent']], $settings); + } + + if (false !== $newItemIndex) { + $submenu[$settings['parent']][$newItemIndex][4] = 'pp-version-notice-upgrade-menu-item ' . $pluginName; + } + } + } + } + + private function getUpgradeMenuItemIndex($submenuItems, $settings) + { + if (!is_array($submenuItems)) { + return false; + } + + foreach ($submenuItems as $index => $item) { + if ($item[0] === $settings['label'] && $item[2] === $this->getSubmenuSlug($settings)) { + return $index; + } + } + + return false; + } + + public function setUpgradeMenuLink() + { + if (empty($this->urlsMap)) { + return; + } + + $convertedUrlsMap = []; + + foreach ($this->urlsMap as $pluginName => $urlData) { + $urlData['pluginName'] = $pluginName; + + $convertedUrlsMap[] = $urlData; + } + + $context = [ + 'convertedUrlsMap' => $convertedUrlsMap, + ]; + + $this->templateLoader->displayOutput('menu-link', 'menu-link-script', $context); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/TopNotice/Module.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/TopNotice/Module.php new file mode 100644 index 000000000..e8106752a --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Module/TopNotice/Module.php @@ -0,0 +1,228 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Module\TopNotice; + +use PublishPress\WordpressVersionNotices\Module\AdInterface; +use PublishPress\WordpressVersionNotices\Template\TemplateInvalidArgumentsException; +use PublishPress\WordpressVersionNotices\Template\TemplateLoaderInterface; + +/** + * Class Module + * + * @package PublishPress\WordpressVersionNotices + */ +class Module implements AdInterface +{ + const SETTINGS_FILTER = 'pp_version_notice_top_notice_settings'; + + const DISPLAY_ACTION = 'pp_version_notice_display_top_notice'; + + /** + * @var TemplateLoaderInterface + */ + private $templateLoader; + + /** + * @var array + */ + private $exceptions = []; + + /** + * @var array + */ + private $settings = []; + + public function __construct(TemplateLoaderInterface $templateLoader) + { + $this->templateLoader = $templateLoader; + } + + public function init() + { + add_action(self::DISPLAY_ACTION, [$this, 'display'], 10, 2); + add_action('in_admin_header', [$this, 'displayTopNotice']); + add_action('admin_init', [$this, 'collectTheSettings'], 50); + add_action('admin_head', [$this, 'adminHeadAddStyle']); + } + + public function collectTheSettings() + { + $this->settings = apply_filters(self::SETTINGS_FILTER, []); + } + + /** + * @param string $message + * @param string $linkURL + */ + public function display($message = '', $linkURL = '') + { + try { + if (empty($message) || empty($linkURL)) { + throw new TemplateInvalidArgumentsException(); + } + + $context = [ + 'message' => $message, + 'linkURL' => $linkURL + ]; + + $this->templateLoader->displayOutput('top-notice', 'notice', $context); + } catch (\Exception $e) { + if (defined('WP_DEBUG') && WP_DEBUG) { + $this->exceptions[] = $e->getMessage(); + + add_action('admin_notices', [$this, 'showNoticeWithException']); + } + } + } + + /** + * @return array|false + */ + private function isValidScreen() + { + $screen = get_current_screen(); + + if (!empty($screen)) { + foreach ($this->settings as $pluginName => $setting) { + if (!is_array($setting) || !isset($setting['screens'])) { + continue; + } + + foreach ($setting['screens'] as $screenParams) { + if ($screenParams === true) { + return $setting; + } + + $validVars = 0; + foreach ($screenParams as $var => $value) { + if (isset($screen->$var) && $screen->$var === $value) { + $validVars++; + } + } + + if ($validVars === count($screenParams)) { + return $setting; + } + } + } + } + + return false; + } + + public function adminHeadAddStyle() + { + if (! $this->isValidScreen()) { + return; + } + + ?> + + isValidScreen()) { + do_action(self::DISPLAY_ACTION, $settings['message'], $settings['link']); + } + } + + public function showNoticeWithException() + { + $class = 'notice notice-error'; + $message = implode("
    ", $this->exceptions); + + printf('

    %2$s

    ', esc_attr($class), esc_html($message)); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/ServicesProvider.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/ServicesProvider.php new file mode 100644 index 000000000..849d1fc1f --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/ServicesProvider.php @@ -0,0 +1,54 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices; + +use PublishPress\Pimple\Container; +use PublishPress\Pimple\ServiceProviderInterface; +use PublishPress\WordpressVersionNotices\Module\TopNotice\Module as TopNoticeModule; +use PublishPress\WordpressVersionNotices\Module\MenuLink\Module as MenuLinkModule; +use PublishPress\WordpressVersionNotices\Template\TemplateLoader; + +class ServicesProvider implements ServiceProviderInterface +{ + public function register(Container $pimple) + { + $pimple['TEMPLATES_PATH'] = function (Container $c) { + return PP_VERSION_NOTICES_BASE_PATH . '/templates'; + }; + + $pimple['module_top_notice'] = function (Container $c) { + return new TopNoticeModule($c['template_loader']); + }; + + $pimple['module_menu_link'] = function (Container $c) { + return new MenuLinkModule($c['template_loader']); + }; + + $pimple['template_loader'] = function (Container $c) { + return new TemplateLoader($c['TEMPLATES_PATH']); + }; + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateInvalidArgumentsException.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateInvalidArgumentsException.php new file mode 100644 index 000000000..566f4525b --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateInvalidArgumentsException.php @@ -0,0 +1,33 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Template; + +use RuntimeException; + +class TemplateInvalidArgumentsException extends RuntimeException +{ + +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoader.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoader.php new file mode 100644 index 000000000..f0f5a2849 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoader.php @@ -0,0 +1,108 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Template; + +class TemplateLoader implements TemplateLoaderInterface +{ + /** + * @var string + */ + private $templatesPath; + + /** + * TemplateLoader constructor. + * + * @param string $templatesPath + */ + public function __construct($templatesPath) + { + $this->templatesPath = $templatesPath; + } + + /** + * Load template for modules. + * + * @param $moduleName + * @param $templateName + * @param array $context + * @param bool $return + * + * @return false|string + * @throws TemplateNotFoundException + */ + private function load($moduleName, $templateName, $context = [], $return = false) + { + $templatePath = $this->templatesPath . '/' . $moduleName . '/' . $templateName . '.php'; + + if (!file_exists($templatePath)) { + throw new TemplateNotFoundException('Template file not found: ' . $templatePath); + } + + if ($return) { + ob_start(); + } + + extract($context); + + require $templatePath; + + if ($return) { + return ob_get_clean(); + } + + return false; + } + + /** + * Load template for modules. + * + * @param string $moduleName + * @param string $templateName + * @param array $context + * + * @throws TemplateNotFoundException + */ + public function displayOutput($moduleName, $templateName, $context = []) + { + echo $this->load($moduleName, $templateName, $context, false); + } + + /** + * Load template for modules. + * + * @param string $moduleName + * @param string $templateName + * @param array $context + * + * @return false|string + * + * @throws TemplateNotFoundException + */ + public function returnOutput($moduleName, $templateName, $context = []) + { + return $this->load($moduleName, $templateName, $context, true); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoaderInterface.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoaderInterface.php new file mode 100644 index 000000000..48782321e --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateLoaderInterface.php @@ -0,0 +1,53 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Template; + +interface TemplateLoaderInterface +{ + /** + * Load template for modules. + * + * @param string $moduleName + * @param string $templateName + * @param array $context + * + * @throws TemplateNotFoundException + */ + public function displayOutput($moduleName, $templateName, $context = []); + + /** + * Load template for modules. + * + * @param string $moduleName + * @param string $templateName + * @param array $context + * + * @return false|string + * + * @throws TemplateNotFoundException + */ + public function returnOutput($moduleName, $templateName, $context = []); +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateNotFoundException.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateNotFoundException.php new file mode 100644 index 000000000..7a2a7acf9 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Template/TemplateNotFoundException.php @@ -0,0 +1,33 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\WordpressVersionNotices + * @category Core + * @author PublishPress + * @copyright Copyright (c) 2020 PublishPress. All rights reserved. + **/ + +namespace PublishPress\WordpressVersionNotices\Template; + +use RuntimeException; + +class TemplateNotFoundException extends RuntimeException +{ + +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Versions.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Versions.php new file mode 100644 index 000000000..18a0fe3cb --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/Versions.php @@ -0,0 +1,85 @@ +versions[$versionString])) { + return false; + } + + $this->versions[$versionString] = $initializationCallback; + + return true; + } + + public function getVersions(): array + { + return $this->versions; + } + + public function latestVersion() + { + $keys = array_keys($this->versions); + if (empty($keys)) { + return false; + } + uasort($keys, 'version_compare'); + return end($keys); + } + + public function latestVersionCallback() + { + $latest = $this->latestVersion(); + if (empty($latest) || ! isset($this->versions[$latest])) { + return '__return_null'; + } + + return $this->versions[$latest]; + } + + /** + * @return Versions + * @codeCoverageIgnore + */ + public static function getInstance(): ?Versions + { + if (empty(self::$instance)) { + self::$instance = new self(); + } + + return self::$instance; + } + + /** + * @codeCoverageIgnore + */ + public static function initializeLatestVersion(): void + { + $self = self::getInstance(); + + call_user_func($self->latestVersionCallback()); + } + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/autoload.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/autoload.php new file mode 100644 index 000000000..2d1a2ef8e --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/autoload.php @@ -0,0 +1,42 @@ +register(new ServicesProvider()); + + // Load the modules + $module = $container['module_top_notice']; + $module->init(); + + $module = $container['module_menu_link']; + $module->init(); + + define('PP_VERSION_NOTICES_LOADED', true); + } +}, -125, 0); diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/deprecated.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/deprecated.php new file mode 100644 index 000000000..cea6c95a8 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/src/deprecated.php @@ -0,0 +1,35 @@ +register('2.1.3', __NAMESPACE__ . '\initialize2Dot1Dot3'); + } + } + + function initialize2Dot1Dot3() + { + require_once __DIR__ . '/autoload.php'; + + if (! defined('PUBLISHPRESS_WORDPRESS_VERSION_NOTICES_VERSION')) { + define('PUBLISHPRESS_WORDPRESS_VERSION_NOTICES_VERSION', '2.1.3'); + } + + do_action('publishpress_wordpress_version_notices_2Dot1Dot3_initialized'); + } +} diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/menu-link-script.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/menu-link-script.php new file mode 100644 index 000000000..ef5763d0c --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/menu-link-script.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/redirect-page.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/redirect-page.php new file mode 100644 index 000000000..d1d4410f4 --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/menu-link/redirect-page.php @@ -0,0 +1,15 @@ +
    +

    + +

    +

    + + +
    \ No newline at end of file diff --git a/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/top-notice/notice.php b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/top-notice/notice.php new file mode 100644 index 000000000..a717a565d --- /dev/null +++ b/wp-content/plugins/revisionary/lib/vendor/publishpress/wordpress-version-notices/templates/top-notice/notice.php @@ -0,0 +1,6 @@ +'; +$message = sprintf('
    ' . $message, $linkStart, $linkEnd); +?> +
    \ No newline at end of file diff --git a/wp-content/plugins/revisionary/mail-buffer_rvy.php b/wp-content/plugins/revisionary/mail-buffer_rvy.php new file mode 100644 index 000000000..cbebbcb59 --- /dev/null +++ b/wp-content/plugins/revisionary/mail-buffer_rvy.php @@ -0,0 +1,169 @@ + $default_minute_limit, + 'hour' => $default_hour_limit, + 'day' => $default_day_limit, + ] + ); + + return $send_limits; +} + +function _rvy_mail_check_buffer($new_msg = [], $args = []) { + global $wpdb; + + $log_only = !empty($args['log_only']); + + if (!$log_only) { + wp_cache_delete('revisionary_mail_buffer', 'options'); + + // @todo: re-enable buffer after troubleshooting for working copy redirect error + + if (true) { + $buffer = []; + $first_buffer = true; + } + } + + $new_msg_buffered = false; + + wp_cache_delete('revisionary_sent_mail', 'options'); + + if (!$sent_mail = get_option('revisionary_sent_mail')) { + $sent_mail = []; + $first_mail_log = true; + } + + $current_time = time(); + + // check sending limits + $durations = ['minute' => 60, 'hour' => 3600, 'day' => 86400]; + $sent_counts = ['minute' => 0, 'hour' => 0, 'day' => 0]; + + // by default, purge mail log entries older than 30 days + // @todo: purge mail log even when buffer is disabled + $purge_time = apply_filters('revisionary_mail_log_duration', 86400 * 30); + + if ($purge_time < $durations['day'] * 2) { + $purge_time = $durations['day'] * 2; + } + + $send_limits = _rvy_mail_send_limits(); + + foreach($sent_mail as $k => $mail) { + if (!isset($mail['time_gmt'])) { + continue; + } + + $elapsed = $current_time - $mail['time_gmt']; + + foreach($durations as $limit_key => $duration) { + if ($elapsed < $duration) { + $sent_counts[$limit_key]++; + } + + if ($new_msg && ($sent_counts[$limit_key] >= $send_limits[$limit_key])) { + $new_msg_buffered = true; + } + } + + if ($elapsed > $purge_time) { + unset($sent_mail[$k]); + $purged = true; + } + } + + if (!$log_only && $new_msg_buffered) { + $buffer = array_merge([$new_msg], $buffer); + update_option('revisionary_mail_buffer', $buffer); + } else { + $buffer = []; + } + + if (!empty($purged)) { + update_option('revisionary_sent_mail', $sent_mail); + } + + if (!empty($first_mail_log) && $sent_mail) { + $wpdb->query("UPDATE $wpdb->options SET autoload = 'no' WHERE option_name = 'revisionary_sent_mail'"); + } + + if (!empty($first_buffer) && $buffer) { + $wpdb->query("UPDATE $wpdb->options SET autoload = 'no' WHERE option_name = 'revisionary_mail_buffer'"); + } + + return (object) compact('buffer', 'sent_mail', 'send_limits', 'sent_counts', 'new_msg_buffered'); +} + +// called by WP-cron hook +function _rvy_send_buffered_mail() { + $buffer_status = rvy_mail_check_buffer(); + + if (empty($buffer_status->buffer)) { + return false; + } + + $q = $buffer_status->buffer; + + while ($q) { + foreach($buffer_status->sent_counts as $limit_key => $count) { + $buffer_status->sent_counts[$limit_key]++; + + if ($count > $buffer_status->send_limits[$limit_key]) { + // A send limit has been reached + break 2; + } + } + + $next_mail = array_pop($q); + + // update truncated buffer immediately to prevent duplicate sending by another process + update_option('revisionary_mail_buffer', $q); + + // If buffered notification is missing vital data, discard it + if (empty($next_mail['address']) || empty($next_mail['title']) || empty($next_mail['message']) || empty($next_mail['time_gmt'])) { + continue; + } + + // If notification was buffered more than a week ago, discard it + if (time() - $next_mail['time_gmt'] > 3600 * 24 * 7 ) { + continue; + } + + if (defined('RS_DEBUG')) { + $success = wp_mail($next_mail['address'], $next_mail['title'], $next_mail['message']); + } else { + $success = @wp_mail($next_mail['address'], $next_mail['title'], $next_mail['message']); + } + + if (!$success && defined('REVISIONARY_MAIL_RETRY')) { + // message was not sent successfully, so put it back in the buffer + if ($q) { + $q = array_merge([$next_mail], $q); + } else { + $q = [$next_mail]; + } + update_option('revisionary_mail_buffer', $q); + } else { + // log the sent mail + $next_mail['time'] = strtotime(current_time( 'mysql' )); + $next_mail['time_gmt'] = time(); + $next_mail['success'] = intval(boolval($success)); + + if (!defined('RS_DEBUG') && !defined('REVISIONARY_LOG_EMAIL_MESSAGE')) { + unset($next_mail['message']); + } + + $buffer_status->sent_mail[]= $next_mail; + update_option('revisionary_sent_mail', $buffer_status->sent_mail); + } + } +} diff --git a/wp-content/plugins/revisionary/multiple-authors_rvy.php b/wp-content/plugins/revisionary/multiple-authors_rvy.php new file mode 100644 index 000000000..ecae4e647 --- /dev/null +++ b/wp-content/plugins/revisionary/multiple-authors_rvy.php @@ -0,0 +1,61 @@ +term_id)) { + return; + } + + $author = $author->term_id; + } + + $taxonomy = (!empty($multiple_authors_addon) && !empty($multiple_authors_addon->coauthor_taxonomy)) + ? $multiple_authors_addon->coauthor_taxonomy + : 'author'; + + //$author = Author::get_by_term_id($author); // this returns an object with term_id property and no name + //$author = get_term($author, 'author'); // 'author' is actually an invalid taxonomy name per WP API + $author = $wpdb->get_row( + $wpdb->prepare( + "SELECT * FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id" + . " WHERE tt.taxonomy = %s AND t.term_id = %d" + , $taxonomy, $author + ) + ); + + if (!empty($author->name)) { + $names[] = $author->name; + } + } + + if (!empty($names)) { + $names = implode(', ', $names); + rvy_update_post_meta($post_id, $metadata, $names); + } else { + delete_post_meta($post_id, $metadata); + } + } +} diff --git a/wp-content/plugins/revisionary/readme.txt b/wp-content/plugins/revisionary/readme.txt new file mode 100644 index 000000000..ec29a94dd --- /dev/null +++ b/wp-content/plugins/revisionary/readme.txt @@ -0,0 +1,1281 @@ +=== PublishPress Revisions: Duplicate Posts, Submit, Approve and Schedule Content Changes === + +Contributors: publishpress, kevinB, stevejburge, andergmartins +Author: PublishPress +Author URI: https://publishpress.com +Tags: revision, submit changes, duplicate post, duplicate page, revisions, approve changes, scheduled changes +Requires at least: 5.5 +Requires PHP: 7.2.5 +Tested up to: 6.5 +Stable tag: 3.5.8.2 +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +PublishPress Revisions gives you control over updating published content. Users can duplicate posts and submit changes. You can approve, reject or schedule them. + +== Description == + +PublishPress Revisions is the ultimate tool for making content changes. Users get a safe space to work on content updates. When the changes are ready, they can ask for approval to publish the update. Administrators can approve or reject the changes. They can also schedule them to go live in the future. + +Your users can update posts using the normal WordPress editor, but their changes will not be published automatically. Instead, the changes are stored in a "Revision Queue". The changes can be approved, rejected or scheduled. PublishPress Revisions works with the familiar WordPress interface, including Gutenberg and the Classic Editor. + +## PublishPress Revisions Pro ## + +> Upgrade to Revisions Pro
    +> This plugin is the free version of the Revisions Pro plugin. The Free version of PublishPress Revisions supports the WordPress core. The Pro version of PublishPress Revisions supports ACF, Yoast SEO, PODS, WooCommerce, WPML, Elementor, Beaver Builder, and many more plugins and themes. Click here to purchase the best premium WordPress content update plugin now! + +## Submit Change Requests for Posts #### +PublishPress Revisions allows your users to submit change requests for published posts. Your users can update posts using the normal WordPress editor, but their changes will not be published automatically. Instead, the changes are stored as a "pending revision" that can be approved or rejected. + +[Click here to see how to submit revisions](https://publishpress.com/knowledge-base/revisions-start/). + +## Schedule Future Updates to Posts ## + +PublishPress Revisions allows you to schedule WordPress revisions to be published in the future. When you're editing a published post, all you need to do is select a future date and click "Schedule Revision". Your changes will be published at the specified time. + +[Click here to see how to schedule revisions](https://publishpress.com/knowledge-base/schedule-revisions-future/). + +## Manage and Moderate Changes to Content ## + +After you create a revision with PublishPress Revisions, you can find that revision on the Revision Queue screen. This screen shows you all the revisions that have been submitted for approval. Underneath each duplicate post you can choose from several moderation tools: Edit, Delete, Preview and Compare. + +[Click here to see how to manage and moderate revisions](https://publishpress.com/knowledge-base/schedule-or-publish-revisions/). + +## Compare Current and Former Versions ## +Pending and Scheduled Revisions can include changes to post content, categories, tags, featured image, page parent and other options. Each of these changes can be reviewed in the familiar Compare Revisions interface. + +[Click here to see how to compare revisions](https://publishpress.com/knowledge-base/compare-revisions/). + +## Frontend Moderation of Content Changes ## + +It is possible to preview and moderate revisions via the frontend of your WordPress site. If you click Preview for a pending revision, you'll see a toolbar across the frontend of the site. This toolbar will change color so you can easily know the status of the revision. For example, if you're looking at a pending revision, the toolbar will be green. For scheduled revisions, the toolbar will be grey. + +[Click here to see how to manage from the frontend of your site](https://publishpress.com/knowledge-base/publishing-revisions-frontend/). + +## Email Notifications for Revisions ## + +PublishPress Revisions will notify Administrators and Editors when a new revision is submitted. They can log in to preview, compare and approve the changes. PublishPress Revisions can also send emails for revision approval and publication. The Settings screen lets you disable unwanted notifications. + +[Click here for more on revision notifications](https://publishpress.com/knowledge-base/emails-revisionary/). + +## Additional Plugins Supported in the Pro Version ## + +Page builder / front end editing integrations: + +* BeaverBuilder integration +* Divi Theme, Divi Builder integration +* Elementor integration + +Major plugins we maintain compatibility with: + +* Advanced Custom Fields +* Pods +* WPML +* The Events Calendar +* WooCommerce +* Yoast SEO + +[Click here for the full list of supported plugins in the Pro version](https://publishpress.com/knowledge-base/plugins-revisions-support/). + +## You Can Set Very Detailed Revision Permissions ## + +PublishPress Revisions works with the default WordPress user roles, and also introduces a Revisor role: + +* Contributors can submit revisions to their own published posts. +* Revisors can submit revisions to posts and pages published by others. +* Authors, Editors and Administrators can approve revisions or schedule their own revisions. + +To schedule changes to a published post, just set the desired future date before hitting Update. + +By upgrading to Revisions Pro, you also gain advanced permissions control through the PublishPress Permissions Pro plugin. You can customize permissions by role or per-user, granting full editing or revision submission rights to specific posts, categories, or taxonomy terms. + +[Click here for more on revision permissions](https://publishpress.com/knowledge-base/permissions-revisions). + +## Join PublishPress and get the Pro plugins ## + +The Pro versions of the PublishPress plugins are well worth your investment. The Pro versions have extra features and faster support. [Click here to join PublishPress](https://publishpress.com/pricing/). + +Join PublishPress and you'll get access to these nine Pro plugins: + +* [PublishPress Authors Pro](https://publishpress.com/authors) allows you to add multiple authors and guest authors to WordPress posts. +* [PublishPress Blocks Pro](https://publishpress.com/blocks) has everything you need to build professional websites with the WordPress block editor. +* [PublishPress Capabilities Pro](https://publishpress.com/capabilities) is the plugin to manage your WordPress user roles, permissions, and capabilities. +* [PublishPress Checklists Pro](https://publishpress.com/checklists) enables you to define tasks that must be completed before content is published. +* [PublishPress Future Pro](https://publishpress.com/future) is the plugin for scheduling changes to your posts. +* [PublishPress Permissions Pro](https://publishpress.com/permissions) is the plugin for advanced WordPress permissions. +* [PublishPress Planner Pro](https://publishpress.com/publishpress) is the plugin for managing and scheduling WordPress content. +* [PublishPress Revisions Pro](https://publishpress.com/revisions) allows you to update your published pages with teamwork and precision. +* [PublishPress Series Pro](https://publishpress.com/series) enables you to group content together into a series + +Together, these plugins are a suite of powerful publishing tools for WordPress. If you need to create a professional workflow in WordPress, with moderation, revisions, permissions and more... then you should try PublishPress. + +## Bug Reports ## +Bug reports for PublishPress Revisions are welcomed in our [repository on GitHub](https://github.com/publishpress/publishpress-revisions). Please note that GitHub is not a support forum, and that issues that aren't properly qualified as bugs will be closed. + +## Follow the PublishPress team ## + +Follow PublishPress on [Facebook](https://www.facebook.com/publishpress), [Twitter](https://www.twitter.com/publishpresscom) and [YouTube](https://www.youtube.com/publishpress) + +== Screenshots == + +1. Schedule Revisions: PublishPress Revisions allows you to schedule WordPress revisions to be published in the future. +2. Control Revision Permissions: PublishPress Revisions allows you to control which users are able to submit revisions to published posts. +3. Submit Revisions: PublishPress Revisions enables you to submit change requests for published posts. +4. Preview and Compare Revisions: Every requested change can be reviewed in the normal "Compare Revisions" interface in WordPress. +5. Manage and Moderate Revisions: PublishPress Revisions has a Revision Queue screen where you can search, approve, or deny changes to a published post's content. +6. Email Notifications for Revisions: Administrators and Editors are notified by email when a new revision is submitted. PublishPress Revisions can also send emails for revision approval and publication. +7. Support for Plugins: Revisions Pro adds support for the plugins such as Yoast SEO, WooCommrce and Advanced Custom Fields. +8. Divi, Beaver Builder Integration: With Revisions Pro, your Contributors and Revisors will be able to submit revisions to published content using the front end editor of the Divi theme or Beaver Builder plugin. +9. WPML Integration: With Revisions Pro, pending and scheduled revisions work in multi-language sites controlled by the WPML plugin. +10. Advanced Permissions: By upgrading to Revisions Pro, you also gain advanced permissions control through Permissions Pro. Customize permissions by role or per-user. + +== Frequently Asked Questions == + += How do I duplicate pages or other post types? = + +PublishPress Revisions can duplicate pages and any other post types. For example, to duplicate pages, go to the "Pages" screen in WordPress and click "New Revision" next to any page. You will be taken to a duplicate page that you can edit and save to the Revision Queue. + += How do I duplicate WooCommerce products? = + +WooCommerce is the most popular way to build a WordPress eCommerce site. With PublishPress Revisions Pro you can submit, moderate, approve and schedule revisions to your WooCommerce products. + +When you are on the "Products" screen, click the "New Revision" link. Inside the product revision, the PublishPress buttons will appear in the top-right corner. When you save the product, it will appear on the main "Revision Queue" screen. + +It is possible to schedule updates to WooCommerce products. + +- While updating an post or page created created with Elementor, click "Immediately" in the right sidebar. +- Choose the new date for these changes to go live. +- Click the "Update Revision" button. + +All key WooCommerce fields are supported by PublishPress Revisions Pro. If you are using 3rd party WooCommerce plugins, we do recommend testing their compatibility with WordPress revisions and PublishPress Revisions Pro. + +[Click here for more on duplicate WooCommerce products](https://publishpress.com/knowledge-base/permissions-revisions). + += How do I duplicate Elementor pages and posts? = + +PublishPress Revisions Pro has support for the Elementor plugin. + +Here's how to use PublishPress Revisions and Elementor together: + +- Find and a published post or page that was created with Elementor. +- You will see a "New revision" link. +- On the next screen, you can click "Edit with Elementor" to make changes. +- You can use "Submit Revision" in the right sidebar to submit your changes. +- In the WordPress admin area, you can go to visit the "Revision Queue" screen and you will see the submitted revision of your Elementor page. It will be waiting for your approval. + +It is possible to schedule content updates to Elementor posts. + +- While updating an post or page created created with Elementor, click "Immediately" in the right sidebar. +- Choose the new date for these changes to go live. +- Click the "Update Revision" button. + +[Click here for more on duplicate Elementor posts (https://publishpress.com/knowledge-base/publishpress-revisions-elementor/). + += How do I duplicate The Events Calendar events? = + +The Events Calendar plugin is one the most popular ways to create and list events in WordPress. PublishPress Revisions Pro and The Events Calendar work together successfully. + +- Make sure you are using the Gutenberg option for creating events. +- After installing PublishPress Revisions Pro, you will be able to submit revisions to events using the “New Revision” option on the main “Events” screen. +- You will see the normal Event screen, but with additional PublishPress Revisions button in the top-right corner. +- Your event revisions will appear in the "Revision Queue". +- You will not be able to use the "Compare" link because The Events Calendar does not support that WordPress feature yet. However, all the other key features of PublishPress Revisions Pro will work. For example, PublishPress Revisions Pro will record changes to all your event fields and settings. + +[Click here for more on duplicate The Events Calendar events (https://publishpress.com/knowledge-base/revisions-events-calendar/). + += How do I duplicate posts with Advanced Custom Fields? = + +PublishPress Revisions Pro has support for the Advanced Custom Fields (ACF) plugin. You can schedule, moderate and approve revisions for content that uses ACF. + +- To create a revision for post that use ACF, click on the "New Revision" link. +- Go to the "Revision Queue". +- Click "Edit" and you can update the revision, including the ACF fields. +- Click "Compare" and you can see what's changed in this revision. The "Compare" screen will show you any changes that have happened with ACF Fields. + +[Click here for more on duplicate posts with Advanced Custom Fields (https://publishpress.com/knowledge-base/revisionary-acf/). + += How do I duplicate posts with WPML? = + +PublishPress Revisions Pro has support for the WPML plugin. For example, you can create revisions for a post in English and create separate revisions for the Spanish translation of that post. + +- Go to your "Posts" screen. +- Click "New Revisions" and you can create a translated version of your content in any language. + +[Click here for more on duplicate posts with WPML (https://publishpress.com/knowledge-base/revisionary-wpml/). + += How do I duplicate posts with Yoast SEO? = + +Yoast SEO is the most popular SEO plugin in WordPress. With PublishPress Revisions Pro you can submit, moderate, approve and schedule revisions to your WordPress posts, and they will keep all your SEO data. + +In the image below, you can Yoast SEO data. With PublishPress Revisions Pro you enter this data and it will be saved throughout the revision approval process. + +[Click here for more on duplicate posts with Yoast SEO (https://publishpress.com/knowledge-base/revisions-yoast-seo/). + += How do I duplicate posts with Beaver Builder? = + +PublishPress Revisions Pro has support for the Beaver Builder plugin. Here's how to use PublishPress Revisions Pro and Beaver Builder together: + +- In your WordPress admin area, click "New Revision" for a post or page that uses Beaver Builder. +- On the next screen, you will be able to click "Launch Beaver Builder" and create a new version of this post. +- Click "Submit Revision" to submit your updates. +- In the WordPress admin area, you can visit the "Revision Queue" screen and you will see the submitted revision of your Beaver Builder page. It will be waiting for your approval. + +It is also possible to schedule revisions to Beaver Builder content. + +- When you're editing a revision, click "Immediately". +- Choose the date you want your post changes to go live. +- Click the "Submit Revision" button. + +[Click here for more on duplicate posts with Beaver Builder (https://publishpress.com/knowledge-base/revisionary-beaver-builder/). + += How do I duplicate posts with Divi Theme and Builder? = + +Divi is one of the most popular page-builders in WordPress, and it does integrate with PublishPress Revisions Pro. It is possible for lower-level users to edit a page with Divi and submit an update for approval. This workflow will apply to anyone with the correct permissions to submit revisions. + +- In your WordPress admin area, click "New Revision" for a post or page that uses Divi. +- You will see the normal editing layout in Divi, with the PublishPress Revisions buttons in the top toolbar and right sidebar. Click "Edit With The Divi Builder" to make content changes. + +[Click here for more on duplicate posts with Divi (https://publishpress.com/knowledge-base/divi-theme/). + +== Changelog == + += 3.5.8.2 = +* Fixed : Nonce failure on revision decline attempts +* Fixed : Saving with a future date in Classic Editor saves post as Published instead of Scheduled under some conditions +* Fixed : Revision Queue - If multiple bulk actions are applied, confirmation notice from previous actions is repeated +* Compat : Nested Pages - Fatal error on bulk deletion of revisions + += 3.5.8.1 - 16 Apr 2024 = +* Fixed : If limiting to one active revision per post, deleting a revision before saving it did not restore creation ability on some sites + += 3.5.8 - 12 Apr 2024 = +* Fixed : Revision Editor hid category selection checkboxes +* Fixed : New Revision button was missing from Revision Editor sidebar +* Fixed : Revision Editor did not display Preview Revision button +* Fixed : Revision Preview top bar styling broken by external CSS on some sites +* Fixed : Revision Preview top bar styling stuck in cache on some sites +* Fixed : If limiting to one active revision per post, deleting that revision did not restore ability to create a new one +* Fixed : Revision Queue - Bulk Decline failed with "link expired" message +* Fixed : New revisions could become orphaned from main post on WordPress VIP + += 3.5.7 - 4 Apr 2024 = +* Compat : WordPress 6.5 - Revision editor sidebar did not display date, template UI +* Feature : Decline link in Revision Queue row, Revision Preview top bar +* Fixed : Preview of front page revision was not displayed correctly +* Fixed : Previews of archived revisions did not display custom fields, multiple authors +* Fixed : Revision preview styling broke third party javascript on some installations +* Fixed : Classic Editor - Custom Fields metabox was unavailable while editing a revision +* Fixed : WP-defined revision limit (for past revisions) was not imposed when saving current content as a past revision at pending / scheduled revision publication +* Fixed : If "Limit to one active revision per post" setting is enabled, deleting a revision on a cached site did not restore ability to create a new revision to replace it +* Fixed : Possible memory leaks in javascript on Revision edit with Gutenberg editor +* API : New filter "revisionary_preview_link_type" + += 3.5.6 - 4 Jan 2024 = +* Feature : New setting Revisions > Settings > Preview > "Modify preview link for better theme compatibility". Some themes require one setting, some require the other. +* Fixed : ACF - Revision update, preview fails if ACF plugin is active +* Fixed : Edit Revision - Approve, Submit buttons missing in Gutenberg 17 +* Fixed : PHP 8.2: Warning for dynamic property declaration + += 3.5.5 - 12 Dec 2023 = +* Compat : Advanced Custom Fields - Prevent invalid filtering of revision ID +* Fixed : Front page template was not loaded for revision previews of front page +* Fixed : Revision previews were not loaded correctly on some sites +* Fixed : Pagination setting on Queue, Archive screens was not stored +* Fixed : Pagination on Archive screen not applied if Revision Deletion option disabled +* Fixed : Classic Editor - Revision Status no longer displayed after changing publish time +* Fixed : Classic Editor - Modified publish time discarded if Submit / Approve clicked before Update Revision +* Fixed : Classic Editor - Revision Submit button was still (mal)functional when disabled +* Change : Classic Editor - Separate buttons to Preview changes in progress, View / Approve Saved Revision + += 3.5.4 - 17 Oct 2023 = +* Fixed : Past Revision previews did not display (since 3.5.3) +* Fixed : Scheduled Revisions were not published under some configurations +* Fixed : Custom fields with multiple values stored to the same key were not revisioned correctly +* Fixed : Improve html validation of Revisions Settings screens, possibly resolving rendering issue on some browsers +* Change : Screen Options on Revision Queue and Revision Archive to set Revisions per Page (previously used setting from Pages screen) +* Compat : PublishPress Authors - Default author setting overrides actual revision author + += 3.5.3 - 30 Aug 2023 = +* Feature : Option to enable deletion of revisions in Revision Archive +* Fixed : Category / taxonomy changes were cleared by revision preview, not applied at revision approval +* Fixed : Revision Archive included autosaves +* Fixed : PHP 8.1 - Warning for dynamic property creation in revision preview + += 3.5.2 - 17 Aug 2023 = +* Fixed : Pro - Fatal error on activation if plugin settings were not previously saved (packaging error reverted fix in 3.5.1) +* Fixed : Revision Edit - No progress caption was shown after Submit button click +* Fixed : Options screen - html markup error (missing closing div tag) +* Lang : Updated Spanish, French, Italian translations + += 3.5.1 - 11 Aug 2023 = +* Fixed : Bedrock - Unable to activate plugin due to three internal libraries missing from GitHub commit + += 3.5 - 10 Aug 2023 = +* Fixed : Unscheduling a revision using bulk edit in Revision Queue caused it to become inaccessible +* Compat : Permalink Manager plugin - Suppress permalink modification in Revision edit +* Change : Change revision deletion captions to clarify that only the revision is deleted +* Change: Modified internal vendor library structure for shorter paths (lib/vendor) +* Change: Free plugin is loaded through internal vendor library + += 3.4.1 - 29 Jun 2023 = +* Fixed : Incorrect admin menu item display if revision submission is disabled for all post types + += 3.4 - 29 Jun 2023 = +* Feature : Revision Archive screen + += 3.3 - 19 Jun 2023 = +* Feature : Revisions > Settings > Revision Creation > "Limit to one active revision per post" +* Fixed : Plugin compat - dashboard_glance_items was improperly filtered +* Fixed : Revisions were incorrectly attributed to original page author under some conditions +* Compat : Revision Queue - Work around unidentified plugin conflict inserting inappropriate clauses into our posts query +* Compat : PublishPress Authors - Author changes in revision were not applied at revision publication +* Compat : PublishPress Authors - Revision Queue "Revised By" column always showed original post author +* Compat : Permissions + WordFence - Add Media query was not filtered based on Permissions settings +* Fixed : Multisite - Some settings UI were not displayed when plugin on network installations when plugin is not activated network-wide +* Fixed : Multisite - Settings previously configured for network-wide activation were not displayed on sub-site settings screen even after network deactivation +* Change : Bump WordPress version requirement to 5.5 +* Change : Bump PHP version requirement to 7.2.5 +* Change : Update vendor libraries based on revised PHP version support, using new internal-vendor structure + += 3.1.13 - 30 Mar 2023 = +* Fixed : Posts screen - Has Revision caption was not displayed unless "Revision Submission for Unpublished Posts" setting is enabled +* Fixed : Settings > Notifications > "Show Notification Log / Buffer" link did not redirect back to Notifications tab +* Change : Minimum PHP version 7.2.5 + += 3.1.12 - 23 Mar 2023 = +* Fixed : Posts were left with invalid "Has Revision" links after publication or deletion of all their revisions +* Fixed : If Revision Submission for Unpublished Posts is disabled but revisions of draft posts were previously created, those caused a "Has Revisions" label without displaying the revisions in Queue +* Fixed : Links to Revision Queue for a specific published post (including "Has Revision" links from Posts listing) failed to list unsubmitted revisions +* Fixed : Revision Compare > Manage : Non-rendered html tags, incorrect table formatting +* Fixed : Compare Past Revisions - invalid link on Preview / Restore button +* Fixed : Request Deletion link was displayed even if revisions are not enabled for post type + += 3.1.11 - 9 Feb 2023 = +* Fixed : Revision preview failure under some conditions +* Fixed : Avoid PHP Warning on Revision Preview if requested revision cannot be loaded +* Fixed : On Network-wide multisite activations, Settings screen displayed an unrendered html tag +* Lang : Update Spanish, French, Italian translations + += 3.1.10 - 22 Dec 2022 = +* Perf : Improve performance of post revision count, dropdown pages queries +* Fixed : Revisions were not correctly declined on some cached sites + += 3.1.9 - 15 Dec 2022 = +* Fixed : Scheduled Revisions missed by WP-Cron were not rescheduled. To disable auto-reschedule, define constant REVISIONARY_DISABLE_WP_CRON_RESTORATION +* Fixed : Revisions Queue table was missing a "check all" box +* Fixed : Fatal error on revision approval on some sites +* Compat : Relevanssi - If filtering is enabled for admin searches, Submitted / Scheduled Revisions are included in search results +* Compat : PublishPress Future - Attempted revision of post expiration settings caused unexpected behavior; disable for now +* API : Classic Editor revision editor supports filter revisionary_submit_revision_metabox_classic + += 3.1.8 - 3 Nov 2022 = +* Fixed : PHP 8 - Unresponsive elements in post editor due to Javascript loading failure +* Fixed : Avoid fatal error on plugin activation if loading sequence is non-standard +* Compat : WP Buddy Rich Snippets - PHP error "The script tried to modify a property on an incomplete object" on revision creation + += 3.1.7 - 12 Oct 2022 = +* Feature : Revision submission and approval handles author selection +* Fixed : Plugin review request dismissal was not applied +* Fixed : Gutenberg Editor - for non-English locales, future date selection did not enable Scheduled Revision creation +* Fixed : Gutenberg Editor - when editing an existing Scheduled Revision, publish date caption shows "Immediately" +* Fixed : PHP Notice "Trying to get property 'post_type' of non-object" when another plugin hooks into "use_block_editor_for_post" filter +* Lang : Update Spanish, French, Italian translations + += 3.1.6 - 31 Aug 2022 = +* Change : Support detection / indication of custom WP-Cron implementations when DISABLE_WP_CRON is set true + += 3.1.5 - 30 Aug 2022 = +* Fixed : Revision Submission from Gutenberg editor failed on some sites +* Fixed : Bulk-deleted revisions were not removed from revision count +* Fixed : PHP Warning for invalid regex if post type's REST registration or request has an invalid route string + += 3.1.4 - 17 Aug 2022 = +* Fixed : Approve Revision button in Gutenberg editor did not work +* Fixed : Submit Revision button in Gutenberg editor failed under some conditions +* Fixed : Detection of DISABLE_WP_CRON constant +* Fixed : Administrators did not receive revisions submission notifications under some configurations +* Fixed : Revision Queue column ordering / filtering links didn't work as expected in some use cases +* Fixed : When previewing a scheduled revision that has been published, "Edit" link in top bar had invalid URL +* Fixed : If Pro plugin is activated, deactivation of free plugin hides all revisions +* Compat : Yoast SEO: PHP Notices on revision creation / submission +* Lang : Update Spanish, Italian translations + += 3.1.2 - 7 Jul 2022 = +* Fixed : Filter 'use_block_editor_for_post' was not recognized in detecting block editor disable +* Fixed : Revision Edit in Gutenberg: Enable non-Editors to set requested publish date +* Fixed : Scheduled revisions were not published on some installations +* Change : Allow WP-Cron publication method to be disabled for scheduled revisions +* Feature : Option to Delete Editorial Comments on revision approval +* Feature : Option to disable revisions per post type +* Feature : Instance protection library warns about non-standard plugin folder, unnecessary free plugin activation +* Feature : Plugin review request +* Feature : Pro promo sidebar on settings screen + += 3.1.1 - 8 Jun 2022 = +* Fixed : Revision scheduling left a future date selection in editor. If the post is updated again without reloading the editor, it is unpublished until the selected date + += 3.1 - 1 Jun 2022 = +* Feature : Revision Edit - Administrators and editors have approval button for unsubmitted revisions +* Feature : Revision Queue - Bulk Edit includes "Decline" action to return "Submitted" revisions back to "Not Submitted" +* Feature : Revision Queue - New "Copy" row action +* Compat : PublishPress Permissions - fatal error loading Customizer +* Compat : PublishPress Authors - Revision submission failed +* Compat : PublishPress Permissions - Fatal error loading Customizer (also requires Permissions 3.7.6) +* Fixed : Scheduled Revisions fail on some sites +* Fixed : Editors could not manage unsubmitted revisions without manage_unsubmitted_revisions capability, even if "Additional role capability required" setting disabled +* Fixed : Non-public Post types had non-functional revision preview links, revision publication redirects +* Fixed : Edit Revision - alignment and spacing in revision status sidebar +* Fixed : Edit Revision - submit / approve buttons were re-enabled after toggle from Block to Post tab +* Fixed : Revision Queue - checkbox column did not have a "select all" box + += 3.0.16 - 20 Apr 2022 = +* Fixed : Post Editor - New Revision button was not displayed +* Lang : Some translations did not load +* Fixed : Edit Revision with Classic Editor - submit button not displayed for some custom post types + += 3.0.15 - 31 Mar 2022 = +* Fixed : Scheduled Revisions failed on WP 5.9 if WP Cron scheduling was disabled in Revisions settings + += 3.0.14 - 30 Mar 2022 = +* Fixed : Output variable escaping, other coding standard improvements + += 3.0.13 - 21 Mar 2022 = +* Fixed : Revision submission in Classic Editor caused "Undefined" link next to "Preview" link +* Fixed : New revisions created with "Auto-submit" option had wrong date (and listing order) in Revision Queue +* Fixed : PHP error on revision approval under some configurations +* Fixed : Dashboard Activity widget: Scheduled revisions were not included in Publishing Soon list +* Fixed : API: wp_after_insert_post action was not applied at revision publication +* Compat : Divi - Revision preview bar not visible on front end +* Compat : Divi - Classic Editor setting did not trigger correct Revisions UI +* Compat : Custom post types - revision submission button not displayed in some configurations +* API: New filters pp_revisions_option_pending_revision_update_post_date, ​pp_revisions_option_pending_revision_update_modified_date, ​pp_revisions_option_scheduled_revision_update_post_date​, ​pp_revisions_option_scheduled_revision_update_modified_date + += 3.0.12 - 3 Mar 2022 = +* Feature : Edit link in post editor after revision creation / scheduling +* Change : Option to auto-submit revisions created by users who can publish the main post +* Change : Option to publish scheduled revisions using WP-Cron +* Fixed : Scheduled publication of revisions fails on WP Engine if caching enabled (fix by enabling WP Cron scheduling) +* Fixed : WP 5.9 - After editing a revision, approval button remained disabled after revision update +* Fixed : New revisions were not listed in Revision Queue or linked to Preview button under some conditions +* Fixed : Compare Revisions: error if ACF is active on a PHP 8 installation +* Fixed : Revision Queue - column headers (to set sort field) had a bad link + += 3.0.10 - 10 Feb 2022 = +* Fixed : WordPress 5.9 - When editing a submitted revision, Save button was hidden +* Fixed : Revision Compare did not load on some sites +* Fixed : Option "Editing others' revisions requires role capability" was not applied + += 3.0.9 - 27 Jan 2022 +* Compat : WordPress 5.9 - Revisions could not be updated using Gutenberg editor + += 3.0.8 - 26 Jan 2022 +* Compat : WordPress 5.9 - Fatal error adding / editing posts (work around WP hooking late-defined function _disable_block_editor_for_navigation_post_type) + += 3.0.7 - 5 Jan 2022 = +* Fixed : Revision status changes not updated on sites running an object cache +* Fixed : Revision deletion from within editor left an inaccessible trashed revision and redirected to Edit Posts. Now deletes revision and redirects to Revision Queue. +* Fixed : manage_unsubmitted_revisions capability was required without any hint in plugin settings; Now not required unless configured in Revisions > Settings +* Fixed : Classic Editor - Javascript error breaks plugin compatibility +* Fixed : Gutenberg Editor - Top margin for Preview button following revision submission +* Fixed : Compare screen - could not approve revisions +* Fixed : Compare screen - ampersands in user display name were displayed with html encoding +* Fixed : Revision Queue - Revisions from deactivated post types were listed with invalid Edit, Delete links and a blank Post Type +* Fixed : Compare Revisions - Preview / Restore button for past revisions linked back to Compare screen +* Fixed : Input sanitization consistency +* Change : Revision preview top bar styling +* Compat : LifterLMS - LLMS query filters broke Revision Queue +* Compat : WPML - Database error in Revision Queue +* Fixed : Revision Queue: PHP error on bulk action under some site configurations + += 3.0.6 - 29 Nov 2021 = +* Fixed : Edit Revision - revisions could not be updated unless SCRIPT_DEBUG is enabled on the site +* Fixed : Revisions could not be scheduled if Settings > Revisions > Revision Submission is disabled + += 3.0.5 - 23 Nov 2021 = +* Fixed : Published custom post types not listed to Revisors under some configurations (Permissions integration requires Permissions 3.6.4) +* Fixed : Multisite - network-wide settings screens were non-functional + += 3.0.4 - 19 Nov 2021 = +* Fixed : New Revision button not displayed in Admin Bar +* Fixed : Revision Queue: revisions not listed in My Activity view + += 3.0.3 - 18 Nov 2021 = +* Fixed : Revisions Queue empty on sites with a large number of published posts +* Compat : WooCommerce - Hide Product Variations, Linked Products tabs when editing a Product Revision + += 3.0.2 - 15 Nov 2021 = +* Compat : PublishPress Permissions - Revisions Submission permissions did not correctly adjust Edit Posts / Pages listing in some configurations (also requires Permissions 3.6.3) +* Compat : The Events Calendar - Revisions could not be submitted in Classic Editor +* Fixed : Classic Editor - Schedule button was incorrectly displayed (leading to failed scheduling attempt) if a single time element is changed followed by OK button +* Fixed : Scheduled Revisions could not be updated in Gutenberg editor +* Fixed : Admin Bar button "New Revision" was displayed even if Submitted Revisions are disabled +* Fixed : Revision Queue: bulk deletion did not reduce revision counts +* Fixed : Duplicate page selection dropdown in Quick Edit and other instances of wp_dropdown_pages() +* Fixed : Invalid page hierarchy and broken Pages admin if a past revision that was originally submitted through the Revisions plugin is restored +* Fixed : Revision Preview was missing "Approve" button caption if revision is of an unpublished post +* Change : Revisions Settings - clarify some captions + += 3.0.1 - 10 Nov 2021 = +* Fixed : Revisions created using Revisions 2.x were not listed in Revision Queue until plugin de/re-activation +* Fixed : Front Page setting was cleared at revision submission on some sites +* Fixed : Front Page setting dropdown in Settings > Reading included revisions +* Fixed : Classic Editor : Schedule Revisions could not be submitted +* Fixed : Classic Editor : Schedule button was displayed incorrectly while selecting a future date for scheduled revision +* Compat : Gutenberg plugin - Edit Revision screen crashed on update attempt +* API: Allow redirect to be disabled on revision creation + += 3.0 - 9 Nov 2021 = +* Feature : New revision submission mechanism: create an unsubmitted revision first instead of editing existing post. Edit revision directly, then submit for scheduling or publication. +* Change : Revisions UI in Post / Revision editor +* Feature : Admin Bar includes "New Revision" button +* Change : Revision Queue filter captions +* Compat : Permissions - revise_others_posts, revise_others_pages, etc. capabilties are equivalent to list_others capabilities in allowing uneditable items to be listed +* Change : Include upload_files capability in the Revisor role + += 2.6.3 - 11 Oct 2021 = +* Fixed : Classic Editor - Error submitting a pending or scheduled revision + += 2.6.2 - 7 Oct 2021 = +* Change : Maintenance queries run at plugin activation to convert version 3.0 revisions back to 2.6 encoding +* API : Support for WPML Translation Management support in Pro version + += 2.6.1 - 15 Jul 2021 = +* Fixed : Pending / Scheduled Revisions could become disassociated from main post due to third party plugin interactions +* Compat : Permissions - Specific Permissions were not applied for editing / approval of custom post types under some conditions +* Fixed : Revision Update triggered redirect back to Revision Queue even if "Confirmation redirect on Revision Update" setting disabled +* Fixed : Users without full editing capabilities could not submit a pending revision with a future date selection +* Fixed : Revision Previews were cached on some browsers +* Fixed : Preview of front page revisions did not trigger front page template display +* Fixed : Bulk Approval of revisions failed / caused PHP Notice on some sites due to post type not being registered early enough +* Fixed : Pending Revision checkbox default selection from 'revisionary_default_pending_revision' filter application did not trigger revision submission +* Lang : Revision Queue - Remove sample English translation "My Revisionz" + += 2.6 - 23 Jun 2021 = +* Fixed : Background fatal error on some sites on revision scheduling +* Fixed : Scheduled Page Revisions - If published page has a non-default template which was not changed in the revision, the Compare and Edit Revision screens indicated a change to default template. This change was not actually applied unless the stored revision was updated prior to publication. +* Feature : Option to send notifications on Revision Update +* Feature : Option to redirect to confirmation screen after Revision Update +* Compat : Custom Permalinks plugin +* API : New filters allow submission confirmation message to be customized: revisionary_submit_message_links, revisionary_submit_message, revisionary_schedule_message_links, revisionary_schedule_message + += 2.5.5 - 26 May 2021 = +* Compat : Google Web Stories - Loss of story data due to clearance of post_content_filtered column +* Fixed : Fatal error in post editor on sites that apply filter "rest_{$post_type}_collection_params" incorrectly (Uncaught ArgumentCountError: Too few arguments to function) +* Fixed : PHP Warning on rvy_is_full_editor() call under some configurations +* Change : Revision Queue - Standard link coloring (like Edit Posts) + += 2.5.4 - 6 May 2021 = +* Fixed : Database error on Revision approval - Unknown column 'filter' in 'field list' for query UPDATE `wp_posts` SET `post_author` = +* Compat : TablePress - Tables could not be updated by non-Administrators + += 2.5.3 - 6 Apr 2021 = +* Compat : WP Rest Cache - Revision submission from Gutenberg failed +* Compat : PublishPress Permissions - Edit Category / Term: Permissions metaboxes were not displayed +* Compat : PublishPress Permissions - Pending Revision Monitors group ineffective; notifications were sent to all Editors and Administrators (also requires PublishPress Permissions 3.5.1) +* Compat : Enable revisioning of non-public post types if they have type-specific capabilities defined + += 2.5.2 - 30 Mar 2021 = +* Fixed : Fatal error due to incorrect vendor library load request + += 2.5.1 - 30 Mar 2021 = +* Fixed : Revisors could not preview other users' pending revisions, even if they are listed in Revision Queue (Permissions integration requires 3.5.1) +* Fixed : Post Title changes were not applied at revision publication +* Fixed : Database error on revision publication, on some installations +* Fixed : Compare Revisions - uneven column widths with WordPress 5.7 +* Feature : Option to update modified date on revision publication +* Compat : PublishPress - Custom Status dropdown was hidden in post editor +* Compat : Kinsta object cache - Revision submission using "Save as Revision" checkbox failed +* Compat : Kinsta object cache - Revision submission clears Featured Image from published post + += 2.5 - 4 Mar 2021 = +* Fixed : After a Pending Revision is published, Compare Revisions screen for past revisions did not order it correctly +* Fixed : Revisors could not access Compare Revisions screen unless PublishPress Permissions was active +* Fixed : Some attachment fields implemented by third party plugins were not saved to Pending Revisions +* Fixed : Revision submission - "submit another revision" link (following future date selection) led to submission failure on some sites +* Compat : Advanced Custom Fields - attachment image fields were cleared out of new revision +* Compat : REST API Cache - "Save as Revision" checkbox ineffective on some installations +* Compat : PublishPress - Editing a revision caused it to be converted to a non-revision draft +* Compat : PublishPress - Custom Status module interfered with Revisions scripts on Edit Revision screen +* Compat : PublishPress - Adding an Editorial Comment on the Edit Revision screen, then updating, caused revision to become inaccessible +* Compat : Some third party plugin interactions could cause Revision publication to fail, leaving published page unreadable +* Change : Display a Revisions link (for past revisions) in Classic Editor for Revisor +* Lang : Add Swedish translation + += 2.4.9 - 14 Jan 2021 = +* Compat : REST API Cache - REST caching failed for attachments +* Fixed : Non-public post types displayed ineffective preview link. Now suppress link or link to Compare Revisions screen instead. +* Fixed : Error loading Revisions > Settings page if nullstring license key is stored, on some installations +* Fixed : Deprecated jQuery event handlers +* Feature : Display notice to Revisor if they have already submitted a revision (in Gutenberg only if constant REVISIONARY_GUTEN_NOTICE defined) +* Change : Enable Compare Revisions link (for past revisions) in page editor for Revisor + += 2.4.8 - 17 Dec 2020 = +* Compat : WPML - Revision Queue was not filtered by WPML language selector +* Compat : WPML - Hide non-revisionable Languages settings in Revision editor +* Compat : TablePress - Tables could not be updated by non-Administrators +* Fixed : Revision Queue - PHP Notice if no revisions listed + += 2.4.7 - 15 Dec 2020 = +* Fixed : WP 5.6 - Pending Revision submission failed (since 2.4.6) +* Fixed : Compare Pending Revisions always credited assigned post author for Current Revision, now shows user who created the last published update. To revert to previous behavior, define constant RVY_LEGACY_COMPARE_REVISIONS_AUTHOR_DISPLAY. +* Change : Clarify captions for permissions-related checkboxes in Revisions > Settings > Revision Queue +* Compat : PublishPress Capabilities - organize Revisions capabilities into own area + += 2.4.6 - 8 Dec 2020 = +* Lang: Include a .pot file (translation template) +* Fixed : If no revisions are accessible to user, all revisions were listed in Revision Queue +* Fixed : Post deletion triggered revision submission redirect under some conditions +* Compat : REST API Cache plugin - "Save as Revision" checkbox was ineffective +* Compat : PublishPress Authors - revision submission failed under some conditions + += 2.4.5 - 30 Nov 2020 = +* Compat : WP Engine, Kinsta object cache - "Pending Revision" checkbox was ineffective +* Compat : PublishPress Permissions - Revision editing or deletion was improperly blocked under some configurations +* Fixed : Revision submission by Administrator or Editor caused corruption of published block content (by slash removal) on some installations +* Fixed : Edit Revision screen did not display Approve Revision button to users who cannot delete the revision +* Fixed : Revision Queue - other plugin / theme filters could cause all revisions to be listed when a requested published post has no accessible revisions +* Fixed : Revision Queue - filter links worked, but had original URL reconstructed incorrectly +* Fixed : Revision Queue - pagination links had badly formatted arguments if a filtering argument is active +* Fixed : Revisors had non-applicable elements hidden in post editor, but orphaned labels for those elements remained visible +* API : New filter 'revisionary_notify_publishers_eligible' to modify eligible "Publishers to Notify" when Email Notification is optional +* API : New filter 'revisionary_notify_publisher_default_ids' to modify default "Publishers to Notify" when Email Notification is optional + += 2.4.4 - 18 Nov 2020 = +* Fixed : Revision submission caused Post Thumbnail to be cleared from the published post +* Fixed : Revision submission by a Revisor caused corruption of published block content (by slash removal) on some installations +* Fixed : Compare Past Revisions - Editors did have "Preview / Restore" or "Manage" buttons + += 2.4.3 - 5 Nov 2020 = +* Compat : Polylang - language settings were not stored to revision (Fix also applies to other plugins using hidden taxonomies) +* Compat : Project Nami (Microsoft SQL Server / ODBC) - No confirmation redirect on revision submission +* Lang : Added .pot file + += 2.4.2 - 26 Oct 2020 = +* Compat : PublishPress Permissions - Users assigned Revise permissions for specific pages or categories could not compare Pending Revisions +* Compat : PublishPress Permissions Pro - With Status Control module active, Edit Revision screen had invalid "Workflow" button (also requires Permissions Pro 3.3.8) +* Compat : Public Post Preview - Author selector was hidden in post editor +* Compat : Public Post Preview - Make public post previews of published posts redirect to the published post +* Change : Revision Settings - Revision Queue section, includes "Compatibility Mode" setting to prevent revisions from being hidden from the queue in the case of plugin integration issues +* Fixed : "Prevent Revisors from editing others' revisions" setting was not applied +* Fixed : Error when Revision submission includes a template setting +* Fixed : Custom plugins path caused PHP error +* Fixed : Revison Queue - PHP Notice "Undefined variable: post_id" when URL includes published_post argument +* Feature : If Revisors are blocked from editing other users' drafts, those can now be included (unclickable) in Edit Pages if the list_others_pages capability is granted +* Feature : Support constant definitions REVISIONARY_DISABLE_SUBMISSION_REDIRECT, REVISIONARY_DISABLE_SCHEDULE_REDIRECT +* Feature : New filters "revisionary_do_submission_redirect", "revisionary_do_schedule_redirect" + += 2.4.1 - 9 Oct 2020 = +* Compat : PublishPress Permissions - On new post creation, Revisors get a Publish button instead of a Submit button. Publishing fails; the only way to submit successfully is Save Draft, then Submit for Review. +* Compat : PublishPress Permissions - Revisions were not listed in Queue under some configurations with PublishPress Permissions active +* Fixed : With pre-Publish checks enabled in Gutenberg, after first save "Pending Revision" checkbox was moved off of pre-Publish Panel + += 2.4 - 1 Oct 2020 = +* Fixed : Revisors and other limited editors had editor elements hidden when adding a new post, under some site configurations +* Fixed : Revision publication always set post publish date to current time. Now does only with enabled setting Revisions > Settings > Pending Revisions > Update Publish Date +* Fixed : Classic Editor - after Preview Changes is clicked, limited editors see "Submit Revision" button recaptioned to "Update" +* Compat : PublishPress Authors - Authors could not be changed on Edit Revision screen with Gutenberg editor if PublishPress is also active +* Compat : Gutenberg Ramp - Revision submission UI did not load for post types that have Gutenberg enabled + += 2.3.12 - 27 Aug 2020 = +* Fixed : WP 5.5 - Post previews did not display correctly for Revisors +* Fixed : Pending, Scheduled revisions not listed in Revision Queue following mirroring of posts database table from another installation (or possibly under other conditions) +* Fixed : Editorial Comments added on "Edit Revision" screen did not trigger email notification to post author or revision author +* Feature : Option to copy revision's editorial comments over to published post (at revision publication) + += 2.3.11 - 13 Aug 2020 = +* Compat : WP 5.5 - "Pending Revision" checkbox sometimes ineffective +* Compat : WP 5.5 - Posts with pending or scheduled revisions stored had misplaced links in Gutenberg editor sidebar +* Compat : WP 5.5 - With Classic Editor, javascript errors in post editor +* Compat : WP 5.5 - PHP warning on post edit (deprecated function escape_attribute) +* Compat : WP 5.5 - Edit Revision screen - Duplicate Preview link, misaligned +* Compat : WP 5.5 - Edit Revision screen - View / Approve link misaligned +* Fixed : "Has Revision" post state displayed for posts that have comments but no revisions (since 2.3.10) +* Fixed : Scheduled revisions were not published under some conditions (since 2.3.9) +* Fixed : In some conditions, fatal error on Plugins screen + += 2.3.10 - 10 Aug 2020 = +* Fixed : Revisions submitted without modifying tags had tags removed +* Feature : Edit Posts screen - display "Has Revision" as a post state after post title + += 2.3.9 - 6 Aug 2020 = +* Fixed : Featured Image was removed from pending revision at creation +* Fixed : Scheduled revision publication failed under some conditions, caused post to be unpublished +* Fixed : Scheduled revisions could not be published ahead of schedule using "Publish Now" link on preview (since 2.3.4) +* Lang : Add German translation +* API : New filter 'revisionary_apply_revision_data' to adjust standard revision fields prior to publication + += 2.3.8 - 30 Jul 2020 = +* Feature : Revision Queue - new bulk action to Unschedule selected revisions +* Lang : Add Spanish translation +* Fixed : Revisors could not preview changes prior to submitting a pending revision +* Fixed : Classic Editor plugin - when "Edit (Classic)" link is used, Revisors did not have Update button recaptioned to "Submit Revision" +* Fixed : API - revisionary_enabled_post_types filter was not fully effective +* Compat : Public Post Preview - support preview link generation on Edit Revision screen + += 2.3.6 - 10 Jun 2020 = +* Fixed : After revision submission, preview link was not always to latest revision +* Fixed : Preview button on editor screen loaded preview with invalid thumbnail under some conditions +* Fixed : When network-activated, Network Settings menu item loaded site-specific settings screen + += 2.3.5 - 29 May 2020 = +* Fixed : Compare link on Editor screen linked to Edit Posts screen instead of Compare Revisions + += 2.3.4 - 29 May 2020 = +* Fixed : Duplicate email notifications to users who have more than one WordPress role +* Change : Suppress email notification when an Administrator or Editor creates a pending revision, if constant REVISIONARY_LIMIT_ADMIN_NOTIFICATIONS is defined +* Compat : Relevanssi - Scheduled revisions were not published with Relevanssi active +* Fixed : Scheduled revision publication caused other scheduled revisions (for the same post) to be hidden from Revision Queue +* Fixed : has_revisions postmeta flag was not cleared when a post's last revision was deleted +* Fixed : Revision Queue - Search function did not work +* Fixed : Revision Queue link in Edit Posts / Edit Pages row was not removed after post's last pending or scheduled revision published or deleted + += 2.3.3 - 14 May 2020 = +* Compat : PublishPress Permissions - Fatal error on post creation + += 2.3.2 - 12 May 2020 = +* Fixed : Post meta flag "_rvy_has_revisions" was not cleared after last remaining pending / scheduled revision was published or deleted, affecting Revision Queue performance +* Fixed : Revision Queue listed uneditable revisions under some conditions +* Fixed : My Published Posts count was wrong under some conditions +* Fixed : Dashboard At a Glance link for Pending Post Revisions linked to Revision Queue without filtering display to Posts only +* Compat : PublishPress Permissions - suppress Permissions metaboxes on Edit Revision screen +* Fixed : Published post content cleared on pending revisions submission, on a minority of installations + += 2.2.4 - 6 Apr 2020 = +* Fixed : Possible fatal error loading Revisions screen on a small percentage of installations + += 2.2.3 - 3 Apr 2020 = +* Fixed : Classic Editor - Category and Post Tag revisions were not applied + += 2.2.2 - 2 Apr 2020 = +* Feature : Option to disable revision preview links for non-Administrators (to work around themes that force a 404 Not Found response) +* Fixed : Inline styles were stripped or modifield on scheduled revision publication +* Fixed : Possible fatal error loading Revisions screen on a small percentage of installations +* Fixed : PHP Notice for deprecated function contextual_help_list() +* Change : Standardize sanitization of database queries +* API: revisionary_enabled_post_types filter was not applied consistently +* Compat : CMS Tree Page View - Suppress Pending Revisions and Scheduled Revisions from Page Tree View + += 2.2.1 - 16 Mar 2020 = +* Fixed : Page Template was cleared on revision submission in some installations +* Fixed : Revision Queue - "Filter" link was ineffective in showing only revisions of the selected published post. This also applies to "View Revision Queue" link after revision creation. +* Fixed : Edit Revision - Move to Trash button did not work (and created new pending revision) +* Fixed : Duplicate email notifications for scheduled revision publication on some installations +* Fixed : Safeguard to prevent duplicate email notifications +* Feature : Plugin API - new filter 'revisionary_mail' allows adjustment to notification email address, title or message (or blockage of a particular email) +* Change : Pro top banner on Revisions screens +* Compat : New setting "Revision publication triggers API actions to mimic post update" causes save_post and transition_post_status actions to fire on revision publication +* Compat : Yoast SEO - Revision submission stripped accented characters and emojis out of FAQ block +* Compat : On revision publication, trigger 'transition_post_status' action, for plugins that use it + += 2.2 - 12 Feb 2020 = +* Feature : Email Notification - option to notify Editors and Administrators when a Pending Revision is approved +* Fixed : Block Editor - Custom Taxonomies, if unchanged, were not saved to revision. Publication of revision cleared custom taxonomies for published post. +* Fixed : Block Editor - Error setting Featured Image +* Fixed : Revisions submitted by Administrators or Editors using "Pending Revision" checkbox caused published post title and content to be cleared if a future publish date was also selected +* Compat : PublishPress Permissions Status Control - "Prevent Revisors from editing other users' drafts" setting also prevented other non-Editors from editing posts of a custom workflow status that uses custom capabilities (also requires PP Permissions Pro 2.9.1) +* Compat : Block data from some plugins had html formatting tags displayed as unicode character codes +* Fixed : Edit Revision screen - Date selector was displayed even if scheduled revisions feature disabled +* Fixed : Compare Pending Revisions - Non-administrators could not edit Scheduled Revisions +* Fixed : Compare Pending Revisions - for page slug change, original published slug was not displayed +* Fixed : 'revisionary_skip_taxonomies' filter triggered a database error +* Fixed : PHP Notice if third party code registers a post type without defining the edit_published capability +* Fixed : PHP Notices on revision submission notification +* Change : By default, enable "Prevent Revisors from viewing others'" setting +* Change : Apply possible workaround for Revision Queue capability issues on some sites + += 2.1.8 - 15 Jan 2020 = +* Fixed : Custom Post Types did not have Pending Revisions or Scheduled Revisions available (since 2.1.7) +* Lang : Correct textdomain on numerous translation calls +* Lang : Improve translation string construction +* Lang : Support translation of Revisor role name +* Lang : Updated language files + += 2.1.7 - 13 Jan 2020 = +* Fixed : Excessive resource usage with some caching solutions +* Fixed : Multisite - Super Administrators without a site role could not access Revision Queue +* Fixed : Classic Editor - After updating a revision, "View Post" message linked to published post instead of revision preview +* Feature : New filter 'revisionary_enabled_post_types', unset post types by key to disable PP Revisions involvement + += 2.1.6 - 23 Dec 2019 = +* Fixed : Edit Revision - Classic Editor "Approve" button ineffective +* Fixed : Edit Revision - Classic Editor "View / Approve" button loaded live preview (of unsaved changes) instead +* Compat : By default, prevent third party post query filtering on Revision Queue (to avoid non-display of Revisions) +* Compat : PressPermit Pro - Updating a saved revision caused it to be changed to a regular pending post + += 2.1.5 - 11 Dec 2019 = +* Compat : PressPermit Pro - Pending revision previews could be viewed by any user (including anonymous) if "Prevent Revisors from viewing others' revisions" disabled (since 2.1.4) +* Fixed : Contributors had other users' uneditable, unreadable revisions listed in Revision Queue +* Fixed : Revision Preview - Under some configurations, users with read-only access to revisions had no top bar in revision preview display +* Fixed : Revision Preview - Under some role configurations, users saw an ineffective "Publish" button in preview top bar +* Fixed : PHP warning for undefined index 'preview' + += 2.1.4 - 10 Dec 2019 = +* Fixed : Revision previews were not displayed to Editors under some configurations +* Feature : Separate settings for "Prevent Revisors from editing others'" and "Prevent Revisors from viewing others'" + += 2.1.3 - 6 Dec 2019 = +* Compat : Classic Editor plugin - View / Approve buttons missing on Edit Revision screen if Classic Editor active but settings default to Block Editor +* Compat : Classic Editor plugin - Javascript errors on Edit Post / Edit Revision screen if Classic Editor active but currently using Block Editor +* Compat : Thin Out Revisions plugin broke Preview / Approval buttons on Compare Pending Revisions screen +* Compat : Multiple Authors - Revision Queue "Post Author" links did not work for secondary authors +* Compat : Multiple Authors - Revision Queue "Post Author" links did not filter Revision Queue +* Compat : JReviews - Live preview from Edit Revision screen failed if JReviews plugin active +* Fixed : Preview Top Bar blocks admin bar dropdown menu if another fixed-position element on the page (other than #wpadminbar) has a z-index of 99999 or higher + += 2.1.2 - 4 Dec 2019 = +* Fixed : Scheduled Revisions were not published (since 2.1) +* Fixed : Edit Revision - Preview of unsaved revision did not work from Gutenberg +* Change : Edit Revision - Display "View / Approve" button if editor is unchanged from saved revision, otherwise "Preview" button for unsaved changes +* Fixed : Classic Editor - Preview caused "Update Revision" button to be recaptioned to "Save Draft" +* Feature : Support Post Slug revision +* Fixed : Other users' revisions were not listed in Revision Queue even if "Prevent Revisors from editing others' revisions" disabled +* Fixed : With "Prevent Revisors from editing others' revisions" setting enabled, Revisors and Authors could edit others' revisions by direct URL access +* Feature : Support list_others_revisions capability to grant read access to other users' revisions (applies if "Prevent Revisors from editing others' revisions" is enabled) +* Compat : PressPermit Pro - Revisors could not submit Beaver Builder revisions +* Compat : PressPermit Pro - Revision Exceptions ("Also these" category / taxonomy assignments) assigned to Authors were not applied correctly +* Compat : JReviews plugin + += 2.1.1 - 26 Nov 2019 = +* Compat : Multiple Authors - Fatal error on revision creation (since 2.1) + += 2.1 - 26 Nov 2019 = +* Feature : Bulk Approval / Publishing in Revision Queue +* Feature : Revision Edit: Approve Button on Editor screen +* Feature : Option for Approve, Edit buttons on Compare Revisions screen (instead of Preview button) +* Feature : Email Notification Buffer to avoid failures due to exceeding server send limits +* Fixed : Email Notification - For pending revision submission, submitter was misidentified on some sites +* Fixed : Revisors could restore previous revisions through manual URL access +* Fixed : Fatal error when WP_Privacy_Policy_Content::text_change_check() is triggered +* Fixed : "Pending Revision" checkbox was displayed in Gutenberg editor, even for unpublished posts +* Fixed : After clicking "Pending Revision" checkbox, unchecking did not prevent revision save +* Fixed : Revision Preview - unsaved changes to saved revision could not be previewed with WP 5.3 +* Fixed : Revision Preview - top bar for edit / approval was not displayed on some sites +* Change : Revision Preview URL - Default to using published post slug with revision page_id argument, for better theme compatibility. Option to use Revision slug or ID only. +* Fixed : Edit Revision screen links to published post discarded customized slug +* Fixed : Classic Editor - "View / Approve" link from Edit Revision screen loaded wrong preview URL and no top bar display for approval +* Fixed : Classic Editor - No preview button was available to Revisors +* Fixed : Classic Editor - Invalid Revisions > Browse link displayed to Revisors +* Compat : Classic Editor plugin - with "Allow users to switch editors" enabled, non-default editor did not have correct javascript loaded for Revisions +* Compat : On themes that use a fixed position header, display preview top bar above header +* Compat : PressPermit Pro - revision preview could not be viewed by Contributors under some configurations +* Fixed : On standard Compare Revisions screen (for past revisions), Preview and Manage button links did not update with slider selection change +* Fixed : Pending, Schedule Revision notification - invalid preview link in some emails +* Fixed : Trashed revisions were not identified as revisions in Edit Posts listing +* Fixed : Trashed revisions were not deleted on parent post deletion +* Fixed : Trashed revisions showed an invalid comment count value in Edit Posts listing +* Fixed : PHP Warning in Gutenberg editor when editing is not being limited to revision submission +* Compat : Multiple Authors - Compare Pending Revisions screen showed revisor as original post author under some conditions +* Compat : Multiple Authors - Revision submission / approval caused published post author to be changed to revisor, under some conditions +* Compat : Plugin interaction caused published post permalink custom slug to be replaced with default permalink structure at revision publication, on some sites +* Change : Revision Queue - recaption "My Posts" to "My Published Posts" + += 2.0.12 - 29 Oct 2019 = +* Fixed : Fatal error on Post Preview + += 2.0.11 - 28 Oct 2019 = +* Fixed : Classic Editor - Post Preview showed last stored copy, not unsaved changes +* Fixed : Revision Preview top bar covered admin menu dropdown +* Fixed : Revision Edit - live preview showed revision author instead of published author (if Multiple Authors plugin not active) + += 2.0.10 - 25 Oct 2019 = +* Fixed : Post Preview showed last stored copy, not unsaved changes +* Fixed : Post Preview (to view unsaved changes) was not available when editing a revision +* Fixed : Revision Preview - Buttons were not clickable with some themes +* Fixed : Filter revisionary_default_pending_revision was not effective in Gutenberg (check Save as Revision checkbox by default) +* Compat : Multiple Authors - Incorrect author display in revision previews on some sites +* Compat : PressPermit - Database error on Revision Queue screen under some configurations + += 2.0.9 - 18 Oct 2019 = +* Fixed : Compare Pending Revisions screen - link redirected to Edit Posts screen for some post types + += 2.0.8 - 18 Oct 2019 = +* Change : PostMeta Failsafe: to avoid the possibility of accidental clearance, Featured Image removal is not revisioned, until further testing. API filter available for experimental usage with specified meta keys. +* Fixed : Featured Image, Page Template revisioning failed under some conditions +* Fixed : Scheduled Revisions created with Gutenberg stored selected terms to published post, previous terms to revision +* Fixed : Scheduled Revisions - If "Update Publish Date" enabled, 404 Not Found redirect after manually publishing a scheduled revision if the post type uses post date in permalink structure +* Fixed : Revision Preview - Buttons were not clickable with some themes +* Fixed : Settings - Disabling Pending or Scheduled Revisions did not remove UI from post editor +* Fixed : Settings - If Pending Revisions disabled, Revisor could still edit published posts + += 2.0.7 - 17 Oct 2019 = +* Fixed : Scheduled Revisions - published post tags and categories were stripped out on scheduled revision publication +* Fixed : Scheduled Revisions - manually publishing prior to scheduled time caused published post status to be set to Future (unpublished) + += 2.0.6 - 17 Oct 2019 = +* Fixed : Featured Image and Page Template revisions were not applied (but did work in PublishPress Revisions Pro) +* Fixed : Publishing a revision imported from Revisionary 1.x caused tags and categories to be stripped out + += 2.0.5 - 16 Oct 2019 = +* Fixed : Import script for Revisionary 1.x revisions did not run on plugin activation +* Fixed : Administrators, Editors and Authors were blocked from Quick Edit +* Compat : Multiple Authors plugin +* Fixed : Pending Revisions - Published post date was not updated even if "Update Publish Date" setting enabled +* Change : Pending Revision Notification - Include link to Revision Queue +* Fixed : Pending Revision Notification - If enabled for author only, email was sent with a blank title and message +* Fixed : Empty Revision Queue was displayed to Subscribers with no Revision capabilities +* Fixed : PHP notices on Revision Queue screen + += 2.0.4 - 9 Oct 2019 = +* Change : On installation over Revisionary 1.x, display a "heads up" notice about plugin name change, admin menu and Revision Queue +* Fixed : Classic Editor - Revision Preview did not always include top bar (for Edit / Compare / Publish) if PressPermit Pro active +* Fixed : Revision Preview - Edit url did not work on installations with non-conventional admin paths, due to hardcoded /wp-admin +* Fixed : Schedule Revision notifications sent redundantly under some conditions +* Change : On Revision Edit, recaption Preview button to "View" to clarify that it's a preview of the saved revision, not unsaved changes. (Future release will make it a true preview). + += 2.0.3 - 3 Oct 2019 = +* Fixed : Revisionary settings could not be changed +* Fixed : Pending / Scheduled Revisions were listed in Revision Queue even if feature disabled in Revisions > Settings +* Fixed : On post edit for revision, Revisors could not see the current or newly selected Featured Image +* Fixed : On revision edit, Administrators and Editors did not have Trash button available +* Fixed : Revisors could edit or delete their scheduled revisions +* Fixed : Scheduled revision publication did not work with "Asynchronous publishing" setting enabled +* Fixed : After revision publication reloading, the old revision preview returned "Not Found". Now redirects to published post and marks as "Current Revision" +* Fixed : PHP Notices throughout wp-admin when WP_DEBUG enabled +* Change : Revision Queue headline indicates when results are being filtered by post type, revision status, revision author or post author + += 2.0.2 - 2 Oct 2019 = +* Fixed : On post date change in Gutenberg editor, Publish button was recaptioned to "Schedule Revision" even on a past date selection (unless SCRIPT_DEBUG enabled) + += 2.0.1 - 2 Oct 2019 = +* Fixed : Fatal error if another copy of Revisionary already active + += 2.0.0 - 1 Oct 2019 = +* Feature : Submit revisions to Categories, Tags, Custom Terms, Page Parent, Featured Image, Page Template +* Feature : Revisions editable in Gutenberg, Classic Editor +* Feature : Voluntary pending revision submission by unrestricted editors in Gutenberg +* Feature : Revision Queue screen is a sortable, filterable list of pending and scheduled revisions for all post types +* Feature : Revision Queue screen includes "My Revisions" and "My Posts" filtering links +* Feature : Revision Queue - Published Posts have "History" link to compare past revisions +* Feature : Compare Revisions - for past revisions, add button links for "Preview / Restore" and "Manage" +* Feature : Compare Pending Revisions using standard WordPress UI (link from Editor or Revision Queue) +* Feature : Compare Scheduled Revisions using standard WordPress UI (link from Editor or Revision Queue) +* Feature : Compare Pending / Scheduled Revisions shows changes to Categories, Tags, Terms, Page Parent, Featured Image, Page Template +* Change : Improved styling for revision preview / approval top bar +* Feature : "Update Publish Date" setting for Pending Revisions (defaults to disabled) + += 1.3.8 - 30 Aug 2019 = +* Fixed : Revisors could Quick Edit published posts (changing post title, slug, author, date, parent or template) since version 1.3. This could be used to unpublish (but not publish) posts. Sites also running PressPermit Pro were not affected. +* Compat : PressPermit Pro - Under some configurations, Revisors were not allowed appropriate access (due to publish capability check) + += 1.3.7 - 24 May 2019 = +* Feature : Filter 'revisionary_default_pending_revision', return true to select "Send to Approval Queue" in Classic Editor by default + += 1.3.6 - 30 Apr 2019 = +* Fixed : Scheduled Revision publication updated post date even if "Update Publish Date" option disabled +* Fixed : Gutenberg: Pending, Scheduled Revisions did not work for post types with show_in_rest property set false +* Fixed : PHP Notice if REST Posts query executed without a corresponding rest_base property set for post type +* Fixed : Better hiding of non-applicable sidebar metaboxes when post is being edited for Pending Revision + += 1.3.5 - 3 Apr 2019 = +* Fixed : With Classic Editor, Revision submission reset Page Template + += 1.3.4 - 2 Apr 2019 = +* Fixed : Pending Revision Notifications were not sent from Gutenberg editor if configured to send "by default" (selectable recipients) + += 1.3.3 - 2 Apr 2019 = +* Fixed : Scheduled Revision preview: "Publish Now" link failed with a fatal error +* Change : Settings link in Plugins Row + += 1.3.2 - 29 Mar 2019 = +* Fixed : Email notifications were missing "Post" / "Page" caption +* Fixed : PHP notices with Classic Editor +* Fixed : With Classic Editor, revision approval from preview did not redirect back to Edit Posts / Pages screen +* Fixed : In Classic Editor, setting a future date did not recaption Publish button to "Schedule Revision" if post has private visibility + += 1.3.1 - 29 Mar 2019 = +* Fixed : Scheduled Revision publication stripped out categories and tags, if "Update Publish Date" setting enabled +* Fixed : Publish button was not recaptioned to Submit Revision under some conditions +* Change : With Gutenberg active, revision approval defaults to front end preview +* Feature : Better redirect logic following revision approval, scheduling or restoration (returns to screen that preview was linked from) +* Feature : Preview link in Notification Emails +* Feature : Previews of Scheduled Revisions and Pending Revisions with a future publish date include link to Revisions Manager to edit date +* Change : Dismissable welcome message: To allow a user to submit Revisions to your published posts, set their role to "Revisor" + += 1.3.0 - 28 Mar 2019 = +* Feature : Gutenberg editor compatibility for Pending Revision, Scheduled Revision creation +* Feature : By default, Scheduled Revisions also update publish date. New checkbox on Revisions > Settings to restore previous behavior of leaving publish date unchanged. +* Feature : List Scheduled Revisions of any post type on Publishing Soon list in Activity dashboard widget +* Fixed : If Scheduled Revision was first site access after scheduled publication time, changes were not displayed until page reload +* Fixed : Scheduled post Revisions on Publishing Soon list in Activity dashboard widget had incorrect link +* Fixed : Past Revisions list on Revision Manager screen had invalid preview links +* Fixed : Better formatting for Publish Now / Schedule Now link +* Fixed : Editing revision publication date updated revision author, even if post content not changed +* Change : Use 12 hour format for revision dates +* Change : Pending Revision lists show submission date +* Change : Pending Revision lists show requested publication date if applicable + += 1.2.7 - 13 Mar 2019 = +* Fixed : Pending Revision Notification on Multisite installations. Due to failure to apply settings, e-mail notifications defaulted to "By default" option, which failed for Pending Revisions prior to version 1.2.6. +* Fixed : Multisite - If network-activated, Revisionary settings screens unavailable. Last stored network-wide settings (or hardcoded defaults) applied instead. +* Fixed : Multisite - If not network-activated, Revisionary settings screen was ineffective. Site-specific settings were stored, but network-wide settings or defaults applied instead. +* Fixed : "Display Hints" setting had no checkbox on Settings screen +* Change : Improved settings captions + += 1.2.6 - 13 Mar 2019 = +* Fixed : "Publishers to Notify" checkboxes were not displayed, and notifications not sent, if Email notification for Pending Revisions set to "By default" +* Fixed : Revision previews - PHP Warning and failure to output "Publish Now" header +* Change : Improved styling in "Publishers to Notify" metabox + += 1.2.5 - 25 Feb 2019 = +* Compat : TinyMCE Advanced - Failed to display editor on revision management screen +* Compat : Multisite - Incorrect site switching, prevents Yoast SEO from saving post meta + += 1.2.4 - 20 Feb 2019 = +* Compat : PublishPress - publish button was hidden +* Change : Capitalize "Save as Pending Revision" checkbox caption +* Lang : Update .po file + += 1.2.3 - 19 Feb 2019 = +* FIXED : Scheduled revision publication failure, massive redundant email notifications (since 1.2) + += 1.2.2 - 19 Feb 2019 = +* Fixed : Temporarily disable scheduled revision publication emails, due to recently reported issue +* Compat : PHP / coding standards - removed needless byref variable assignments +* Fixed : PHP notices when viewing revision differences + += 1.2.1 - 14 Feb 2019 = +* Compat : Fatal error when another plugin hooks into 'user_has_cap' filter + += 1.2 - 13 Feb 2019 = +* Compat : PHP 7.2 +* Compat : WordPress 5.0.3 +* Fixed : Revision approval reset page template setting to default +* Team : Revisionary is now owned and developed by PublishPress. The original author (Kevin Behrens) is excited to join forces in building and supporting effective tools for publishing teams. + += 1.1.13 - 13 May 2015 = +* Fixed : Previewing a Page revision from Revisions Manager screen caused fatal error / white screen +* Fixed : When Previewing a revision, Publish Now link was not formatted properly on TwentyFifteen theme +* Fixed : Pending Revision counts, links were not displayed in Dashboard At a Glance if PP Collaborative Editing plugin is not active +* Compat : Jetpack Markdown - publishing a revision caused post content to be stripped +* Compat : various caching plugins - post cache was not cleared after publishing a revision + += 1.1.12 - 23 Dec 2013 = +* WP 3.8 - Fixed Revisionary > Settings styling +* Fixed : Email notifications were not sent on Pending Revision submission under some configurations +* Fixed : Email notifications were not sent upon Scheduled Revision publishing unless Press Permit / Role Scoper active and Scheduled Revision Monitors group populated +* Change : On network installations, email notifications to administrators will include super admins if constant RVY_NOTIFY_SUPER_ADMIN is defined +* Fixed : Network-wide Revisionary Options could not be modified +* Fixed : Revisions on Edit Posts screen were displayed with stored post title, ignoring modifications by previous filters (such as translations) +* Fixed : Administrator did not have "save as pending revision" option when post is currently scheduled for publishing +* Fixed : Revision Diff formatting (column alignment) +* Fixed : Revision preview from Revisions Manager screen not displayed correctly under some configurations +* Change : Revisions Manager screen marks a revision as "Current" only if it is published +* Change : Better consistency with standard Revisions Manager behavior: post-assigned Revisor role is sufficient to edit others' revisions, but post-assigned Contributor role is not +* Change : Better consistency with standard Revisions Manager behavior: prevent diff display of unreadable revisions +* Change : When comparing revisions, if only one of the revisions is past, force it to left +* Change : On Revisions Manager screen, add margins to Update Revision button +* Fixed : PHP Notices for non-static function calls +* Compat : Role Scoper - when Pending Revision Monitors group is used and notification is "by default", recipient checkboxes missing on Edit Post form and TinyMCE broken +* Compat : Duplicate Right Now links on dashboard if Role Scoper or Press Permit active + +**1.1.11 - 18 Aug 2013** + += WP 3.6 Compatibility = +* WP 3.6 - Revisors could not submit revisions +* WP 3.6 - Don't modify native WP revision links +* WP 3.6 - In Publish metabox, re-caption Revisions as "Publication History" to distinguish from Pending Revisions (prevent this by defining constant RVY_PREVENT_PUBHIST_CAPTION) +* WP 3.6 - Post Title metabox was unformatted on Revisions Manager screen + += Email Notification = +* Fixed : Publishers to Notify metabox was displayed even if no selections available (when notification for both Publishers and Author is set to Always or Never) +* Fixed : PHP warning in Publishers to Notify metabox when a user has a very long name +* Change : If Press Permit or Role Scoper are active but Monitors group does not contain any users who can publish the post, notifications go to all WP Administrators and Editors who have sufficient site-wide capabilities (prevent this by defining constant RVY_FORCE_MONITOR_GROUPS) +* Change : On Revisionary Settings screen, expand caption to clarify email notification behavior + += General = +* Fixed : Revisors could not select desired publish date on Edit Post screen, even if Scheduled Revisions enabled +* Fixed : "save as pending" checkbox caused poor layout of adjacent UI in Publish metabox +* Perf : Eliminate some redundant queries on back-end for non-Administrators (especially with Press Permit or Role Scoper active) +* Compat : Edit Flow - don't offer to revise EF Metadata + += 1.1.10 - 29 May 2013 = +* SECURITY FIX : Revisions could be viewed by any registered user +* Feature : Option to prevent Revisors from viewing other user's drafts and regular pending posts (imposes edit_others_drafts cap requirement) +* Fixed : Other users' revisions were viewable in Revisions Manager even if option to prevent is enabled +* Fixed : "Publishers to Notify" metabox not displayed under some configurations +* Fixed : "Publishers to Notify" metabox was displayed with checkboxes even if Revisionary settings are for both editors and author to always receive notification +* Fixed : Email Notification for Pending Revision was not sent under some configurations +* Fixed : Monitor Groups (with Press Permit or Role Scoper activated) did not regulate email notifications +* Fixed : Users who cannot approve a revision received email notification under some configurations +* Fixed : PHP warnings for deprecated WP function calls +* Fixed : PHP warnings when "previewing" current revision +* Fixed : Invalid notifications were sent on revision submission error +* Fixed : JS warning on Edit Post form +* Compat : Press Permit Core +* Compat : Press Permit - revision previews could not be viewed by revisor (also requires PP Collaborative Editing 2.0.14-beta) +* Compat : CForms (and possibly other plugins) - tinyMCE buttons were suppressed + += 1.1.9 - 18 Jan 2012 = +* Compat : Press Permit - PP roles were not applied under some configurations +* Compat : Role Scoper - RS roles were not applied under some configurations (related fixes in RS 1.3.52) +* Fixed: PHP Warning for mysql_get_server_info() + += 1.1.8 - 20 Dec 2011 = +* Compat : Role Scoper - duplicate Pending counts in Dashboard Right Now +* API : new filter - rvy_hidden_meta_boxes +* API : new action: - rvy-revisions_sidebar +* API : new action - rvy-revisions_meta_boxes +* API : new action - revision_approved +* API : new action - post_revision_update + += 1.1.7 - 11 Nov 2011 = +* Compat : WP 3.3 - Revision Editor displayed redundantly, didn't work +* Compat : Press Permit integration +* Feature : By default, Revisor role does not enable editing other users' revisions (option to re-enable) +* Fixed : If Visual Editor is disabled, html entities not displayed or updated correctly in Revisions Manager +* Fixed : About Revisionary screen (linked from help menu) failed to display +* Fixed : Revision previews used wrong template under some configurations +* Fixed : Various PHP Notices + += 1.1.6 - 7 Sep 2011 = +* Fixed : Quick Edit was not disabled for Page Revisions, usage resulted in invalid revision data +* Fixed : Revisionary Options were not available when plugin activatated per-site on a Multisite installation +* Fixed : For Multisite installation, Revisionary Options on Sites menu caused a fatal error +* Change : For Multisite installation, Revisionary Options Blog/Site captions changed to Site/Network +* Fixed : Revised Post Title was not displayed in Revisions Manager +* Fixed : Various PHP Notices + += 1.1.5 - 29 June 2011 = +* Fixed : Markup error in Revisions Manager for Administrators / Editors, especially noticeable in WP 3.2 +* Fixed : "save as pending revision" checkbox in Publish metabox caused formatting error with IE9 +* Fixed : Previews did not display post thumbnail or other meta data +* Fixed : Previews could not be displayed for past revisions +* Compat : WP 3.2 - revision previews did not work +* Compat : WP 3.2 - preview link not displayed for Pending Revisions in edit.php listing +* Compat : Builder theme - previews of page revisions could not be displayed +* Compat : Events Calendar Pro - filtering fails when WP database prefix is non-default +* Change : Better styling for revision approval link displayed above preview +* Change : Remove Asynchronous Email option +* Change : Change all require and include statements to absolute path to work around oddball servers that can't handle relative paths +* Change : jQuery syntax change for forward compatibility + += 1.1.4 - 5 Apr 2011 = +* Fixed : Role Options, Role Defaults menu items were not available on 3.1 multisite +* Fixed : Pending / Scheduled Revisions could not be previewed by Revisors +* Fixed : "Submit Revision" button caption changed to "Update" or "Schedule" following publish date selection +* Fixed : PHP Warning on post creation / update +* Change : Hide Preview button from Revisors when editing for pending revision submission + += 1.1.3 - 3 Dec 2010 = +* Fixed : Autosave error message displayed while a revisor edits a published post prior to submitting a pending revision +* Fixed : Email notifications failed on some servers if Asynchronous option enabled +* Compat : Role Scoper - With RS 1.3 to 1.3.12, if another plugin (Events Manager) triggers a secondary edit_posts cap check when a Revisor attempts to edit another user's unpublished post, a pending revision is generated instead of just updating the unpublished post + += 1.1.2 - 29 Nov 2010 = +* Compat : Role Scoper - Post-assigned Revisor role was not honored to update another users' revision with RS 1.3+ +* Fixed : While in Revisions Manager, invalid "Revisions" submenu link was displayed in Settings menu + += 1.1.1 - 5 Nov 2010 = +* Fixed : Fatal Error if theme displays post edit link on front end +* Fixed : Did not observe capability definitions for custom post types (assumed capability_type = post_type) +* Compat : Event Calendar Pro - revisions of sp_events were not included in Edit Posts listing due to postmeta clause applied by ECP + += 1.1 - 2 Nov 2010 = +* Fixed : Revision Approval notices were not sent if "always send" option enabled +* Feature : "save as pending revision" option when logged user has full editing capabilities in Edit Post/Page form + += 1.1.RC3 - 29 Oct 2010 = +* Fixed : Revision preview link returned 404 (since 1.1.RC) +* Fixed : Revision Approval emails were not sent reliably with "Asynchronous Email" option enabled (since 1.0) +* Fixed : Custom taxonomy selection UI was not hidden when submitting a revision +* Fixed : In Quick Edit form, Published option sometimes displayed inappropriately + += 1.1.RC.2 - 11 Oct 2010 = +* Fixed : Listed revisions in Revision Editor were not linked for viewing / editing (since 1.1.RC) + += 1.1.RC - 8 Oct 2010 = +* Feature : Support Custom Post Types +* Change : Better internal support for custom statuses +* Fixed : On Options page, links to "Pending Revision Monitors" and "Scheduled Revision Monitors" were reversed +* Fixed : Revision Edit link from Edit Posts/Pages listing led to uneditable revision display +* Change : Raise minimum WP version to 3.0 + += 1.0.7 - 21 June 2010 = +* Fixed : Revisionary prevented the normal scheduling of drafts for first-time publishing + += 1.0.6 - 18 June 2010 = +* Compat : CForms conflict broke TinyMCE edit form in Revisions Manager + += 1.0.5 - 7 May 2010 = +* Compat : WP 3.0 Multisite menu items had invalid link + += 1.0.4 - 6 May 2010 = +* Fixed : Pending Revision Approval email used invalid permalink if permalink structure changed since original post storage +* Fixed : Schedule Revision Publication email used invalid permalink if permalink structure changed since original post storage + += 1.0.3 - 6 May 2010 = +* Compat : WP 3.0 elimination of page.php, edit-pages.php, page-new.php broke many aspects of page filtering +* Fixed : Trash link did not work for revisions in Edit Posts/Pages listing +* Change : Administrators and Editors now retain Quick Edit link for non-revisions in Edit Pages, Edit Posts listing +* Fixed : "Publishers to Notify" metabox was included even if no eligible recipients are designated + += 1.0.2 - 11 Mar 2010 = +* Fixed : Email notification caused error if Role Scoper was not activated +* Fixed : Database error message (nuisance) in non-MU installations (SELECT meta_key, meta_value FROM WHERE site_id...) +* Fixed : Publish Now link on Scheduled Revision preview did not work +* Fixed : With WP > 2.9, newly published revisions also remained listed as a Pending or Scheduled revision +* Fixed : With WP > 2.9, revision date selection UI showed "undefined" caption next to new date selection +* Fixed : Link for viewing Scheduled Revisions was captioned as "Pending Revisions" (since 1.0.1) +* Compat : WMPL plugin + += 1.0.1 - 6 Feb 2010 = +* Fixed : Submitting a Pending Revision to a published Post failed with Fatal Error +* Fixed : PHP short tag caused Parse Error on servers which were not configured to support it +* Compat : Support TinyMCE Advanced and WP Super Edit for custom editor buttons on Revision Management form +* Feature : Revision preview bar can be styled via CSS file +* Lang : Fixed several string formatting issues for better translation support +* Change : Use https link for Revisionary css and js files if ssl is being used / forced for the current uri + += 1.0 - 30 Dec 2009 = +* Feature : Use Blog Title and Admin Email as from address in revision notices, instead of "WordPress " +* Fixed : Revision Approval / Publication Notices used p=ID link instead of normal post permalink +* Compat : Display workaround instructions for FolioPress conflict with visual revision display + +**1.0.RC1 - 12 Dec 2009** +Initial release. Feature Changes and Bug Fixes are vs. Pending Revisions function in Role Scoper 1.0.8 + += General: = +* Feature : Scheduled Revisions - submitter can specify a desired publication date for a revision +* Feature : Any user with the delete_published_ and edit_published capabilities for a post/page can administer its revisions (must include those caps in RS Editor definitions and assign that role) +* Feature : Scheduled Publishing and Email notification is processed asynchronously + += Revisions Manager: = +* Feature : Dedicated Revisions Manager provides more meaningful captions, classified by Past / Pending / Scheduled +* Feature : RS Revision Manager form displays visually via TinyMCE, supports editing of content, title and date +* Feature : Revisions Manager supports individual or bulk deletion +* Feature : Users can view their own Pending and Scheduled Revisions +* Feature : Users can delete their own Pending Revisions until approval + += Preview: = +* Feature : Preview a Pending Revision, with top link to publish / schedule it +* Feature : Preview a Scheduled Revision, with top link fo publish it now +* Feature : Preview a Past Revision, with top link for restore it + += WP Admin: = +* Feature : Pending and Scheduled revisions are included in Edit Posts / Pages list for all qualified users +* Feature : Delete, View links on revisions in Edit Posts / Pages list redirect to RS Revisions Manager +* Feature : Add pending posts and pages total to Dashboard Right Now list (includes both new post submissions and Pending Revisions) +* Feature : Metaboxes in Edit Post/Page form for Pending / Scheduled Revisions +* Fixed : Multiple Pending Revions created by autosave +* Fixed : Users cannot preview their changes before submitting a Pending Revision on a published post/page +* Fixed : Pending Post Revisions were not visible to Administrator in Edit Posts list +* Fixed : Both Pending Page Revisions and Pending Post Revisions were visible to Administator in Edit Pages list +* Fixed : Pending Revisions were not included in list for restoration +* Fixed : Bulk Deletion attempt failed when pending / scheduled revisions were included in selection + += Notification: = +* Feature : Optional email (to editors or post author) on Pending Revision submission +* Feature : Optional email (to editors, post author, or revisor) on Pending Revision approval +* Feature : Optional email (to editors, post author, or revisor) on Scheduled Revision publication +* Feature : If Role Scoper is active, Editors notification group can be customized via User Group + +== Upgrade Notice == + += 1.2.3 = +Important Fix: Scheduled Revision publication failure with runaway email notifications (since 1.2) + += 1.1.10 = +SECURITY FIX: Revisions could be viewed by any registered user + += 1.1.5 = +Fixes: Markeup Err in Revisions Manager; Revision Previews (WP 3.2, Display of Post Thumbnail & other metadata, Past Revisions, Page Revisions in Builder theme, Approval link styling); IE9 formatting err in publish metabox; Events Calendar Pro conflict diff --git a/wp-content/plugins/revisionary/rest_rvy.php b/wp-content/plugins/revisionary/rest_rvy.php new file mode 100644 index 000000000..b5e37a440 --- /dev/null +++ b/wp-content/plugins/revisionary/rest_rvy.php @@ -0,0 +1,116 @@ +operation ) { + $post_type = get_post_field( 'post_type', $item_id ); + + if ( $type_obj = get_post_type_object( $post_type ) ) { + if ( $orig_cap == $type_obj->cap->read_post ) { + $orig_cap = 'edit_post'; + } + } + } + + return $orig_cap; + } + + function pre_dispatch( $rest_response, $rest_server, $request ) { + $this->method = $request->get_method(); + $path = $request->get_route(); + + foreach ( $rest_server->get_routes() as $route => $handlers ) { + if ( ! $match = @preg_match( '@^' . $route . '$@i', $path, $args ) ) + continue; + + foreach ( $handlers as $handler ) { + if ( ! empty( $handler['methods'][ $this->method ] ) && is_array($handler['callback']) && is_object($handler['callback'][0]) ) { + + $this->endpoint_class = get_class( $handler['callback'][0] ); + + $compatible_endpoints = apply_filters( + 'revisionary_rest_post_endpoints', + ['WP_REST_Posts_Controller', 'LD_REST_Posts_Gutenberg_Controller'] + ); + + if (!in_array($this->endpoint_class, $compatible_endpoints)) { + continue; + } + + $this->request = $request; + + $this->is_view_method = in_array( $this->method, array( WP_REST_Server::READABLE, 'GET' ) ); + + $post_id = self::get_id_element( $path ); + + if (is_numeric($post_id)) { + // back post type out of path because controller object does not expose it + $type_base = $this->get_path_element( $path ); + + $this->post_type = $this->get_type_from_rest_base( $type_base ); + $this->post_id = $post_id; + $this->is_posts_request = true; + } + } + } + } + + return $rest_response; + } // end function pre_dispatch + + public static function get_id_element( $path, $position_from_right = 0 ) { + $arr_path = explode( '/', $path ); + + $count = -1; + for( $i=count($arr_path) - 1; $i>=0; $i-- ) { + $count++; + + if ( $count == $position_from_right ) + return $arr_path[$i]; + } + + return ''; + } + + function get_path_element( $path, $string_num_from_right = 1 ) { + $arr_path = explode( '/', $path ); + + $count = 0; + for( $i=count($arr_path) - 1; $i>=0; $i-- ) { + if ( is_numeric( $arr_path[$i] ) ) + continue; + + $count++; + + if ( $count == $string_num_from_right ) + return $arr_path[$i]; + } + + return ''; + } + + private function get_type_from_rest_base( $rest_base ) { + if ( $types = get_post_types( array( 'rest_base' => $rest_base ) ) ) { + $post_type = reset( $types ); + return $post_type; + } elseif( post_type_exists( $rest_base ) ) { + return $rest_base; + } else { + return false; + } + } +} diff --git a/wp-content/plugins/revisionary/revision-creation_rvy.php b/wp-content/plugins/revisionary/revision-creation_rvy.php new file mode 100644 index 000000000..f18e2abf9 --- /dev/null +++ b/wp-content/plugins/revisionary/revision-creation_rvy.php @@ -0,0 +1,264 @@ +revisionary = $args['revisionary']; + } + } + + // @todo: status change handler for draft => future-revision + function flt_future_revision_status_change($revision_status, $old_status, $revision_id) { + if ('future-revision' == $revision_status) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_update_next_publish_date(['revision_id' => $revision_id]); + } + + if ('pending-revision' == $revision_status) { + $revision = get_post($revision_id); + + do_action('revisionary_submit_revision', $revision); + + /** + * Trigger after a revision creation. + * + * @param int $revision The revision object. + */ + do_action('revisionary_created_revision', $revision); + } + } + + function flt_pending_revision_data( $data, $postarr ) { + + if (rvy_is_revision_status($postarr['post_mime_type'])) { + if ($data['post_name'] != $postarr['post_name']) { + add_post_meta($revision_id, '_requested_slug', $data['post_name']); + $data['post_name'] = $postarr['post_name']; + } + } + + return $data; + } + + static function fltInterruptPostMetaOperation($interrupt) { + return true; + } + + // Create a new revision, usually 'draft-revision' (Working Copy) or 'future-revision' (Scheduled Revision) + + // If an autosave was stored for the current user prior to this creation, it will be retrieved in place of the main revision. + function createRevision($post_id, $revision_status, $args = []) { + global $wpdb, $current_user; + + $is_revision = rvy_in_revision_workflow($post_id); + + $main_post_id = $is_revision ? rvy_post_id($post_id) : $post_id; + + $published_post = get_post($main_post_id); + $source_post = get_post($post_id); + + $set_post_properties = [ + 'post_content', + 'post_content_filtered', + 'post_title', + 'post_excerpt', + 'comment_status', + 'ping_status', + 'post_password', + 'menu_order', + ]; + + $data = []; + + if (!$is_revision) { + if ($autosave_post = Utils::get_post_autosave($post_id, $current_user->ID)) { + if (strtotime($autosave_post->post_modified_gmt) > strtotime($source_post->post_modified_gmt)) { + $use_autosave = true; + $args['meta_post_id'] = $autosave_post->ID; + } + } + } + + foreach($set_post_properties as $prop) { + $data[$prop] = (!empty($use_autosave) && !empty($autosave_post->$prop)) ? $autosave_post->$prop : $source_post->$prop; + } + + $data['post_type'] = $source_post->post_type; + $data['post_parent'] = ($is_revision) ? $published_post->post_parent : $source_post->post_parent; + + if (!defined('REVISIONARY_LEGACY_REVISION_AUTHOR') && !empty($current_user) && !empty($current_user->ID)) { + $data['post_author'] = $current_user->ID; + } + + if (!empty($args['time_gmt'])) { + $timestamp = $args['time_gmt']; + $data['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $timestamp); + $data['post_date'] = gmdate( 'Y-m-d H:i:s', $timestamp + (int) ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS )); + } + + $args['main_post_id'] = $main_post_id; + + $revision_id = $this->insert_revision($data, $source_post->ID, $revision_status, $args); + + if (!empty($use_autosave)) { + $wpdb->delete($wpdb->posts, ['ID' => $autosave_post->ID]); + } + + if ('future-revision' == $revision_status) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_update_next_publish_date(['revision_id' => $revision_id]); + } + + if (!$revision_id || !is_scalar($revision_id)) { // update_post_data() returns array or object on update abandon / failure + return; + } + + $post = get_post($revision_id); + + $url = apply_filters('revisionary_create_revision_redirect', rvy_admin_url("post.php?post=$revision_id&action=edit"), $revision_id); + + if (!empty($args['suppress_redirect'])) { + return $revision_id; + } + + wp_redirect($url); + exit; + } + + private function insert_revision($data, $base_post_id, $revision_status, $args = []) { + global $wpdb, $current_user; + + $data['post_mime_type'] = $revision_status; + + switch($revision_status) { + case 'draft-revision': + $data['post_status'] = 'draft'; + + $data['post_date'] = current_time( 'mysql' ); + $data['post_date_gmt'] = current_time( 'mysql', 1 ); + break; + + case 'future-revision': + $data['post_status'] = 'pending'; + break; + + default: + $data['post_status'] = 'pending'; + } + + $main_post_id = (!empty($args['main_post_id'])) ? $args['main_post_id'] : $base_post_id; + + $base_post = get_post($main_post_id); + + if (!empty($base_post) && !empty($base_post->post_status) && ('revision' == $base_post->post_type)) { + $main_post_id = $base_post->post_parent; + + } elseif (!empty($base_post) && !empty($base_post->post_mime_type) && in_array($base_post->post_mime_type, ['draft-revision', 'pending-revision', 'future-revision'])) { + $main_post_id = $base_post->comment_count; + } + + $data['comment_count'] = $main_post_id; // buffer this value in posts table for query efficiency (actual comment count stored for published post will not be overwritten) + + $data['post_author'] = $current_user->ID; // store current user as revision author (but will retain current post_author on restoration) + + $data['post_modified'] = current_time( 'mysql' ); + $data['post_modified_gmt'] = current_time( 'mysql', 1 ); + + if ( $future_date = ! empty($data['post_date']) && ( strtotime($data['post_date_gmt'] ) > agp_time_gmt() ) ) { // in past versions, $future_date was also passed to get_revision_msg() + // round down to zero seconds + $data['post_date_gmt'] = date( 'Y-m-d H:i:00', strtotime( $data['post_date_gmt'] ) ); + $data['post_date'] = date( 'Y-m-d H:i:00', strtotime( $data['post_date'] ) ); + } + + // @todo: confirm this is still needed + $data['guid'] = ''; + $data['post_name'] = ''; + + $revision_id = wp_insert_post(\wp_slash($data), true); + + if (is_wp_error($revision_id)) { + return new \WP_Error(esc_html__( 'Could not insert revision into the database', 'revisionary')); + } + + $update_data = ('pending-revision' == $data['post_mime_type']) // + ? ['comment_count' => $main_post_id, 'post_modified_gmt' => $data['post_modified_gmt'], 'post_modified' => $data['post_modified']] + : ['comment_count' => $main_post_id]; + + $wpdb->update($wpdb->posts, $update_data, ['ID' => $revision_id]); + + /** + * Fired when a new revision is being inserted into the database. + * + * @param int $revision_id The ID of the inserted revision. + * @param int $main_post_id The ID of the published post for this revision. + * @param array $data The post data used to create this revision. + */ + do_action( 'revisionary_new_revision_inserting', $revision_id, $main_post_id, $data ); + + if (!defined('REVISONARY_CREATE_REVISION_NO_COMMENT_COUNT_UPDATE')) { + // Hack WP into updating the comment count to store the main post ID in the comment_count field. + add_filter( + 'pre_wp_update_comment_count_now', + function( $new, $old, $post_id ) use ( $revision_id, $main_post_id ) { + if ( (int) $revision_id === (int) $post_id ) { + return $main_post_id; + } + + return $new; + }, + 10, + 3 + ); + + // Update the comment count. + wp_update_comment_count_now( $revision_id ); + } + + // Use the newly generated $post_ID. + $where = array( 'ID' => $revision_id ); + + // make sure autosave still exists + if (!empty($args['meta_post_id'])) { + $post = get_post($args['meta_post_id']); + + if (empty($post) || empty($post->post_type)) { + unset($args['meta_post_id']); + } + } + + if (!empty($args['meta_post_id']) && apply_filters('revisionary_use_autodraft_meta', true, $data)) { + revisionary_copy_terms($args['meta_post_id'], $revision_id); + revisionary_copy_postmeta($args['meta_post_id'], $revision_id); + + // For taxonomies and meta keys not stored for the autosave, use published copies + revisionary_copy_terms($base_post_id, $revision_id, ['empty_target_only' => true]); + revisionary_copy_postmeta($base_post_id, $revision_id, ['empty_target_only' => true]); + } else { + // If term selections are not posted for revision, store current published terms + revisionary_copy_terms($base_post_id, $revision_id); + revisionary_copy_postmeta($base_post_id, $revision_id); + } + + rvy_update_post_meta($revision_id, '_rvy_base_post_id', $base_post_id); + + if (!defined('REVISIONARY_LIMIT_IGNORE_UNSUBMITTED')) { + rvy_update_post_meta($base_post_id, '_rvy_has_revisions', true); + } + + // Set GUID. @todo: still needed? + if ( '' == get_post_field( 'guid', $revision_id ) ) { + // need to give revision a guid for 3rd party editor compat (post_ID is ID of revision) + $wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $revision_id ) ), $where ); + } + + $data['ID'] = $revision_id; + do_action('revisionary_new_revision', $revision_id, $revision_status); + + return (int) $revision_id; // only return array in calling function should return + } +} diff --git a/wp-content/plugins/revisionary/revision-workflow_rvy.php b/wp-content/plugins/revisionary/revision-workflow_rvy.php new file mode 100644 index 000000000..67f5a5777 --- /dev/null +++ b/wp-content/plugins/revisionary/revision-workflow_rvy.php @@ -0,0 +1,330 @@ +content_roles->ensure_init(); + + if ( $publisher_ids = $revisionary->content_roles->get_metagroup_members( 'Pending Revision Monitors' ) ) { + if ( $type_obj ) { + $cols = ( defined('COLS_ALL_RS') ) ? COLS_ALL_RS : 'all'; + $post_publishers = $revisionary->content_roles->users_who_can( 'edit_post', $object_id, array( 'cols' => $cols, 'force_refresh' => true, 'user_ids' => $publisher_ids ) ); + + $can_publish_post = array(); + foreach ( $post_publishers as $key => $user ) { + $can_publish_post []= $user->ID; + + if ( ! in_array( $user->ID, $publisher_ids ) ) + unset( $post_publishers[$key] ); + } + + $publisher_ids = array_intersect( $publisher_ids, $can_publish_post ); + $publisher_ids = array_fill_keys( $publisher_ids, true ); + } + } + } + + if ( ! $publisher_ids && ( empty($monitor_groups_enabled) || ! defined('RVY_FORCE_MONITOR_GROUPS') ) ) { + // If RS is not active, default to sending to all Administrators and Editors who can publish the post + require_once(ABSPATH . 'wp-admin/includes/user.php'); + + if ( defined( 'SCOPER_MONITOR_ROLES' ) ) + $use_wp_roles = SCOPER_MONITOR_ROLES; + else + $use_wp_roles = ( defined( 'RVY_MONITOR_ROLES' ) ) ? RVY_MONITOR_ROLES : 'administrator,editor'; + + $use_wp_roles = str_replace( ' ', '', $use_wp_roles ); + $use_wp_roles = explode( ',', $use_wp_roles ); + + $recipients = array(); + + foreach ( $use_wp_roles as $role_name ) { + $search = new WP_User_Query( "search=&role=$role_name" ); + $recipients = array_merge( $recipients, $search->results ); + } + + foreach ( $recipients as $_user ) { + $reqd_caps = map_meta_cap( 'edit_post', $_user->ID, $object_id ); + + if ( ! array_diff( $reqd_caps, array_keys( array_intersect( $_user->allcaps, array( true, 1, '1' ) ) ) ) ) { + $post_publishers []= $_user; + $publisher_ids [$_user->ID] = true; + } + } + } + + // boolean array with user IDs as array keys + $default_ids = apply_filters('revisionary_notify_publisher_default_ids', $publisher_ids, $object_id); + } + + if ( '1' === $notify_author ) { + global $post; + + if (function_exists('get_multiple_authors')) { + $author_ids = []; + foreach(get_multiple_authors($post) as $_author) { + $author_ids []= $_author->ID; + } + } else { + $author_ids = [$post->post_author]; + } + + foreach($author_ids as $author_id) { + if ( empty( $default_ids[$author_id] ) ) { + if ( defined('RVY_CONTENT_ROLES') ) { + $cols = ( defined('COLS_ALL_RS') ) ? COLS_ALL_RS : 'all'; + $author_notify = (bool) $revisionary->content_roles->users_who_can( 'edit_post', $object_id, array( 'cols' => $cols, 'force_refresh' => true, 'user_ids' => (array) $author_id ) ); + } else { + $_user = new WP_User($author_id); + $reqd_caps = map_meta_cap( 'edit_post', $_user->ID, $object_id ); + $author_notify = ! array_diff( $reqd_caps, array_keys( array_intersect( $_user->allcaps, array( true, 1, '1' ) ) ) ); + } + + if ( $author_notify ) { + $default_ids[$author_id] = true; + + $user = new WP_User( $author_id ); + $post_publishers[] = $user; + } + } + } + } + + if ($default_ids) { + // array of WP_User objects + $post_publishers = apply_filters('revisionary_notify_publishers_eligible', $post_publishers, $object_id); + } + + return compact('default_ids', 'post_publishers', 'publisher_ids'); + } + + function do_notifications( $notification_type, $status, $post_arr, $args ) { + global $revisionary, $current_user; + + if ( 'pending-revision' != $notification_type ) { + return; + } + + $defaults = array( 'revision_id' => 0, 'published_post' => false, 'object_type' => '', 'selected_recipients' => array() ); + $args = array_merge( $defaults, $args ); + foreach( array_keys($defaults) as $var ) { $$var = $args[$var]; } + + $revision_id = (int) $revision_id; + $object_type = sanitize_key($object_type); + + if ( ! $published_post ) { + return; + } + + // Support workaround to prevent notification when an Administrator or Editor voluntarily creates a pending revision + if (defined('REVISIONARY_LIMIT_ADMIN_NOTIFICATIONS') && current_user_can('edit_post', $published_post->ID)) { + return; + } + + if ( $revisionary->doing_rest && $revisionary->rest->is_posts_request && ! empty( $revisionary->rest->request ) ) { + $post_arr = array_merge( $revisionary->rest->request->get_params(), $post_arr ); + } + + $recipient_ids = []; + + $admin_notify = rvy_get_option( 'pending_rev_notify_admin' ); + $author_notify = rvy_get_option( 'pending_rev_notify_author' ); + + if ( ( $admin_notify || $author_notify ) && $revision_id ) { + $type_obj = get_post_type_object( $object_type ); + $type_caption = strtolower($type_obj->labels->singular_name); + $post_arr['post_type'] = $published_post->post_type; + + $blogname = wp_specialchars_decode( get_option('blogname'), ENT_QUOTES ); + + if (!empty($args['update'])) { + $title = sprintf( esc_html__('[%s] %s Updated', 'revisionary'), $blogname, pp_revisions_status_label('pending-revision', 'name') ); + + $message = sprintf( esc_html__('%1$s updated a %2$s of the %3$s "%4$s".', 'revisionary'), $current_user->display_name, strtolower(pp_revisions_status_label('pending-revision', 'name')), $type_caption, $post_arr['post_title'] ) . "\r\n\r\n"; + } else { + $title = sprintf( esc_html__('[%s] %s', 'revisionary'), $blogname, pp_revisions_status_label('pending-revision', 'name') ); + + $message = sprintf( esc_html__('%1$s submitted changes to the %2$s "%3$s". You can review the changes for possible publication:', 'revisionary'), $current_user->display_name, $type_caption, $post_arr['post_title'] ) . "\r\n\r\n"; + } + + if ( $revision_id ) { + $revision = get_post($revision_id); + + if (rvy_get_option('revision_preview_links') || current_user_can('administrator') || is_super_admin()) { + $preview_link = rvy_preview_url($revision); + $message .= esc_html__( 'Preview and Approval: ', 'revisionary' ) . $preview_link . "\r\n\r\n"; + } + + $message .= esc_html__( 'Revision Queue: ', 'revisionary' ) . rvy_admin_url("admin.php?page=revisionary-q&published_post={$published_post->ID}&all=1") . "\r\n\r\n"; + + $message .= sprintf(esc_html__( 'Edit %s: ', 'revisionary' ), pp_revisions_status_label('pending-revision', 'name')) . rvy_admin_url("post.php?action=edit&post={$revision_id}") . "\r\n"; + } + + if ( $admin_notify ) { + // establish the publisher recipients + $recipient_ids = apply_filters('revisionary_submission_notify_admin', self::getRecipients('rev_submission_notify_admin', compact('type_obj', 'published_post')), ['post_type' => $object_type, 'post_id' => $published_post->ID, 'revision_id' => $revision_id]); + + if ( ( 'always' != $admin_notify ) && $selected_recipients ) { + // intersect default recipients with selected recipients + $recipient_ids = array_intersect( $selected_recipients, $recipient_ids ); + } + + if ( defined( 'RVY_NOTIFY_SUPER_ADMIN' ) && is_multisite() ) { + $super_admin_logins = get_super_admins(); + foreach( $super_admin_logins as $user_login ) { + if ( $super = new WP_User($user_login) ) { + $recipient_ids []= $super->ID; + } + } + } + } + + if ( $author_notify ) { + if (function_exists('get_multiple_authors')) { + $author_ids = []; + foreach(get_multiple_authors($published_post) as $_author) { + $author_ids []= $_author->ID; + } + } else { + $author_ids = [$published_post->post_author]; + } + + if ('always' != $author_notify) { + $author_ids = $selected_recipients ? array_intersect($author_ids, $selected_recipients) : []; + } + + $recipient_ids = array_merge($recipient_ids, $author_ids); + } + + if ( $recipient_ids ) { + $to_addresses = []; + + foreach($recipient_ids as $user_id) { + $user = new WP_User($user_id); + + if ($user->exists() && !empty($user->user_email)) { + $to_addresses[$user_id] = $user->user_email; + } + } + + $to_addresses = array_unique($to_addresses); + } else { + $to_addresses = array(); + } + + $message = str_replace('"', '"', $message); + + foreach ( $to_addresses as $user_id => $address ) { + if (!empty($author_ids) && in_array($user_id, $author_ids)) { + $notification_class = 'rev_submission_notify_author'; + } elseif (!empty($monitor_ids) && in_array($user_id, $monitor_ids)) { + $notification_class = 'rev_submission_notify_monitor'; + } else { + $notification_class = 'rev_submission_notify_admin'; + } + + rvy_mail( + $address, + $title, + $message, + [ + 'revision_id' => $revision_id, + 'post_id' => $published_post->ID, + 'notification_type' => $notification_type, + 'notification_class' => $notification_class, + ] + ); + } + } + } + + static function getRecipients($notification_class, $args) { + $defaults = ['type_obj' => false, 'published_post' => false]; + foreach(array_keys($defaults) as $key) { + if (!empty($args[$key])) { + $$key = $args[$key]; + } else { + return []; + } + } + + $recipient_ids = []; + + switch ($notification_class) { + case 'rev_submission_notify_admin' : + case 'rev_approval_notify_admin' : + + do_action('presspermit_init_rvy_interface'); + + if ( defined('RVY_CONTENT_ROLES') && ! defined('SCOPER_DEFAULT_MONITOR_GROUPS') && ! defined('REVISIONARY_LIMIT_ADMIN_NOTIFICATIONS') ) { + global $revisionary; + + $monitor_groups_enabled = true; + $revisionary->content_roles->ensure_init(); + + $recipient_ids = $revisionary->content_roles->get_metagroup_members( 'Pending Revision Monitors' ); + + if ( $type_obj ) { + $post_publisher_ids = $revisionary->content_roles->users_who_can( 'edit_post', $published_post->ID, array( 'cols' => 'id', 'user_ids' => $recipient_ids ) ); + $recipient_ids = array_intersect( $recipient_ids, $post_publisher_ids ); + } + + $monitor_ids = $recipient_ids; + } + + if (!$recipient_ids && (empty($monitor_groups_enabled) || ! defined('RVY_FORCE_MONITOR_GROUPS'))) { + require_once(ABSPATH . 'wp-admin/includes/user.php'); + + if ( defined( 'SCOPER_MONITOR_ROLES' ) ) { + $use_wp_roles = SCOPER_MONITOR_ROLES; + } else { + $use_wp_roles = ( defined( 'RVY_MONITOR_ROLES' ) ) ? RVY_MONITOR_ROLES : 'administrator,editor'; + } + + $use_wp_roles = str_replace( ' ', '', $use_wp_roles ); + $use_wp_roles = explode( ',', $use_wp_roles ); + + foreach ( $use_wp_roles as $role_name ) { + $search = new WP_User_Query( "search=&fields=id&role=$role_name" ); + $recipient_ids = array_merge( $recipient_ids, $search->results ); + $recipient_ids = array_unique($recipient_ids); + } + + if ( $recipient_ids && $type_obj ) { + foreach( $recipient_ids as $key => $user_id ) { + $_user = new WP_User($user_id); + $reqd_caps = map_meta_cap( 'edit_post', $user_id, $published_post->ID ); + + if ( + array_diff( $reqd_caps, array_keys( array_intersect( $_user->allcaps, array( true, 1, '1' ) ) ) ) + && !in_array('administrator', $_user->allcaps) + ) { + unset( $recipient_ids[$key] ); + } + } + } + } + + break; + default: + } // end switch notification_class + + return $recipient_ids; + } +} diff --git a/wp-content/plugins/revisionary/revisionary-front.css b/wp-content/plugins/revisionary/revisionary-front.css new file mode 100644 index 000000000..b45eeb88c --- /dev/null +++ b/wp-content/plugins/revisionary/revisionary-front.css @@ -0,0 +1,198 @@ +/* PublishPress Revisions. Copyright (C) 2019, PublishPress + * This file is licensed under the GNU GPL. + */ + +.rvy_view_revision, +.preview_approval_rvy { + height: 50px; + width: 100%; + text-align: center; + padding-right: 20px; + color: white; + font-family: sans-serif; + font-weight: normal; + font-size: 0.9em; + z-index: 99990; +} + +.rvy_preview_msgspan { + font-size: 0.9em; + line-height: 50px; +} + +.rvy_preview_msgspan > a, .rvy_preview_msgspan > a:visited{ + color:white; + margin-left:10px; +} + +.rvy_preview_linkspan { + margin-left: 15px; + line-height: 50px; + padding: 6px 10px; + font-family: sans-serif; + font-size: 0.9em; + font-style: normal; + font-weight: normal; + text-decoration: none !important; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + border: 1px solid; + cursor: pointer; + color: #333; + z-index: 99999; +} + +.rvy_view_published { + background-color: #635b93; +} +.rvy_view_published .rvy_preview_linkspan { + background-color: #E4E3D4; + border-color: #b2b1a7; +} +.rvy_view_published .rvy_preview_linkspan:hover { + background-color: #f7f6e7; +} + +.rvy_view_past { + background-color: #ab5454; +} +.rvy_view_past .rvy_preview_linkspan { + background-color: #dfcdd0; + border-color: #c0b0b3; +} +.rvy_view_past .rvy_preview_linkspan:hover { + background-color: #FFECEF; +} + +.rvy_view_draft { + background-color: #999; +} +.rvy_view_draft .rvy_preview_linkspan { + background-color: #cde0d2; + border-color: #a6b5a9; +} +.rvy_view_draft .rvy_preview_linkspan:hover { + background-color: #E4F5E8; +} + +.rvy_view_pending { + background-color: #35b194; +} +.rvy_view_pending .rvy_preview_linkspan { + background-color: #cde0d2; + border-color: #a6b5a9; +} +.rvy_view_pending .rvy_preview_linkspan:hover { + background-color: #E4F5E8; +} + +.rvy_view_future, +.rvy_view_scheduled { + background-color: #888; +} +.rvy_view_future .rvy_preview_linkspan, +.rvy_view_scheduled .rvy_preview_linkspan { + background-color: #cde6e7; + border-color: #a5bdbe; +} +.rvy_view_future .rvy_preview_linkspan:hover, +.rvy_view_scheduled .rvy_preview_linkspan:hover { + background-color: #def8f9; +} + +.rvy_view_pending_future { + color: white; + background-color: #35b194; +} +.rvy_view_pending_future .rvy_preview_linkspan { + background-color: #E1F6E8; + border-color: #cad6cd; +} +.rvy_view_pending_future .rvy_preview_linkspan:hover { + background-color: #f0fff4; +} + +.preview_approval_rvy { + background-color: #635b93; +} +.preview_approval_rvy .rvy_preview_linkspan { + border-color: #a2babc; + background-color: #c4dcde; +} +.preview_approval_rvy .rvy_preview_linkspan:hover { + background-color: #D9F3F5; +} + +span.rvy_preview_linkspan a, span.rvy_preview_linkspan a:visited, span.rvy_preview_linkspan a:hover { + text-decoration:none; + color: #333; +} + +.rvy_preview_linkspan:hover { + color: #4e4e4e; +} + +/* Button styles */ + +#pp_revisions_top_bar .button, +#pp_revisions_top_bar .button-primary, +#pp_revisions_top_bar .button-secondary { + display: inline-block; + max-width: 220px !important; + text-decoration: none; + font-size: 13px; + line-height: 2.15384615; + min-height: 30px; + margin: 0; + padding: 0 10px; + cursor: pointer; + border-width: 1px; + border-style: solid; + -webkit-appearance: none; + border-radius: 3px; + white-space: nowrap; + box-sizing: border-box; +} + +#pp_revisions_top_bar .button-secondary { + color: #2271b1; + border-color: #2271b1; + background: #f6f7f7; + text-decoration: none; +} + +#pp_revisions_top_bar .button-secondary:hover, +#pp_revisions_top_bar .button-secondary:focus, +#pp_revisions_top_bar .button-secondary:active { + background: #f0f0f1; + border-color: #0a4b78; + color: #0a4b78; + text-decoration: none !important; +} + +#pp_revisions_top_bar .button-primary { + background: #FFB300; + border-color: #C58C07; + color: #754D26; + text-decoration: none; + text-shadow: none; +} + +#pp_revisions_top_bar .button-primary:hover, +#pp_revisions_top_bar .button-primary:focus, +#pp_revisions_top_bar .button-primary:active { + background-color: #F3AC04; + border-color: #C58C07; + color: #333; + text-decoration: none !important; + text-shadow: none; +} + +#pp_revisions_top_bar .button { + margin-right: 7px; +} + +#pp_revisions_top_bar .button.rvy_has_empty_spacing { + margin-right: 3px; +} diff --git a/wp-content/plugins/revisionary/revisionary.php b/wp-content/plugins/revisionary/revisionary.php new file mode 100644 index 000000000..be9452017 --- /dev/null +++ b/wp-content/plugins/revisionary/revisionary.php @@ -0,0 +1,287 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * @package PublishPress\Revisions + * @author PublishPress + * @copyright Copyright (C) 2024 PublishPress. All rights reserved. + * + **/ + + if (!defined('ABSPATH')) exit; // Exit if accessed directly + +// Temporary usage within this module only; avoids multiple instances of version string +global $pp_revisions_version; + +$pp_revisions_version = '3.5.8.2'; + +global $wp_version; + +$min_php_version = '7.2.5'; +$min_wp_version = '5.5'; + +$invalid_php_version = version_compare(phpversion(), $min_php_version, '<'); +$invalid_wp_version = version_compare($wp_version, $min_wp_version, '<'); + +// If the PHP version is not compatible, terminate the plugin execution and show an admin notice. +if (is_admin() && $invalid_php_version) { + add_action( + 'admin_notices', + function () use ($min_php_version) { + if (current_user_can('activate_plugins')) { + echo '

    '; + printf( + 'PublishPress Revisions requires PHP version %s or higher.', + $min_php_version + ); + echo '

    '; + } + } + ); +} + +// If the WP version is not compatible, terminate the plugin execution and show an admin notice. +if (is_admin() && $invalid_wp_version) { + add_action( + 'admin_notices', + function () use ($min_wp_version) { + if (current_user_can('activate_plugins')) { + echo '

    '; + printf( + 'PublishPress Revisions requires WordPress version %s or higher.', + $min_wp_version + ); + echo '

    '; + } + } + ); +} + +if ($invalid_php_version || $invalid_wp_version) { + return; +} + +$revisionary_pro_active = false; + +global $revisionary_loaded_by_pro; + +$revisionary_loaded_by_pro = strpos(str_replace('\\', '/', __FILE__), 'vendor/publishpress/'); + +// Detect separate Pro plugin activation, but not self-activation (this file loaded in vendor library by Pro) +if (false === $revisionary_loaded_by_pro) { + foreach ((array)get_option('active_plugins') as $plugin_file) { + if (false !== strpos($plugin_file, 'revisionary-pro.php')) { + $revisionary_pro_active = true; + break; + } + } + + if (!$revisionary_pro_active && is_multisite()) { + foreach (array_keys((array)get_site_option('active_sitewide_plugins')) as $plugin_file) { + if (false !== strpos($plugin_file, 'revisionary-pro.php')) { + $revisionary_pro_active = true; + break; + } + } + } + + if ($revisionary_pro_active) { + add_filter( + 'plugin_row_meta', + function($links, $file) + { + if ($file == plugin_basename(__FILE__)) { + $links[]= __('This plugin can be deleted.', 'revisionary'); + } + + return $links; + }, + 10, 2 + ); + + add_action( + 'admin_notices', + function () { + if (current_user_can('activate_plugins')) { + echo '

    ' + . 'Revisions Pro requires the free plugin (PublishPress Revisions) to be deactivated.' + . '

    '; + } + } + ); + + return; + } +} + +if ( isset($_SERVER['SCRIPT_NAME']) && strpos( esc_url_raw($_SERVER['SCRIPT_NAME']), 'p-admin/index-extra.php' ) || strpos( esc_url_raw($_SERVER['SCRIPT_NAME']), 'p-admin/update.php' ) ) { + return; +} + +if (! defined('REVISIONS_INTERNAL_VENDORPATH')) { + define('REVISIONS_INTERNAL_VENDORPATH', __DIR__ . '/lib/vendor'); +} + +if (!defined('REVISIONARY_FILE') && !$revisionary_loaded_by_pro) { + $includeFileRelativePath = REVISIONS_INTERNAL_VENDORPATH . '/publishpress/publishpress-instance-protection/include.php'; + if (file_exists($includeFileRelativePath)) { + require_once $includeFileRelativePath; + } + + if (class_exists('PublishPressInstanceProtection\\Config')) { + $pluginCheckerConfig = new PublishPressInstanceProtection\Config(); + $pluginCheckerConfig->pluginSlug = 'revisionary'; + $pluginCheckerConfig->pluginFolder = 'revisionary'; + $pluginCheckerConfig->pluginName = 'PublishPress Revisions'; + + $pluginChecker = new PublishPressInstanceProtection\InstanceChecker($pluginCheckerConfig); + } + + if (! class_exists('ComposerAutoloaderInitRevisionary') + && file_exists(REVISIONS_INTERNAL_VENDORPATH . '/autoload.php') + ) { + require_once REVISIONS_INTERNAL_VENDORPATH . '/autoload.php'; + } +} + +if (!defined('REVISIONARY_FILE') && (!$revisionary_pro_active || $revisionary_loaded_by_pro)) { + define('REVISIONARY_FILE', __FILE__); + + add_action( + 'init', + function() { + global $pp_revisions_version; + + if (!function_exists('revisionary')) { + require_once(dirname(__FILE__).'/functions.php'); + pp_revisions_plugin_updated($pp_revisions_version); + } + }, + 2 + ); + + // register these functions before any early exits so normal activation/deactivation can still run with RS_DEBUG + register_activation_hook(__FILE__, function() + { + global $pp_revisions_version; + + if (!function_exists('revisionary')) { + require_once(dirname(__FILE__).'/functions.php'); + } + + pp_revisions_plugin_updated($pp_revisions_version); + pp_revisions_plugin_activation(); + } + ); + + register_deactivation_hook(__FILE__, function() + { + if (!function_exists('rvy_init')) { + require_once( dirname(__FILE__).'/rvy_init.php'); + } + + if (!rvy_is_plugin_active('revisionary-pro/revisionary-pro.php')) { + pp_revisions_plugin_deactivation(); + } + } + ); + + // negative priority to precede any default WP action handlers + function revisionary_load() { + global $pp_revisions_version; + + define('PUBLISHPRESS_REVISIONS_VERSION', $pp_revisions_version); + + if ( ! defined( 'RVY_VERSION' ) ) { + define( 'RVY_VERSION', PUBLISHPRESS_REVISIONS_VERSION ); // back compat + } + + define ('COLS_ALL_RVY', 0); + define ('COL_ID_RVY', 1); + + if ( defined('RS_DEBUG') ) { + include_once( dirname(__FILE__).'/lib/debug.php'); + add_action( 'admin_footer', 'rvy_echo_usage_message' ); + } else + include_once( dirname(__FILE__).'/lib/debug_shell.php'); + + require_once( dirname(__FILE__).'/defaults_rvy.php'); + + // === awp_is_mu() function definition and usage: must be executed in this order, and before any checks of IS_MU_RVY constant === + require_once( dirname(__FILE__).'/lib/agapetry_wp_core_lib.php'); + define( 'IS_MU_RVY', awp_is_mu() ); + // ------------------------------------------- + + require_once( dirname(__FILE__).'/content-roles_rvy.php'); + + if ( is_admin() || defined('XMLRPC_REQUEST') ) { + require_once( dirname(__FILE__).'/lib/agapetry_wp_admin_lib.php'); + + // skip WP version check and init operations when a WP plugin auto-update is in progress + if (isset($_SERVER['SCRIPT_NAME']) && false !== strpos(esc_url_raw($_SERVER['SCRIPT_NAME']), 'update.php') ) + return; + } + + require_once( dirname(__FILE__).'/classes/PublishPress/Revisionary.php'); + require_once( dirname(__FILE__).'/rvy_init.php'); // Contains activate, deactivate, init functions. Adds mod_rewrite_rules. + require_once( dirname(__FILE__).'/functions.php'); + + // avoid lockout in case of editing plugin via wp-admin + if ( defined('RS_DEBUG') && is_admin() && isset($_SERVER['REQUEST_URI']) && ( strpos( urldecode(esc_url_raw($_SERVER['REQUEST_URI'])), 'p-admin/plugin-editor.php' ) || strpos( urldecode(esc_url_raw($_SERVER['REQUEST_URI'])), 'p-admin/plugins.php' ) ) && false === strpos( esc_url_raw($_SERVER['REQUEST_URI']), 'activate' ) ) + return; + + define('RVY_ABSPATH', __DIR__); + + if (is_admin() && !defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + require_once(__DIR__ . '/includes/CoreAdmin.php'); + new \PublishPress\Revisions\CoreAdmin(); + } + + rvy_refresh_options_sitewide(); + + // since sequence of set_current_user and init actions seems unreliable, make sure our current_user is loaded first + add_action('init', 'rvy_init', 1); + + if (!defined('IFRAME_REQUEST')) { + add_action('init', 'rvy_add_revisor_custom_caps', 99); + add_action('wp_loaded', 'rvy_add_revisor_custom_caps', 99); + } + + add_action('init', 'rvy_configuration_late_init', PHP_INT_MAX - 1); + + revisionary(); + } + + // negative priority to precede any default WP action handlers + if ($revisionary_loaded_by_pro) { + revisionary_load(); // Pro support + } else { + add_action('plugins_loaded', 'revisionary_load', -10); + } +} diff --git a/wp-content/plugins/revisionary/revisionary_main.php b/wp-content/plugins/revisionary/revisionary_main.php new file mode 100644 index 000000000..8f8b8621a --- /dev/null +++ b/wp-content/plugins/revisionary/revisionary_main.php @@ -0,0 +1,1212 @@ + + * @copyright Copyright (c) 2024 PublishPress. All rights reserved. + * @license GPLv2 or later + * @since 1.0.0 + */ +class Revisionary +{ + var $content_roles; // object ref - instance of RevisionaryContentRoles subclass, set by external plugin + var $doing_rest = false; + var $rest = ''; // object ref - Revisionary_REST + var $internal_meta_update = false; + var $skip_filtering = false; + var $is_revisions_query = false; + var $front = false; + + var $config_loaded = false; // configuration related to post types and statuses must be loaded late on the init action + var $enabled_post_types = []; // enabled_post_types property is set (keyed by post type slug) late on the init action. + var $enabled_post_types_archive = []; // enabled_post_types_archive property is set (keyed by post type slug) late on the init action. + var $post_edit_ui; + + // minimal config retrieval to support pre-init usage by WP_Scoped_User before text domain is loaded + function __construct() { + } + + function init() { + if (isset($_SERVER['REQUEST_URI']) && is_admin() && (false !== strpos(esc_url_raw($_SERVER['REQUEST_URI']), 'revision.php')) && (!empty($_REQUEST['revision']))) { + add_action('init', [$this, 'addFilters'], PHP_INT_MAX); + } else { + $this->addFilters(); + } + } + + function addFilters() { + global $script_name; + + add_filter('pre_wp_update_comment_count_now', [$this, 'fltUpdateCommentCountBypass'], 10, 3); + + // Ensure editing access to past revisions is not accidentally filtered. + // @todo: Correct selective application of filtering downstream so Revisors can use a read-only Compare [Past] Revisions screen + // + // Note: some filtering is needed to allow users with full editing permissions on the published post to access a Compare Revisions screen with Preview and Manage buttons + if (is_admin() && isset($_SERVER['REQUEST_URI']) && (false !== strpos(esc_url_raw($_SERVER['REQUEST_URI']), 'revision.php')) && (!empty($_REQUEST['revision'])) && !is_content_administrator_rvy()) { + if (!empty($_REQUEST['revision'])) { + $revision_id = (int) $_REQUEST['revision']; + } elseif (isset($_REQUEST['to'])) { + $revision_id = (int) $_REQUEST['to']; + } else { + $revision_id = 0; + } + + if ($revision_id) { + if ($_post = get_post($revision_id)) { + if (!rvy_in_revision_workflow($_post)) { + if ($parent_post = get_post($_post->post_parent)) { + if (!empty($_POST) || (!empty($_REQUEST['action']) && ('restore' == $_REQUEST['action']))) { + if (!$this->canEditPost($parent_post, ['simple_cap_check' => true])) { + return; + } + } + } + } + } + } + } + + $this->setPostTypes(); + $this->setPostTypesArchive(); + + rvy_refresh_options_sitewide(); + + if (defined('DOING_CRON') && DOING_CRON) { + if (!rvy_get_option('wp_cron_usage_detected')) { + update_option('rvy_wp_cron_usage_detected', true); + } + } + + require_once( dirname(__FILE__).'/classes/PublishPress/Revisions/PluginCompat.php' ); + new PublishPress\Revisions\PluginCompat(); + + // NOTE: $_GET['preview'] and $_GET['post_type'] arguments are set by rvy_init() at response to ?p= request when the requested post is a revision. + if (!is_admin() && (!defined('REST_REQUEST') || ! REST_REQUEST)) { // preview_id indicates a regular preview via WP core, based on autosave revision + $preview_arg = (defined('RVY_PREVIEW_ARG')) ? sanitize_key(constant('RVY_PREVIEW_ARG')) : 'rv_preview'; + + if ((defined('FL_BUILDER_VERSION') && rvy_in_revision_workflow(rvy_detect_post_id())) || ((!empty($_GET[$preview_arg]) || !empty($_GET['_ppp'])) && empty($_REQUEST['preview_id'])) || !empty($_GET['mark_current_revision'])) { + require_once( dirname(__FILE__).'/front_rvy.php' ); + $this->front = new RevisionaryFront(); + } + } + + if (!is_admin() && (!defined('REST_REQUEST') || ! REST_REQUEST) && (!empty($_GET['preview']) && !empty($_REQUEST['preview_id']))) { + if (!defined('PUBLISHPRESS_MULTIPLE_AUTHORS_VERSION')) { + require_once(dirname(__FILE__).'/classes/PublishPress/Revisions/PostPreview.php'); + new PublishPress\Revisions\PostPreview(); + } + } + + add_filter('presspermit_is_preview', [$this, 'fltIsPreview']); + add_filter('presspermit_query_post_statuses', [$this, 'fltQueryPostStatuses'], 10, 2); + + add_filter('map_meta_cap', [$this, 'fltStatusChangeCap'], 5, 4); + + if ( ! is_content_administrator_rvy() ) { + add_filter( 'map_meta_cap', array($this, 'flt_post_map_meta_cap'), 5, 4); + add_filter( 'user_has_cap', array( $this, 'flt_user_has_cap' ), 98, 3 ); + + add_filter( 'map_meta_cap', array( $this, 'flt_limit_others_drafts' ), 10, 4 ); + } + + if ( is_admin() ) { + require_once( dirname(__FILE__).'/admin/admin_rvy.php'); + new RevisionaryAdmin(); + } + + add_action( 'wpmu_new_blog', array( $this, 'act_new_blog'), 10, 2 ); + + add_action('trashed_post', [$this, 'actTrashedPost']); + + add_action( 'deleted_post', [$this, 'actDeletedPost']); + + if ( rvy_get_option('scheduled_revisions') ) { + // users who have edit_published capability for post/page can create a scheduled revision by modifying post date to a future date (without setting "future" status explicitly) + add_filter( 'wp_insert_post_data', array($this, 'flt_insert_post_data'), 99, 2 ); + } + + add_filter( 'wp_insert_post_data', array($this, 'flt_regulate_revision_status'), 100, 2 ); + + add_filter('wp_insert_post_data', [$this, 'fltRemoveInvalidPostDataKeys'], 999, 2); + + // REST logging + add_filter( 'rest_pre_dispatch', array( $this, 'rest_pre_dispatch' ), 10, 3 ); + + // This is needed, implemented for pending revisions only + if (!empty($_REQUEST['get_new_revision'])) { + add_action('admin_enqueue_scripts', array($this, 'act_new_revision_redirect')); + } + + if (!empty($_REQUEST['edit_new_revision'])) { + add_action('admin_enqueue_scripts', array($this, 'act_edit_revision_redirect')); + } + + add_filter('get_comments_number', array($this, 'flt_get_comments_number'), 10, 2); + + add_action('save_post', array($this, 'actSavePost'), 20, 2); + add_action('delete_post', [$this, 'actDeletePost'], 10, 3); + + add_action('post_updated', [$this, 'actUpdateRevision'], 10, 2); + add_action('post_updated', [$this, 'actUpdateRevisionFixCommentCount'], 999, 2); + + add_filter('posts_clauses', [$this, 'fltPostsClauses'], 10, 2); + + if (!is_admin()) { + add_action('admin_bar_menu', [$this, 'adminToolbarItem'], 100); + } + + add_filter('wp_dropdown_pages', [$this, 'fltDropdownPages'], 10, 3); + + if (defined('REVISIONARY_RVY_INIT_ACTION')) { + do_action( 'rvy_init', $this ); + } + } + + // Work around unfilterable get_pages() query by replacing the wp_dropdown_pages() return array + function fltDropdownPages($output, $parsed_args, $pages) { + // ---- Begin PublishPress Modification --- + global $wpdb; + + // don't recursively execute this filter + remove_filter('wp_dropdown_pages', [$this, 'fltDropdownPages'], 10, 3); + + $parsed_args['echo'] = 0; + + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + $parsed_args['exclude'] = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_mime_type IN ('$revision_status_csv') AND post_type !=''"); + // ---- End PublishPress Modification --- + + $pages = get_pages( $parsed_args ); + $output = ''; + // Back-compat with old system where both id and name were based on $name argument. + if ( empty( $parsed_args['id'] ) ) { + $parsed_args['id'] = $parsed_args['name']; + } + + if ( ! empty( $pages ) ) { + $class = ''; + if ( ! empty( $parsed_args['class'] ) ) { + $class = " class='" . esc_attr( $parsed_args['class'] ) . "'"; + } + + $output = "\n"; + } + + /** + * Filters the HTML output of a list of pages as a drop down. + * + * @since 2.1.0 + * @since 4.4.0 `$parsed_args` and `$pages` added as arguments. + * + * @param string $output HTML output for drop down list of pages. + * @param array $parsed_args The parsed arguments array. See wp_dropdown_pages() + * for information on accepted arguments. + * @param WP_Post[] $pages Array of the page objects. + */ + $html = apply_filters( 'wp_dropdown_pages', $output, $parsed_args, $pages ); + + if ( $parsed_args['echo'] ) { + echo $html; + } + + // PublishPress: restore this filter hook + add_filter('wp_dropdown_pages', [$this, 'fltDropdownPages'], 10, 3); + + return $html; + } + + function adminToolbarItem($admin_bar) { + global $post; + + if (!empty($post) && rvy_get_option('pending_revisions') && !rvy_in_revision_workflow($post) && ('revision' != $post->post_type) && rvy_is_supported_post_type($post->post_type)) { + $status_obj = get_post_status_object($post->post_status); + + if (!empty($status_obj->public) || !empty($status_obj->private) || rvy_get_option('pending_revision_unpublished')) { + if ($type_obj = get_post_type_object($post->post_type)) { + + if (current_user_can('copy_post', $post->ID) && rvy_post_revision_supported($post)) { + $admin_bar->add_menu([ + 'id' => 'rvy-create-revision', + 'title' => pp_revisions_status_label('draft-revision', 'submit_short'), // Your menu title + 'href' => rvy_admin_url("admin.php?page=rvy-revisions&post={$post->ID}&action=revise&front=1"), // URL + 'meta' => [ + 'target' => '_blank', + ] + ] + ); + } + } + } + } + } + + function configurationLateInit() { + $this->setPostTypes(); + $this->setPostTypesArchive(); + $this->config_loaded = true; + } + + public function fltPostsClauses($clauses, $_wp_query, $args = []) { + global $wpdb, $revisionary; + + $defaults = [ + 'is_revisions_query' => false, + 'post_types' => [], + 'source_alias' => false, + ]; + $args = array_merge($defaults, (array)$args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + if ($is_revisions_query || !empty($_wp_query->is_revisions_query) || !empty($_wp_query->query['is_revisions_query']) || (!empty($revisionary) && !empty($revisionary->is_revisions_query)) || $_wp_query->is_preview) { + return $clauses; + } + + // Allow revision retrieval by front end editors / previews + if (!is_admin() && (!defined('REST_REQUEST') || ! REST_REQUEST)) { + return $clauses; + } + + if (empty($clauses['where'])) { + $clauses['where'] = '1=1'; + } + + $src_table = ($source_alias) ? $source_alias : $wpdb->posts; + $args['src_table'] = $src_table; + + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + $clauses['where'] .= " AND $src_table.post_mime_type NOT IN ('$revision_status_csv')"; + + return $clauses; + } + + // This is intentionally called twice: once for code that fires on 'init' and then very late on 'init' for types which were registered late on 'init' + public function setPostTypes() { + $enabled_post_types = get_option('rvy_enabled_post_types', false); + + if (false === $enabled_post_types) { + $enabled_post_types = array_fill_keys( + get_post_types(['public' => true]), true + ); + + if (class_exists('WooCommerce')) { + $enabled_post_types['product'] = true; + $enabled_post_types['order'] = true; + } + + if (class_exists('Tribe__Events__Main')) { + $enabled_post_types['tribe_events'] = true; + } + + if (!defined('REVISIONARY_NO_PRIVATE_TYPES')) { + $private_types = array_merge( + get_post_types(['public' => false], 'object'), + get_post_types(['public' => null], 'object') + ); + + // by default, enable non-public post types that have type-specific capabilities defined + foreach($private_types as $post_type => $type_obj) { + if ((!empty($type_obj->cap) && !empty($type_obj->cap->edit_posts) && !in_array($type_obj->cap->edit_posts, ['edit_posts', 'edit_pages'])) + || defined('REVISIONARY_ENABLE_' . strtoupper($post_type) . '_TYPE') + ) { + $enabled_post_types[$post_type] = true; + } + } + } + } + + $enabled_post_types = apply_filters( + 'revisionary_enabled_post_types', + array_diff_key( + $enabled_post_types, + ['attachment' => true, 'tablepress_table' => true, 'acf-field-group' => true, 'acf-field' => true, 'nav_menu_item' => true, 'custom_css' => true, 'customize_changeset' => true, 'wp_block' => true, 'wp_template' => true, 'wp_template_part' => true, 'wp_global_styles' => true, 'wp_navigation' => true] + ) + ); + + $this->enabled_post_types = array_merge($this->enabled_post_types, $enabled_post_types); + + unset($this->enabled_post_types['attachment']); + $this->enabled_post_types = array_filter($this->enabled_post_types); + } + + public function setPostTypesArchive() { + global $current_user; + + $enabled_post_types_archive = get_option('rvy_enabled_post_types_archive', false); + + if (false === $enabled_post_types_archive) { + $types = get_post_types(['public' => true]); + + $enabled_post_types_archive = array_fill_keys( + $types, true + ); + + if (!defined('REVISIONARY_NO_PRIVATE_TYPES')) { + $private_types = array_merge( + get_post_types(['public' => false], 'object'), + get_post_types(['public' => null], 'object') + ); + + // by default, enable non-public post types that have type-specific capabilities defined + foreach($private_types as $post_type => $type_obj) { + if ((!empty($type_obj->cap) && !empty($type_obj->cap->edit_posts) && !in_array($type_obj->cap->edit_posts, ['edit_posts', 'edit_pages'])) + || defined('REVISIONARY_ENABLE_' . strtoupper($post_type) . '_TYPE') + ) { + $enabled_post_types_archive[$post_type] = true; + } + } + } + + foreach (array_keys($enabled_post_types_archive) as $post_type) { + if (!post_type_supports($post_type, 'revisions')) { + unset($enabled_post_types_archive[$post_type]); + } + } + + if (class_exists('WooCommerce')) { + $enabled_post_types_archive['product'] = true; + $enabled_post_types_archive['order'] = true; + } + + if (class_exists('Tribe__Events__Main')) { + $enabled_post_types_archive['tribe_events'] = true; + } + } + + $enabled_post_types_archive = array_diff_key( + $enabled_post_types_archive, + [ + 'attachment' => true, + 'tablepress_table' => true, + 'acf-field-group' => true, + 'acf-field' => true, + 'nav_menu_item' => true, + 'custom_css' => true, + 'customize_changeset' => true, + 'wp_block' => true, + 'wp_template' => true, + 'wp_template_part' => true, + 'wp_global_styles' => true, + 'wp_navigation' => true, + 'product_variation' => true, + 'shop_order_refund' => true + ] + ); + + // Remove the post_types that doesn't have a valid object (null) + foreach( array_keys( $enabled_post_types_archive ) as $type ) : + $type_obj = get_post_type_object( $type ); + if( ! $type_obj ) : + unset( $enabled_post_types_archive[$type] ); + endif; + + if ( + (!empty($type_obj->cap->edit_others_posts) && empty($current_user->allcaps[$type_obj->cap->edit_others_posts])) + || (!empty($type_obj->cap->edit_published_posts) && empty($current_user->allcaps[$type_obj->cap->edit_published_posts])) + ) { + unset($enabled_post_types_archive[$type]); + } + endforeach; + + $this->enabled_post_types_archive = array_merge( + $this->enabled_post_types_archive, + $enabled_post_types_archive + ); + + $this->enabled_post_types_archive = apply_filters( + 'revisionary_archive_post_types', + array_filter($this->enabled_post_types_archive) + ); + } + + function canEditPost($post, $args = []) { + global $current_user; + + $args = (array) $args; + + if (is_numeric($post)) { + $post = get_post($post); + } + + if (!is_object($post) + || empty($post->ID) + || !$type_obj = get_post_type_object($post->post_type) + || !$status_obj = get_post_status_object($post->post_status) + ) { + return false; + } + + if (!empty($args['simple_cap_check']) && (!empty($status_obj->public) || !empty($status_obj->private))) { + return isset($type_obj->cap->edit_published_posts) && !empty($current_user->allcaps[$type_obj->cap->edit_published_posts]); + } else { + static $last_result; + + if (!isset($last_result)) { + $last_result = []; + + } elseif (!empty($last_result) && isset($last_result[$post->ID])) { + return $last_result[$post->ID]; + } + + $caps = map_meta_cap('edit_post', $current_user->ID, $post->ID); + + $return = true; + + foreach($caps as $cap) { + if (empty($current_user->allcaps[$cap])) { + $return = false; + break; + } + } + + $last_result[$post->ID] = $return; + return $return; + } + } + + function actTrashedPost($revision_id) { + if (rvy_in_revision_workflow($revision_id, ['include_trash' => true])) { + $post_id = rvy_post_id($revision_id); + + if (!$triggered_deletions = get_option('_rvy_trigger_deletion')) { + $triggered_deletions = []; + } + + $triggered_deletions[$revision_id] = $post_id; + + update_option('_rvy_trigger_deletion', $triggered_deletions); + } + } + + // On post deletion, clear corresponding _rvy_has_revisions postmeta flag + function actDeletedPost($post_id) { + delete_post_meta($post_id, '_rvy_has_revisions'); + } + + function actSavePost($post_id, $post) { + if (strtotime($post->post_date_gmt) > agp_time_gmt()) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + + if (rvy_get_option('revision_publish_cron')) { + if (rvy_in_revision_workflow($post_id) && ('future-revision' == $post->post_mime_type)) { + rvy_update_next_publish_date(['revision_id' => $post_id]); + } + } else { + rvy_update_next_publish_date(); + } + } + } + + // Immediately prior to post deletion, also delete its pending revisions and future revisions (and their meta data) + function actDeletePost($post_id) { + global $wpdb; + + if (!$post_id) { + return; + } + + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + $any_trashed_posts = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status = 'trash' AND comment_count > 0 AND post_mime_type IN ('$revision_status_csv') LIMIT 1"); + + $trashed_clause = ($any_trashed_posts) + ? $wpdb->prepare( + " OR (ID IN (SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_rvy_base_post_id' AND meta_value = %d) AND post_status = 'trash')", + $post_id + ) : ''; + + $post_ids = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE (post_mime_type IN ('$revision_status_csv') AND comment_count = %d) $trashed_clause", + $post_id + ) + ); + + foreach($post_ids as $revision_id) { + wp_delete_post($revision_id, true); + } + + revisionary_refresh_revision_flags($post_id, ['ignore_revision_ids' => $post_ids]); + + $post = get_post($post_id); + + if ($post && rvy_in_revision_workflow($post)) { + $wpdb->query( + $wpdb->prepare( + "DELETE FROM $wpdb->postmeta WHERE post_id = %d", + $post_id + ) + ); + + $meta_args = ['ignore_revisions' => [$post->ID]]; + + if (rvy_get_option('revision_limit_per_post')) { + delete_post_meta(rvy_post_id($post->ID), '_rvy_has_revisions'); + $meta_args['insert_only'] = true; + } + + revisionary_refresh_postmeta(rvy_post_id($post->ID), $meta_args); + } + } + + function actUpdateRevision($post_id, $revision) { + if (rvy_in_revision_workflow($revision) + && (rvy_get_option('revision_update_notifications')) + ) { + $published_post = get_post(rvy_post_id($revision)); + + if (apply_filters('revisionary_do_revision_notice', !$this->doing_rest, $revision, $published_post)) { + if (('future-revision' != $revision->post_mime_type) && rvy_get_option('revision_update_notifications')) { + $args = ['update' => true, 'revision_id' => $revision->ID, 'published_post' => $published_post, 'object_type' => $published_post->post_type]; + + if ( !empty( $_REQUEST['prev_cc_user'] ) ) { + $args['selected_recipients'] = array_map('intval', $_REQUEST['prev_cc_user']); + } else { + // If the UI that triggered this notification does not support recipient selection, send to default recipients for this post + require_once( dirname(__FILE__) . '/revision-workflow_rvy.php' ); + $result = Rvy_Revision_Workflow_UI::default_notification_recipients($published_post->ID, ['object_type' => $published_post->post_type]); + $args['selected_recipients'] = array_keys(array_filter($result['default_ids'])); + } + + $this->do_notifications('pending-revision', 'pending-revision', (array) $revision, $args); + } + } + } + } + + function actUpdateRevisionFixCommentCount($post_id, $revision) { + global $wpdb; + + if (rvy_in_revision_workflow($revision)) { + if (empty($revision->comment_count)) { + if ($main_post_id = get_post_meta($revision->ID, '_rvy_base_post_id', true)) { + $wpdb->update($wpdb->posts, ['comment_count' => $main_post_id], ['ID' => $revision->ID]); + } + } + } + } + + // Return zero value for revision comments because: + // * comments are not supported for revisions + // * published post ID is stored to comment_count column is used for query efficiency + function flt_get_comments_number($count, $post_id) { + if ($post = get_post($post_id)) { + if (rvy_in_revision_workflow($post)) { + $count = 0; + } + } + + return $count; + } + + function get_last_revision($post_id, $user_id) { + require_once(dirname(__FILE__).'/admin/admin-init_rvy.php'); + + if ( $revisions = rvy_get_post_revisions( $post_id, '', array( 'order' => 'DESC', 'orderby' => 'ID' ) ) ) { // @todo: retrieve revision_id in block editor js, pass as redirect arg + foreach( $revisions as $revision ) { + if (rvy_is_post_author($revision, $user_id)) { + return $revision; + } + } + } + + return false; + } + + function act_new_revision_redirect() { + global $current_user, $post; + + if (empty($_REQUEST['get_new_revision'])) { + return; + } + + $published_post_id = (int) $_REQUEST['get_new_revision']; + + $published_url = get_permalink($published_post_id); + + $revision = $this->get_last_revision($published_post_id, $current_user->ID); + + if ($revision) { + $args = []; + if (!empty($_REQUEST['nc'])) { // with a specified link target, avoid multiple browser tabs in the same editor instance + $args['nc'] = sanitize_key($_REQUEST['nc']); + } + + $type_obj = get_post_type_object(get_post_field('post_type', $published_post_id)); + + $preview_link = (!empty($type_obj) && !empty($type_obj->public)) ? rvy_preview_url($revision, $args) : admin_url("post.php?post={$published_post_id}&action=edit"); + + wp_redirect($preview_link); + exit; + } + + // If logged user does not have a pending revision of this post, redirect to published permalink + wp_redirect($published_url); + exit; + } + + function act_edit_revision_redirect() { + global $current_user, $post; + + if (empty($_REQUEST['edit_new_revision'])) { + return; + } + + $published_post_id = (!empty($_REQUEST['edit_new_revision'])) ? rvy_post_id($_REQUEST['edit_new_revision']) : rvy_post_id($post->ID); + $published_url = get_permalink($published_post_id); + + $revision = $this->get_last_revision($published_post_id, $current_user->ID); + + if ($revision) { + $args = []; + if (!empty($_REQUEST['nc'])) { // with a specified link target, avoid multiple browser tabs in the same editor instance + $args['nc'] = sanitize_key($_REQUEST['nc']); + } + + $edit_link = admin_url("post.php?post={$revision->ID}&action=edit&nc={$args['nc']}"); + wp_redirect($edit_link); + exit; + } + + // If logged user does not have a pending revision of this post, redirect to published permalink + wp_redirect($published_url); + exit; + } + + // log post type and ID from REST handler for reference by subsequent PP filters + function rest_pre_dispatch( $rest_response, $rest_server, $request ) { + $this->doing_rest = true; + + require_once( dirname(__FILE__).'/rest_rvy.php' ); + $this->rest = new Revisionary_REST(); + + return $this->rest->pre_dispatch( $rest_response, $rest_server, $request ); + } + + // prevent revisors from editing other users' regular drafts and pending posts + function flt_limit_others_drafts( $caps, $meta_cap, $user_id, $args ) { + global $current_user; + + if (!empty($this->skip_filtering)) { + return $caps; + } + + if ( ! in_array( $meta_cap, array( 'edit_post', 'edit_page' ) ) ) + return $caps; + + $object_id = ( is_array($args) && ! empty($args[0]) ) ? (int) $args[0] : $args; + + if ( ! $object_id || ! is_scalar($object_id) || ( $object_id < 0 ) || ! rvy_get_option('require_edit_others_drafts') ) { + return $caps; + } + + if ( $post = get_post( $object_id ) ) { + if ( ('revision' != $post->post_type) && ! rvy_in_revision_workflow($post) ) { + + if (empty($this->enabled_post_types[$post->post_type]) + || !apply_filters('revisionary_require_edit_others_drafts', true, $post->post_type, $post->post_status, $args)) { + return $caps; + } + + $status_obj = get_post_status_object( $post->post_status ); + + if (!rvy_is_post_author($post) && $status_obj && ! $status_obj->public && ! $status_obj->private) { + + $post_type_obj = get_post_type_object( $post->post_type ); + if (isset($post_type_obj->cap->edit_published_posts) && current_user_can( $post_type_obj->cap->edit_published_posts)) { // don't require any additional caps for sitewide Editors + return $caps; + } + + static $stati; + + if ( ! isset($stati) ) { + $stati = get_post_stati( array( 'internal' => false, 'protected' => true ) ); + $stati = array_diff( $stati, array( 'future' ) ); + } + + if ( in_array( $post->post_status, $stati ) ) { // isset check because doing_cap_check property was undefined prior to Permissions 3.3.8 + if ((!function_exists('presspermit') || (isset(presspermit()->doing_cap_check) && !presspermit()->doing_cap_check)) && $post_type_obj) { + if (!empty($post_type_obj->cap->edit_others_posts)) { + $caps[] = str_replace('edit_', 'list_', $post_type_obj->cap->edit_others_posts); + } + } + + if (empty($current_user->allcaps['edit_others_drafts'])) { + $caps[] = "edit_others_drafts"; + } + } + } + } + } + + return $caps; + } + + function fltStatusChangeCap($caps, $cap, $user_id, $args) { + global $current_user; + + if ('copy_post' == $cap) { + if (!rvy_get_option('pending_revisions')) { + return array_diff_key($caps, [$cap => true]); + } + + if (!empty($args[0])) { + $post_id = (is_object($args[0])) ? $args[0]->ID : (int) $args[0]; + } else { + $post_id = 0; + } + + if (rvy_in_revision_workflow($post_id)) { + return array_diff_key($caps, [$cap => true]); + } + + $filter_args = []; + + if (!$can_copy = rvy_is_full_editor($post_id)) { + if ($_post = get_post($post_id)) { + $type_obj = get_post_type_object($_post->post_type); + } + + if (!empty($type_obj)) { + if (rvy_get_option("copy_posts_capability")) { + $base_prop = (rvy_is_post_author($post_id)) ? 'edit_posts' : 'edit_others_posts'; + $copy_cap_name = str_replace('edit_', 'copy_', $type_obj->cap->$base_prop); + + if (false === strpos($copy_cap_name, 'copy_')) { + if ('page' == $_post->post_type) { + $copy_cap_name = (rvy_is_post_author($post_id)) ? 'copy_pages' : 'copy_others_pages'; + } else { + $copy_cap_name = (rvy_is_post_author($post_id)) ? 'copy_posts' : 'copy_others_posts'; + } + } + + $can_copy = current_user_can($copy_cap_name); + } else { + $can_copy = current_user_can($type_obj->cap->edit_posts); + } + + $filter_args = compact('type_obj'); + } + } + + // allow PublishPress Permissions to apply 'copy' exceptions + if ($can_copy = apply_filters('revisionary_can_copy', $can_copy, $post_id, 'draft', 'draft-revision', $filter_args) + || apply_filters('revisionary_can_submit', $can_copy, $post_id, 'pending', 'pending-revision', $filter_args) + ) { + $caps = ['read']; + } else { + $caps = array_diff_key($caps, [$cap => true]); + } + + } elseif ('set_revision_pending-revision' == $cap) { + if (!rvy_get_option('pending_revisions')) { + return array_diff_key($caps, [$cap => true]); + } + + if (!empty($args[0])) { + $post_id = (is_object($args[0])) ? $args[0]->ID : (int) $args[0]; + } else { + $post_id = 0; + } + + if (!rvy_in_revision_workflow($post_id)) { + return $caps; + } + + $filter_args = []; + + if ($can_submit = current_user_can('edit_post', $post_id)) { // require basic editing capabilties for revision ID + $main_post_id = rvy_post_id($post_id); + + if (rvy_get_option("revise_posts_capability") && !rvy_is_full_editor($main_post_id)) { // bypass capability check for those with full editing caps on main post + if ($_post = get_post($post_id)) { + if ($type_obj = get_post_type_object($_post->post_type)) { + $base_prop = (rvy_is_post_author($main_post_id)) ? 'edit_posts' : 'edit_others_posts'; + $submit_cap_name = str_replace('edit_', 'revise_', $type_obj->cap->$base_prop); + $can_submit = current_user_can($submit_cap_name); + $filter_args = compact('main_post_id', 'type_obj'); + } + } + } + } + + // allow PublishPress Permissions to apply 'revise' exceptions + if ($can_submit = apply_filters('revisionary_can_submit', $can_submit, $post_id, 'pending', 'pending-revision', $filter_args)) { + $caps = ['read']; + } + } + + return $caps; + } + + function set_content_roles( $content_roles_obj ) { + $this->content_roles = $content_roles_obj; + + if ( ! defined( 'RVY_CONTENT_ROLES' ) ) { + define( 'RVY_CONTENT_ROLES', true ); + } + } + + + function act_new_blog( $blog_id, $user_id ) { + rvy_add_revisor_role( $blog_id ); + } + + + function flt_post_map_meta_cap($caps, $cap, $user_id, $args) { + global $current_user; + + static $busy; + + if (!empty($busy) || !empty($this->skip_filtering)) { + return $caps; + } + + if (!in_array($cap, array('read_post', 'read_page', 'edit_post', 'edit_page', 'delete_post', 'delete_page'))) { + return $caps; + } + + if (!empty($args[0])) { + $post_id = (is_object($args[0])) ? $args[0]->ID : (int) $args[0]; + } else { + $post_id = 0; + } + + if ($post = get_post($post_id)) { + if (('inherit' == $post->post_status) + || empty($this->enabled_post_types[$post->post_type]) && $this->config_loaded + ) { + return $caps; + } + } + + if ($post && (('future-revision' == $post->post_mime_type) || in_array($cap, ['read_post', 'read_page']))) { + if (in_array($cap, ['read_post', 'read_page'])) { + return $caps; + } + + // allow Revisor to view a preview of their scheduled revision + if (is_admin() || (defined('REST_REQUEST') && REST_REQUEST) || empty($_REQUEST['preview']) || !empty($_POST) || did_action('template_redirect')) { + if ($type_obj = get_post_type_object( $post->post_type )) { + if (isset($type_obj->cap->edit_published_posts)) { + $check_cap = in_array($cap, ['delete_post', 'delete_page']) ? $type_obj->cap->delete_published_posts : $type_obj->cap->edit_published_posts; + return array_merge($caps, [$check_cap]); + } else { + return $caps; + } + } + } + } + + $busy = true; + + $preview_arg = (defined('RVY_PREVIEW_ARG')) ? sanitize_key(constant('RVY_PREVIEW_ARG')) : 'rv_preview'; + + if (in_array($cap, ['read_post', 'read_page']) // WP Query imposes edit_post capability requirement for front end viewing of protected statuses + || ((!empty($_REQUEST[$preview_arg]) || !empty($_GET['preview'])) && in_array($cap, array('edit_post', 'edit_page')) && did_action('posts_selection') && !did_action('template_redirect')) + ) { + if ($post && rvy_in_revision_workflow($post)) { + $type_obj = get_post_type_object($post->post_type); + + if ($type_obj && !empty($type_obj->cap->edit_others_posts)) { + $caps = array_diff($caps, [$type_obj->cap->edit_others_posts, 'do_not_allow']); + + $check_post = $post; + + if ($post->ID <= 0) { + if ($check_id = rvy_detect_post_id()) { + $check_post = get_post($check_id); + } + } + + if (rvy_is_post_author($check_post) || rvy_is_post_author(rvy_post_id($check_post->ID)) || rvy_is_full_editor($post)) { + $caps []= 'read'; + + } elseif (rvy_get_option('revisor_hide_others_revisions')) { + $caps []= 'list_others_revisions'; + + } else { + $caps []= $type_obj->cap->edit_posts; + } + } + + $busy = false; + return $caps; + } + } elseif (($post_id > 0) && $post && rvy_in_revision_workflow($post) + && rvy_get_option('revisor_lock_others_revisions') && !rvy_is_post_author($post) && !rvy_is_full_editor(rvy_post_id($post->ID)) + ) { + if ($type_obj = get_post_type_object( $post->post_type )) { + if (in_array($type_obj->cap->edit_others_posts, $caps)) { + if ((!empty($type_obj->cap->edit_others_posts) && empty($current_user->allcaps[$type_obj->cap->edit_others_posts])) + || (!empty($type_obj->cap->edit_published_posts) && empty($current_user->allcaps[$type_obj->cap->edit_published_posts])) + ) { + if (!current_user_can('edit_post', rvy_post_id($post_id))) { + if (!empty($current_user->allcaps['edit_others_revisions'])) { + $caps[] = 'edit_others_revisions'; + } else { + $caps []= 'do_not_allow'; // @todo: implement this within user_has_cap filters? + } + } + } + } + } + } + + if (in_array($cap, array('edit_post', 'edit_page'))) { + if ($post && !empty($post->post_status)) { + if (!in_array($post->post_status, rvy_filtered_statuses())) { + $busy = false; + return $caps; + } + } + + $busy = true; + + // Run reqd_caps array through the filter which is normally used to implicitly grant edit_published cap to Revisors + // Applying this adjustment to reqd_caps instead of user caps on 'edit_post' checks allows for better compat with PressPermit and other plugins + if ($grant_caps = $this->filter_caps(array(), $caps, array(0 => $cap, 1 => $user_id, 2 => $post_id))) { + $caps = array_diff($caps, array_keys(array_filter($grant_caps))); + + if (!$caps) { + if ($type_obj = get_post_type_object( $post->post_type )) { + $caps = [$type_obj->cap->edit_posts]; + } + } + } + } + + $busy = false; + return $caps; + } + + function flt_user_has_cap($wp_blogcaps, $reqd_caps, $args) { + return $this->filter_caps($wp_blogcaps, $reqd_caps, $args); + } + + private function filter_caps($wp_blogcaps, $reqd_caps, $args, $internal_args = array()) { + global $current_user; + + if (!empty($this->skip_filtering) || !rvy_get_option('pending_revisions')) { + return $wp_blogcaps; + } + + $post_id = ( ! empty($args[2]) ) ? $args[2] : rvy_detect_post_id(); + + if (!$post = get_post($post_id)) { + if (($post_id == -1) && defined('PRESSPERMIT_PRO_VERSION') && !empty(presspermit()->meta_cap_post)) { // wp_cache_add(-1) does not work for map_meta_cap call on get-revision-diffs ajax call + $post = presspermit()->meta_cap_post; + } + } + + if (empty($post) || (empty($this->enabled_post_types[$post->post_type]) && $this->config_loaded)) { + return $wp_blogcaps; + } + + if (rvy_in_revision_workflow($post)) { + $object_type_obj = get_post_type_object($post->post_type); + + if (('draft-revision' == $post->post_mime_type) && !rvy_is_post_author($post) && rvy_get_option('manage_unsubmitted_capability') && empty($wp_blogcaps['manage_unsubmitted_revisions'])) { + unset($wp_blogcaps[$object_type_obj->cap->edit_others_posts]); + } else { + if (defined('DOING_AJAX') && DOING_AJAX && !empty($_REQUEST['action']) && (false !== strpos(sanitize_key($_REQUEST['action']), 'query-attachments'))) { + if ('post' == $post->post_type) { + return $wp_blogcaps; + } + } + + // If edit_others capability is being required for this post type, apply edit_others_revisions capability + if (!empty($object_type_obj->cap) && in_array($object_type_obj->cap->edit_others_posts, $reqd_caps)) { + if (!empty($current_user->allcaps['edit_others_revisions']) || !rvy_get_option('revisor_lock_others_revisions')) { + $wp_blogcaps[$object_type_obj->cap->edit_others_posts] = true; + + } elseif (rvy_get_option('admin_revisions_to_own_posts') && current_user_can('edit_post', rvy_post_id($post_id))) { + $wp_blogcaps[$object_type_obj->cap->edit_others_posts] = true; + } + } + + // Grant edit permission for revision if user can edit main post + if (!empty($args[0]) && ('edit_post' == $args[0]) && array_diff($reqd_caps, array_keys(array_filter($wp_blogcaps)))) { + $this->skip_filtering = true; + + if (rvy_get_option('admin_revisions_to_own_posts') && current_user_can('edit_post', rvy_post_id($post_id))) { + $wp_blogcaps = array_merge($wp_blogcaps, array_fill_keys($reqd_caps, true)); + } + + $this->skip_filtering = false; + } + } + } + + return $wp_blogcaps; + } + + function fltRemoveInvalidPostDataKeys($data, $postarr) { + unset($data['filter']); + return $data; + } + + // If Scheduled Revisions are enabled, don't allow WP to force current post status to future based on publish date + function flt_insert_post_data( $data, $postarr ) { + if ( ( 'future' == $data['post_status'] ) && ( rvy_is_status_published( $postarr['post_status'] ) ) ) { + + if (!empty($postarr['post_type']) && empty($this->enabled_post_types[$postarr['post_type']])) { + return $data; + } + + // don't interfere with scheduling of unpublished drafts + if ( $stored_status = get_post_field ( 'post_status', rvy_detect_post_id() ) ) { + if ( rvy_is_status_published($stored_status) && !rvy_is_status_published($data['post_status']) && ('future' != $data['post_status']) ) { + $data['post_status'] = $postarr['post_status']; + } + } + } + + // If this is already a scheduled revision and the date is being modified, update the WP-Cron entry + if (rvy_in_revision_workflow($postarr['ID']) && ('future-revision' == $postarr['post_mime_type'])) { + + $current_post_date_gmt = get_post_field('post_date_gmt', $postarr['ID']); + + if ($data['post_date_gmt'] != $current_post_date_gmt) { + wp_unschedule_event(strtotime($current_post_date_gmt), 'publish_revision_rvy', [$postarr['ID']]); + + wp_schedule_single_event(strtotime($data['post_date_gmt']), 'publish_revision_rvy', [$postarr['ID']]); + } + } + + return $data; + } + + // @todo: confirm this is still needed + function flt_regulate_revision_status($data, $postarr) { + // Revisions are not published by wp_update_post() execution; Prevent setting to a non-revision status + if (rvy_get_post_meta($postarr['ID'], '_rvy_base_post_id', true) && ('trash' != $data['post_status'])) { + if (!$revision = get_post($postarr['ID'])) { + return $data; + } + + if (empty($this->enabled_post_types[$revision->post_type])) { + return $data; + } + + if (!rvy_is_revision_status($postarr['post_mime_type']) || !in_array($postarr['post_status'], rvy_revision_base_statuses())) { + $revert_status = true; + + } elseif ($revision) { + if (($data['post_mime_type'] != $revision->post_mime_type) || ($data['post_status'] != $revision->post_status) + && (('future-revision' == $revision->post_mime_type) || ('future-revision' == $postarr['post_mime_type'])) + ) { + $revert_status = true; + } + } + + if (!empty($revert_status) && rvy_in_revision_workflow($revision)) { + $data['post_status'] = $revision->post_status; + $data['post_mime_type'] = $revision->post_mime_type; + } + } + + return $data; + } + + function do_notifications( $notification_type, $status, $post_arr, $args ) { + global $rvy_workflow_ui; + if ( ! isset( $rvy_workflow_ui ) ) { + require_once( dirname(__FILE__).'/revision-workflow_rvy.php' ); + $rvy_workflow_ui = new Rvy_Revision_Workflow_UI(); + } + + return $rvy_workflow_ui->do_notifications( $notification_type, $status, $post_arr, $args ); + } + + // Prevent wp_update_comment_count_now() from modifying Pending Revision comment_count field (main post ID) + function fltUpdateCommentCountBypass($count, $old, $post_id) { + if (rvy_in_revision_workflow($post_id)) { + return rvy_post_id($post_id); + } + + return $count; + } + + function fltIsPreview($is_preview) { + if (defined('RVY_PREVIEW_ARG') && RVY_PREVIEW_ARG && !empty($_REQUEST[RVY_PREVIEW_ARG])) { + $is_preview = true; + } + + return $is_preview; + } + + /* + * PublishPress Permissions: Make query filtering allow for revision previews + */ + function fltQueryPostStatuses($statuses, $args) { + if (((defined('RVY_PREVIEW_ARG') && RVY_PREVIEW_ARG && !empty($_REQUEST[RVY_PREVIEW_ARG]))) + && !empty($args['required_operation']) && ('edit' == $args['required_operation']) && function_exists('rvy_revision_base_statuses')) { + $statuses = array_merge($statuses, array_fill_keys(rvy_revision_base_statuses(), (object)[])); + } + + return $statuses; + } + + static function applyRevisionLimit($post) { + if (!is_object($post) || empty($post->ID)) { + return; + } + + $post_id = $post->ID; + + /* + * 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; + } + + $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; + } + + $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 ); + } + } +} // end Revisionary class diff --git a/wp-content/plugins/revisionary/rvy_init-functions.php b/wp-content/plugins/revisionary/rvy_init-functions.php new file mode 100644 index 000000000..0e78dcb8e --- /dev/null +++ b/wp-content/plugins/revisionary/rvy_init-functions.php @@ -0,0 +1,1532 @@ + $revision_id]); +} + +function _rvy_rest_prepare($response, $post, $request) { + if (!rvy_in_revision_workflow($post)) { + return $response; + } + + if ($type_obj = get_post_type_object($post->post_type)) { + $rest_base = ! empty( $type_obj->rest_base ) ? $type_obj->rest_base : $type_obj->name; + $namespace = ! empty( $type_obj->rest_namespace ) ? $type_obj->rest_namespace : 'wp/v2'; + + $base = sprintf( '%s/%s', $namespace, $rest_base ); + $href = rest_url( trailingslashit( $base ) . $post->ID ); + + $response->add_link('https://api.w.org/action-publish', $href); + } + + return $response; +} + +function rvy_mail_check_buffer($new_msg = [], $args = []) { + if (empty($args['log_only'])) { + if (!$use_buffer = rvy_get_option('use_notification_buffer')) { + return (defined('REVISIONARY_DISABLE_MAIL_LOG')) + ? array_fill_keys(['buffer', 'sent_mail', 'send_limits', 'sent_counts', 'new_msg_buffered'], []) + : []; + } + } + + require_once( dirname(__FILE__).'/mail-buffer_rvy.php'); + return _rvy_mail_check_buffer($new_msg, $args); +} + +function rvy_send_buffered_mail() { + require_once( dirname(__FILE__).'/mail-buffer_rvy.php'); + _rvy_send_buffered_mail(); +} + +function rvy_set_notification_buffer_cron() { + $cron_timestamp = wp_next_scheduled( 'rvy_mail_buffer_hook' ); + + if (rvy_get_option('use_notification_buffer')) { + if (!$cron_timestamp) { + wp_schedule_event(time(), 'two_minutes', 'rvy_mail_buffer_hook'); + } + } else { + wp_unschedule_event($cron_timestamp, 'rvy_mail_buffer_hook'); + } +} + +function rvy_mail_buffer_cron_interval( $schedules ) { + $schedules['two_minutes'] = array( + 'interval' => 120, + 'display' => esc_html__( 'Every 2 Minutes', 'revisionary' ), + ); + + return $schedules; +} + +function _revisionary_publish_scheduled_cron($revision_id) { + if (is_array($revision_id) && isset($revision_id['revision_id'])) { + $revision_id = $revision_id['revision_id']; + } + + if (rvy_get_option('scheduled_revisions') && rvy_get_option('scheduled_publish_cron')) { + revisionary_publish_scheduled(compact('revision_id')); + } +} + +/*=================== End WP-Cron implementation ====================*/ + + +function _rvy_existing_schedules_to_cron($prev_use_cron, $use_cron) { + if ($use_cron && !$prev_use_cron) { + global $wpdb; + + $time_gmt = current_time('mysql', 1); + + $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM $wpdb->posts WHERE post_type != 'revision' AND post_status != 'inherit' AND post_mime_type = 'future-revision' AND post_date_gmt > %s ORDER BY post_date_gmt DESC", + $time_gmt + ) + ); + + foreach($results as $revision) { + if (!wp_get_scheduled_event('publish_revision_rvy', ['revision_id' => $revision->ID])) { + wp_schedule_single_event(strtotime($revision->post_date_gmt), 'publish_revision_rvy', ['revision_id' => $revision->ID]); + } + } + } + + if (!$use_cron && $prev_use_cron) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_update_next_publish_date(); + } +} + + +/* + * Revision previews: prevent redirect for non-standard post url + */ +function _rvy_no_redirect_filter($redirect, $orig) { + global $current_user, $wpdb; + + if (!empty($current_user->ID) && (empty($wpdb) || empty($wpdb->is_404))) { + $redirect = $orig; + } + + return $redirect; +} + +function rvy_ajax_handler() { + global $current_user, $wpdb; + + if (!empty($_REQUEST['rvy_ajax_field']) && !empty($_REQUEST['rvy_ajax_value'])) { + if ($post_id = intval($_REQUEST['rvy_ajax_value'])) { + + switch ($_REQUEST['rvy_ajax_field']) { + case 'create_revision': + if (current_user_can('copy_post', $post_id)) { + $time_gmt = (!empty($_REQUEST['rvy_date_selection'])) ? intval($_REQUEST['rvy_date_selection']) : ''; + + require_once( dirname(REVISIONARY_FILE).'/revision-creation_rvy.php' ); + $rvy_creation = new PublishPress\Revisions\RevisionCreation(); + + $revision_status = (rvy_get_option('auto_submit_revisions') && current_user_can('edit_post', $post_id)) ? 'pending-revision' : 'draft-revision'; + $rvy_creation->createRevision($post_id, $revision_status, compact('time_gmt')); + } + exit; + + case 'submit_revision': + // capability check is applied within function to support batch execution without redundant checks + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_revision_submit($post_id); + $check_autosave = true; + + break; + + case 'create_scheduled_revision': + if (!empty($_REQUEST['rvy_date_selection'])) { + $time_gmt = intval($_REQUEST['rvy_date_selection']); + + if (current_user_can('edit_post', $post_id)) { + require_once( dirname(REVISIONARY_FILE).'/revision-creation_rvy.php' ); + $rvy_creation = new PublishPress\Revisions\RevisionCreation(); + $rvy_creation->createRevision($post_id, 'future-revision', compact('time_gmt')); + } + } + + break; + + case 'author_select': + if (!empty($_REQUEST['rvy_selection'])) { + if (current_user_can('edit_post', $post_id)) { + update_post_meta($post_id, '_rvy_author_selection', $_REQUEST['rvy_selection']); + } + } + + break; + + default: + } + + if (('submit_revision' != $_REQUEST['rvy_ajax_field']) && !empty($check_autosave) && !defined('REVISIONARY_IGNORE_REVISION_AUTOSAVE')) { + if ($autosave_post = PublishPress\Revisions\Utils::get_post_autosave($post_id, $current_user->ID)) { + $main_post = get_post($post_id); + + // If revision autosave is newer than revision post_updated date, copy over post data + if (strtotime($autosave_post->post_modified_gmt) > strtotime($main_post->post_modified_gmt)) { + $set_post_properties = [ + 'post_content', + 'post_content_filtered', + 'post_title', + 'post_excerpt', + ]; + + foreach($set_post_properties as $prop) { + if (!empty($autosave_post->$prop)) { + $update_data[$prop] = $autosave_post->$prop; + } + } + + $wpdb->update($wpdb->posts, $update_data, ['ID' => $post_id]); + + $wpdb->delete($wpdb->posts, ['ID' => $autosave_post->ID]); + } + } + } + + exit; + } + + } + + if (defined('DOING_AJAX') && DOING_AJAX && isset($_REQUEST['action']) && ('get-revision-diffs' == $_REQUEST['action'])) { + require_once( dirname(__FILE__).'/admin/history_rvy.php' ); + new RevisionaryHistory(); + } +} + +function rvy_get_post_meta($post_id, $meta_key, $unused = false) { + return get_post_meta($post_id, $meta_key, true); +} + +function rvy_update_post_meta($post_id, $meta_key, $meta_value) { + global $wpdb, $revisionary; + + if (!empty($revisionary)) { + $revisionary->internal_meta_update = true; + } + + update_post_meta($post_id, $meta_key, $meta_value); + + if (!empty($revisionary)) { + $revisionary->internal_meta_update = true; + } +} + +function rvy_delete_post_meta($post_id, $meta_key) { + delete_post_meta($post_id, $meta_key); +} + +function rvy_status_registrations() { + $block_editor = \PublishPress\Revisions\Utils::isBlockEditorActive(); + + $labels = apply_filters('revisionary_status_labels', + rvy_get_option('revision_statuses_noun_labels') ? + [ + 'draft-revision' => [ + 'name' => esc_html__('Working Copy', 'revisionary'), + 'submit' => esc_html__('Create Working Copy', 'revisionary'), + 'submit_short' => esc_html__('Copy', 'revisionary'), + 'submitting' => esc_html__('Creating Working Copy...', 'revisionary'), + 'submitted' => esc_html__('Working Copy ready', 'revisionary'), + 'approve' => esc_html__('Approve Changes', 'revisionary'), + 'approve_short' => esc_html__('Approve', 'revisionary'), + 'approving' => esc_html__('Approving Changes...', 'revisionary'), + 'publish' => esc_html__('Publish Changes', 'revisionary'), + 'save' => esc_html__('Save Revision', 'revisionary'), + 'update' => esc_html__('Update Revision', 'revisionary'), + 'plural' => esc_html__('Working Copies', 'revisionary'), + 'short' => esc_html__('Working Copy', 'revisionary'), + 'count' => _n_noop('Working Copies (%d)', 'Working Copies (%d)', 'revisionary'), // @todo: confirm API will support a fixed string + 'basic' => 'Copy', + ], + + 'pending-revision' => [ + 'name' => esc_html__('Change Request', 'revisionary'), + 'submit' => esc_html__('Submit Change Request', 'revisionary'), + 'submit_short' => esc_html__('Submit', 'revisionary'), + 'submitting' => esc_html__('Submitting Changes...', 'revisionary'), + 'submitted' => esc_html__('Changes Submitted', 'revisionary'), + 'approve' => esc_html__('Approve Changes', 'revisionary'), + 'approve_short' => esc_html__('Approve', 'revisionary'), + 'approving' => esc_html__('Approving Changes...', 'revisionary'), + 'publish' => esc_html__('Publish Changes', 'revisionary'), + 'save' => esc_html__('Save Revision', 'revisionary'), + 'update' => esc_html__('Update Revision', 'revisionary'), + 'plural' => esc_html__('Change Requests', 'revisionary'), + 'short' => esc_html__('Change Request', 'revisionary'), + 'count' => _n_noop('Change Requests (%d)', 'Change Requests (%d)', 'revisionary'), + 'enable' => esc_html__('Enable Change Requests', 'revisionary'), + 'basic' => 'Change Request', + ], + + 'future-revision' => [ + 'name' => esc_html__('Scheduled Change', 'revisionary'), + 'submit' => esc_html__('Schedule Changes', 'revisionary'), + 'submit_short' => esc_html__('Schedule Changes', 'revisionary'), + 'submitting' => esc_html__('Scheduling Changes...', 'revisionary'), + 'submitted' => esc_html__('Changes are Scheduled.', 'revisionary'), + 'approve' => esc_html__('Schedule Changes', 'revisionary'), + 'approve_short' => esc_html__('Schedule Changes', 'revisionary'), + 'publish' => esc_html__('Publish Changes', 'revisionary'), + 'save' => esc_html__('Save Revision', 'revisionary'), + 'update' => esc_html__('Update Revision', 'revisionary'), + 'plural' => esc_html__('Scheduled Changes', 'revisionary'), + 'short' => esc_html__('Scheduled Change', 'revisionary'), + 'count' => _n_noop('Scheduled Changes (%d)', 'Scheduled Changes (%d)', 'revisionary'), + 'basic' => 'Scheduled Change', + ], + ] + + : + [ + 'draft-revision' => [ + 'name' => esc_html__('Unsubmitted Revision', 'revisionary'), + 'submit' => esc_html__('New Revision', 'revisionary'), + 'submit_short' => esc_html__('New Revision', 'revisionary'), + 'submitting' => esc_html__('Creating Revision...', 'revisionary'), + 'submitted' => ($block_editor) ? esc_html__('The Revision is ready to edit.', 'revisionary') : esc_html__('Revision ready to edit.', 'revisionary'), + 'approve' => esc_html__('Approve Revision', 'revisionary'), + 'approve_short' => esc_html__('Approve', 'revisionary'), + 'publish' => esc_html__('Publish Revision', 'revisionary'), + 'save' => esc_html__('Save Revision', 'revisionary'), + 'update' => esc_html__('Update Revision', 'revisionary'), + 'plural' => esc_html__('Unsubmitted Revisions', 'revisionary'), + 'short' => esc_html__('Not Submitted', 'revisionary'), + 'count' => _n_noop('Not Submitted for Approval (%s)', 'Not Submitted for Approval (%s)', 'revisionary'), // @todo: confirm API will support a fixed string + 'basic' => 'Revision', + ], + + 'pending-revision' => [ + 'name' => esc_html__('Submitted Revision', 'revisionary'), + 'submit' => esc_html__('Submit Revision', 'revisionary'), + 'submit_short' => esc_html__('Submit', 'revisionary'), + 'submitting' => esc_html__('Submitting Revision...', 'revisionary'), + 'submitted' => ($block_editor) ? esc_html__('The Revision is Submitted', 'revisionary') : esc_html__('Revision Submitted', 'revisionary'), + 'approve' => esc_html__('Approve Revision', 'revisionary'), + 'approve_short' => esc_html__('Approve', 'revisionary'), + 'publish' => esc_html__('Publish Revision', 'revisionary'), + 'save' => esc_html__('Save Revision', 'revisionary'), + 'update' => esc_html__('Update Revision', 'revisionary'), + 'plural' => esc_html__('Submitted Revisions', 'revisionary'), + 'short' => esc_html__('Submitted', 'revisionary'), + 'count' => _n_noop('Submitted for Approval (%s)', 'Submitted for Approval (%s)', 'revisionary'), + 'basic' => 'Revision', + ], + + 'future-revision' => [ + 'name' => esc_html__('Scheduled Revision', 'revisionary'), + 'submit' => esc_html__('Schedule Revision', 'revisionary'), + 'submit_short' => esc_html__('Schedule Revision', 'revisionary'), + 'submitting' => esc_html__('Scheduling Revision...', 'revisionary'), + 'submitted' => ($block_editor) ? esc_html__('The Revision is Scheduled', 'revisionary') : esc_html__('Revision Scheduled', 'revisionary'), + 'approve' => esc_html__('Approve Revision', 'revisionary'), + 'approve_short' => esc_html__('Approve', 'revisionary'), + 'publish' => esc_html__('Publish Revision', 'revisionary'), + 'save' => esc_html__('Save Revision', 'revisionary'), + 'update' => esc_html__('Update Revision', 'revisionary'), + 'plural' => esc_html__('Scheduled Revisions', 'revisionary'), + 'short' => esc_html__('Scheduled', 'revisionary'), + 'count' => _n_noop('Scheduled Revision (%s)', 'Scheduled Revisions (%s)', 'revisionary'), + 'basic' => 'Scheduled Revision', + ], + ] + ); + + register_post_status('draft-revision', array( + 'label' => $labels['draft-revision']['name'], + 'labels' => (object) $labels['draft-revision'], + 'protected' => true, + 'internal' => true, + 'label_count' => $labels['draft-revision']['count'], + 'exclude_from_search' => false, + 'show_in_admin_all_list' => false, + 'show_in_admin_status_list' => false, + )); + + register_post_status('pending-revision', array( + 'label' => $labels['pending-revision']['name'], + 'labels' => (object) $labels['pending-revision'], + 'protected' => true, + 'internal' => true, + 'label_count' => $labels['pending-revision']['count'], + 'exclude_from_search' => false, + 'show_in_admin_all_list' => false, + 'show_in_admin_status_list' => false, + )); + + register_post_status('future-revision', array( + 'label' => $labels['future-revision']['name'], + 'labels' => (object) $labels['future-revision'], + 'protected' => true, + 'internal' => true, + 'label_count' => $labels['future-revision']['count'], + 'exclude_from_search' => false, + 'show_in_admin_all_list' => false, + 'show_in_admin_status_list' => false, + )); + + foreach(rvy_get_manageable_types() as $post_type) { + add_filter("rest_{$post_type}_collection_params", function($query_params, $post_type = '') + { + $query_params['status']['items']['enum'] []= 'draft-revision'; + $query_params['status']['items']['enum'] []= 'pending-revision'; + $query_params['status']['items']['enum'] []= 'future-revision'; + return $query_params; + }, 999, 2 + ); + } + + // WP > 5.3: Don't allow revision statuses to be blocked at the REST API level. Our own filters are sufficient to regulate their usage. + add_action( 'rest_api_init', function() { + global $wp_post_statuses; + + foreach(rvy_revision_statuses() as $status) { + if (isset($wp_post_statuses[$status])) { + $wp_post_statuses[$status]->internal = false; + } + } + }, 97 + ); + + add_action( 'rest_api_init', function() { + global $wp_post_statuses; + + foreach(rvy_revision_statuses() as $status) { + if (isset($wp_post_statuses[$status])) { + $wp_post_statuses[$status]->internal = true; + } + } + }, 99 +); +} + +function pp_revisions_status_label($status_name, $label_property) { + global $wp_post_statuses; + + if (!empty($wp_post_statuses[$status_name]) && !empty($wp_post_statuses[$status_name]->labels->$label_property)) { + return $wp_post_statuses[$status_name]->labels->$label_property; + } else { + return ''; + } +} + +function pp_revisions_label($label_name) { + static $labels; + + if (empty($labels)) { + $labels = apply_filters('revisionary_labels', + [ + 'my_revisions' => (rvy_get_option('revision_statuses_noun_labels')) + ? _n_noop('%sMy Copies & Changes%s(%s)', '%sMy Copies & Changes%s(%s)', 'revisionary') + : _n_noop('%sMy Revisions%s(%s)', '%sMy Revisions%s(%s)', 'revisionary'), + + 'my_published_posts' => _n_noop('%sRevisions to My Posts%s(%s)', '%sRevisions to My Posts%s(%s)', 'revisionary'), + + 'queue_col_revision' => esc_html__('Revision', 'revisionary'), + 'queue_col_revised_by' => esc_html__('Revised By', 'revisionary'), + 'queue_col_revision_date' => esc_html__('Revision Date', 'revisionary'), + 'queue_col_post_author' => esc_html__('Post Author', 'revisionary'), + 'queue_col_published_post' => esc_html__('Published Post', 'revisionary'), + 'update_revision' => esc_html__('Update Revision', 'revisionary'), + + 'submit_revision' => (rvy_get_option('revision_statuses_noun_labels')) + ? esc_html__('Submit Revision', 'revisionary') + : esc_html__('Submit Changes', 'revisionary') + ]); + } + + return (isset($labels[$label_name])) ? $labels[$label_name] : ''; +} + +// WP function is_plugin_active_for_network() is defined in admin +function rvy_plugin_active_for_network( $plugin ) { + if ( ! is_multisite() ) { + return false; + } + + $plugins = get_site_option( 'active_sitewide_plugins' ); + if ( isset( $plugins[ $plugin ] ) ) { + return true; + } + + return false; +} + +function rvy_is_plugin_active($check_plugin_file) { + $plugins = (array)get_option('active_plugins'); + foreach ($plugins as $plugin_file) { + if (false !== strpos($plugin_file, $check_plugin_file)) { + return $plugin_file; + } + } + + if (is_multisite()) { + $plugins = (array)get_site_option('active_sitewide_plugins'); + + // network activated plugin names are array keys + foreach (array_keys($plugins) as $plugin_file) { + if (false !== strpos($plugin_file, $check_plugin_file)) { + return $plugin_file; + } + } + } +} + +function rvy_configuration_late_init() { + global $revisionary; + + if (!empty($revisionary)) { + $revisionary->configurationLateInit(); + } +} + +// auto-define the Revisor role to include custom post type capabilities equivalent to those added for post, page in rvy_add_revisor_role() +function rvy_add_revisor_custom_caps() { + if ( ! rvy_get_option( 'revisor_role_add_custom_rolecaps' ) ) + return; + + global $wp_roles, $revisionary; + + if (empty($revisionary)) { + return; + } + + $custom_types = array_intersect_key( + get_post_types(['_builtin' => false], 'object'), + $revisionary->enabled_post_types + ); + + if ( isset( $wp_roles->roles['revisor'] ) ) { + if ($custom_types) { + foreach( $custom_types as $post_type => $type_obj ) { + $cap = $type_obj->cap; + $custom_caps = array_fill_keys( array( $cap->read_private_posts, $cap->edit_posts, $cap->edit_others_posts, "delete_{$post_type}s" ), true ); + + if (!empty($type_obj->cap->edit_published_posts)) { + $list_published_cap = str_replace('edit_', 'list_', $type_obj->cap->edit_published_posts); + $custom_caps[$list_published_cap] = true; + } + + if (!empty($type_obj->cap->edit_private_posts)) { + $list_private_cap = str_replace('edit_', 'list_', $type_obj->cap->edit_private_posts); + $custom_caps[$list_private_cap] = true; + } + + $wp_roles->roles['revisor']['capabilities'] = array_merge( $wp_roles->roles['revisor']['capabilities'], $custom_caps ); + $wp_roles->role_objects['revisor']->capabilities = array_merge( $wp_roles->role_objects['revisor']->capabilities, $custom_caps ); + } + } + } + + if ( isset( $wp_roles->roles['contributor'] ) ) { + if ($custom_types) { + foreach( $custom_types as $post_type => $type_obj ) { + $cap = $type_obj->cap; + $custom_caps = []; + + if (!empty($type_obj->cap->edit_published_posts)) { + $list_published_cap = str_replace('edit_', 'list_', $type_obj->cap->edit_published_posts); + $custom_caps[$list_published_cap] = true; + } + + if (!empty($type_obj->cap->edit_private_posts)) { + $list_private_cap = str_replace('edit_', 'list_', $type_obj->cap->edit_private_posts); + $custom_caps[$list_private_cap] = true; + } + + $wp_roles->roles['contributor']['capabilities'] = array_merge( $wp_roles->roles['contributor']['capabilities'], $custom_caps ); + $wp_roles->role_objects['contributor']->capabilities = array_merge( $wp_roles->role_objects['contributor']->capabilities, $custom_caps ); + } + } + } + + global $current_user; + + foreach(['contributor', 'revisor'] as $role_name) { + if (in_array($role_name, $current_user->roles)) { + $current_user->allcaps = array_merge($current_user->allcaps, $wp_roles->role_objects[$role_name]->capabilities); + } + } + + if (function_exists('presspermit')) { + $user = presspermit()->getUser(); + $user->allcaps = $current_user->allcaps; + } +} + +function rvy_detect_post_type() { + global $revisionary; + + if ( isset($revisionary) && $revisionary->doing_rest && $revisionary->rest->is_posts_request ) + return $revisionary->rest->post_type; + else + return awp_post_type_from_uri(); +} + +function rvy_detect_post_id() { + global $revisionary; + + if ( isset($revisionary) && $revisionary->doing_rest && $revisionary->rest->is_posts_request ) { + $post_id = $revisionary->rest->post_id; + + } elseif ( ! empty( $_GET['post'] ) ) { + $post_id = (int) $_GET['post']; + + } elseif ( ! empty( $_POST['post_ID'] ) ) { + $post_id = (int) $_POST['post_ID']; + + } elseif ( ! empty( $_REQUEST['post_id'] ) ) { + $post_id = (int) $_REQUEST['post_id']; + + } elseif ( ! empty( $_GET['p'] ) ) { + $post_id = (int) $_GET['p']; + + } elseif ( ! empty( $_GET['id'] ) ) { + $post_id = (int) $_GET['id']; + + } elseif ( ! empty( $_REQUEST['fl_builder_data'] ) && is_array( $_REQUEST['fl_builder_data'] ) && ! empty( $_REQUEST['fl_builder_data']['post_id'] ) ) { + $post_id = (int) $_REQUEST['fl_builder_data']['post_id']; + + } elseif ( ! empty( $_GET['page_id'] ) ) { + $post_id = (int) $_GET['page_id']; + + } elseif (defined('REST_REQUEST') && REST_REQUEST && isset($_SERVER['REQUEST_URI']) && strpos(esc_url_raw($_SERVER['REQUEST_URI']), 'autosaves')) { + require_once( dirname(__FILE__).'/rest_rvy.php' ); + $post_id = Revisionary_REST::get_id_element(esc_url_raw($_SERVER['REQUEST_URI']), 1); + + } elseif (defined('DOING_AJAX') && DOING_AJAX) { + $post_id = apply_filters('revisionary_detect_id', 0, ['is_ajax' => true]); + + } else { + $post_id = 0; + } + + return $post_id; +} + +function rvy_add_revisor_role( $requested_blog_id = '' ) { + global $wp_roles; + + if (defined('REVISIONARY_NO_REVISOR_ROLE')) { + return; + } + + $wp_role_caps = array( + 'read' => true, + 'read_private_posts' => true, + 'read_private_pages' => true, + 'edit_posts' => true, + 'delete_posts' => true, + 'edit_others_posts' => true, + 'edit_pages' => true, + 'delete_pages' => true, + 'edit_others_pages' => true, + 'list_published_posts' => true, + 'list_published_pages' => true, + 'list_private_posts' => true, + 'list_private_pages' => true, + 'upload_files' => true, + 'level_3' => true, + 'level_2' => true, + 'level_1' => true, + 'level_0' => true + ); + + $wp_roles->add_role( 'revisor', esc_html__( 'Revisor', 'revisionary' ), $wp_role_caps ); +} + +function rvy_apply_role_translation($translations, $text, $context, $domain) { + if (('User role' === $context) && ('Revisor' == $text) && ($domain !== 'revisionary')) { + return translate_with_gettext_context($text, $context, 'revisionary'); + } + + return $translations; +} + +function rvy_role_translation_support() { + _x('Revisor', 'User role', 'revisionary'); + add_filter('gettext_with_context', 'rvy_apply_role_translation', 10, 4); +} + +// wrapper function for use with wp_cron hook +function revisionary_publish_scheduled($args = []) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_publish_scheduled_revisions($args); +} + +function revisionary_refresh_postmeta($post_id, $args = []) { + global $wpdb; + + $ignore_revisions = (!empty($args['ignore_revisions'])) ? $args['ignore_revisions'] : []; + $ignore_clause = ($ignore_revisions) ? " AND ID NOT IN (" . implode(",", array_map('intval', $ignore_revisions)) . ")" : ''; + + if (defined('REVISIONARY_LIMIT_IGNORE_UNSUBMITTED')) { + $ignore_clause .= " AND post_mime_type != 'draft-revision'"; + } + + $revision_status_csv = implode("','", array_map('sanitize_key', rvy_revision_statuses())); + + $has_revisions = $wpdb->get_var( + // account for post deletion + $wpdb->prepare( + "SELECT ID FROM $wpdb->posts WHERE post_mime_type IN ('$revision_status_csv') $ignore_clause AND comment_count = %d LIMIT 1", + $post_id + ) + ); + + $set_value = !empty($has_revisions); + + $_post = get_post($post_id); + + if ($set_value && (empty($_post) || empty($_post->post_mime_type) || !in_array($_post->post_mime_type, ['draft-revision', 'pending-revision', 'future-revision']))) { + rvy_update_post_meta($post_id, '_rvy_has_revisions', $set_value); + + } elseif (empty($args['insert_only'])) { // avoid redundant deletions + delete_post_meta($post_id, '_rvy_has_revisions'); + } +} + +function rvy_post_revision_supported($post) { + $post_id = (is_scalar($post)) ? $post : $post->ID; + + if ($post_id) { + if (1 === intval(rvy_get_option('revision_limit_per_post'))) { + if (rvy_get_post_meta($post_id, '_rvy_has_revisions')) { + return false; + } + } + } + + return true; +} + +if (!empty($_REQUEST['rvy_flush_flags'])) { + revisionary_refresh_revision_flags(); +} + +function revisionary_refresh_revision_flags($published_post_id = 0, $args = []) { + global $wpdb; + + $ignore_revision_ids = (!empty($args['ignore_revision_ids'])) ? (array) $args['ignore_revision_ids'] : []; + + $status_csv = implode("','", array_map('sanitize_key', rvy_filtered_statuses())); + $revision_base_status_csv = implode("','", array_map('sanitize_key', rvy_revision_base_statuses())); + + $revision_statuses = rvy_revision_statuses(); + + if (defined('REVISIONARY_LIMIT_IGNORE_UNSUBMITTED')) { + $revision_statuses = array_diff($revision_statuses, ['draft-revision']); + } + + $revision_status_csv = implode("','", array_map('sanitize_key', $revision_statuses)); + + $query = "SELECT r.comment_count FROM $wpdb->posts r INNER JOIN $wpdb->posts p ON r.comment_count = p.ID" + . " WHERE p.post_status IN ('$status_csv') AND r.post_status IN ('$revision_base_status_csv')" + . " AND r.post_mime_type IN ('$revision_status_csv') AND p.post_mime_type NOT IN ('$revision_status_csv')"; + + if ($published_post_id) { + $query = $wpdb->prepare("$query AND p.ID = %d", $published_post_id); + } + + if ($ignore_revision_ids) { + $ignore_revisions_csv = implode("','", array_map('sanitize_key', $ignore_revision_ids)); + $query .= " AND r.ID NOT IN ('$ignore_revisions_csv')"; + } + + $arr_have_revisions = $wpdb->get_col($query); + + $have_revisions = implode("','", array_map('intval', array_unique($arr_have_revisions))); + + if ($ids = $wpdb->get_col("SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_rvy_has_revisions' AND post_id NOT IN ('$have_revisions')")) { + foreach ($ids as $post_id) { + rvy_delete_post_meta($post_id, '_rvy_has_revisions'); + } + } + + $query = "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_rvy_has_revisions'"; + + if ($published_post_id) { + $query = $wpdb->prepare("$query AND post_id = %d", $published_post_id); + } + + $have_flag_ids = $wpdb->get_col($query); + + if ($posts_missing_flag = array_diff($arr_have_revisions, $have_flag_ids)) { + foreach($posts_missing_flag as $post_id) { + rvy_update_post_meta($post_id, '_rvy_has_revisions', true); + } + } + + if ($posts_invalid_flag = array_diff($have_flag_ids, $arr_have_revisions)) { + foreach($posts_missing_flag as $post_id) { + rvy_delete_post_meta($post_id, '_rvy_has_revisions'); + } + } +} + +function rvy_refresh_options() { + rvy_retrieve_options(true); + rvy_retrieve_options(false); + + rvy_refresh_default_options(); + rvy_refresh_options_sitewide(); +} + +function rvy_refresh_options_sitewide() { + if ( ! RVY_NETWORK ) + return; + + global $rvy_options_sitewide; + $rvy_options_sitewide = apply_filters( 'options_sitewide_rvy', rvy_default_options_sitewide() ); // establishes which options are set site-wide + + if ( $options_sitewide_reviewed = rvy_get_option( 'options_sitewide_reviewed', true ) ) { + $custom_options_sitewide = (array) rvy_get_option( 'options_sitewide', true ); + + $unreviewed_default_sitewide = array_diff( array_keys($rvy_options_sitewide), $options_sitewide_reviewed ); + + $rvy_options_sitewide = array_fill_keys( array_merge( $custom_options_sitewide, $unreviewed_default_sitewide ), true ); + } + + $rvy_options_sitewide = array_filter( $rvy_options_sitewide ); +} + +function rvy_refresh_default_options() { + global $rvy_default_options; + + $rvy_default_options = apply_filters( 'default_options_rvy', rvy_default_options() ); + + if ( RVY_NETWORK ) + rvy_apply_custom_default_options(); +} + +function rvy_apply_custom_default_options() { + global $wpdb, $rvy_default_options, $rvy_options_sitewide; + + if ( $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE site_id = %d AND meta_key LIKE 'rvy_default_%'", + $wpdb->siteid + ) + ) ) { + foreach ( $results as $row ) { + $option_basename = str_replace( 'rvy_default_', '', $row->meta_key ); + + if ( ! empty( $rvy_options_sitewide[$option_basename] ) ) + continue; // custom defaults are only for site-specific options + + if( isset( $rvy_default_options[$option_basename] ) ) + $rvy_default_options[$option_basename] = maybe_unserialize( $row->meta_value ); + } + } +} + +function rvy_delete_option( $option_basename, $sitewide = -1 ) { + + // allow explicit selection of sitewide / non-sitewide scope for better performance and update security + if ( -1 === $sitewide ) { + global $rvy_options_sitewide; + $sitewide = isset( $rvy_options_sitewide ) && ! empty( $rvy_options_sitewide[$option_basename] ); + } + + if ( $sitewide ) { + global $wpdb; + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->sitemeta} WHERE site_id = %s AND meta_key = %s", + $wpdb->siteid, + "rvy_$option_basename" + ) + ); + } else + delete_option( "rvy_$option_basename" ); +} + +function rvy_update_option( $option_basename, $option_val, $sitewide = -1 ) { + + // allow explicit selection of sitewide / non-sitewide scope for better performance and update security + if ( -1 === $sitewide ) { + global $rvy_options_sitewide; + $sitewide = isset( $rvy_options_sitewide ) && ! empty( $rvy_options_sitewide[$option_basename] ); + } + + if ($sitewide) { + update_site_option("rvy_$option_basename", $option_val); + } else { + update_option("rvy_$option_basename", $option_val); + } +} + +function rvy_retrieve_options( $sitewide = false ) { + global $wpdb; + + if ( $sitewide ) { + if ( ! RVY_NETWORK ) + return; + + global $rvy_site_options; + + $rvy_site_options = array(); + + if ( $results = $wpdb->get_results( + $wpdb->prepare( + "SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE site_id = %d AND meta_key LIKE 'rvy_%'", + $wpdb->siteid + ) + ) ) { + foreach ( $results as $row ) { + $rvy_site_options[$row->meta_key] = $row->meta_value; + } + } + + $rvy_site_options = apply_filters( 'site_options_rvy', $rvy_site_options ); + return $rvy_site_options; + + } else { + global $rvy_blog_options; + + $rvy_blog_options = array(); + + if ( $results = $wpdb->get_results("SELECT option_name, option_value FROM $wpdb->options WHERE option_name LIKE 'rvy_%'") ) { + foreach ( $results as $row ) { + $rvy_blog_options[$row->option_name] = $row->option_value; + } + } + + $rvy_blog_options = apply_filters( 'options_rvy', $rvy_blog_options ); + return $rvy_blog_options; + } +} + +function rvy_filter_option($option_basename, $args) { + return apply_filters("pp_revisions_option_{$option_basename}", rvy_get_option($option_basename), $args); +} + +function rvy_get_option($option_basename, $sitewide = -1, $get_default = false, $args = []) { + if (('async_scheduled_publish' == $option_basename) && function_exists('relevanssi_query')) { + return false; + } + + if (('scheduled_revisions' == $option_basename) && empty($args['bypass_condition_check']) + && defined('DISABLE_WP_CRON') && DISABLE_WP_CRON && rvy_get_option('scheduled_publish_cron') && !rvy_get_option('wp_cron_usage_detected') && apply_filters('revisionary_wp_cron_disabled', true) + ) { + return false; + } + + if ( ! $get_default ) { + // allow explicit selection of sitewide / non-sitewide scope for better performance and update security + if ( -1 === $sitewide ) { + global $rvy_options_sitewide; + $sitewide = isset( $rvy_options_sitewide ) && ! empty( $rvy_options_sitewide[$option_basename] ); + } + + if ( $sitewide ) { + // this option is set site-wide + global $rvy_site_options; + + if ( ! isset($rvy_site_options) ) + $rvy_site_options = rvy_retrieve_options( true ); + + if ( isset($rvy_site_options["rvy_{$option_basename}"]) ) + $optval = $rvy_site_options["rvy_{$option_basename}"]; + + } else { + global $rvy_blog_options; + + if ( ! isset($rvy_blog_options) ) + $rvy_blog_options = rvy_retrieve_options( false ); + + if ( isset($rvy_blog_options["rvy_$option_basename"]) ) + $optval = $rvy_blog_options["rvy_$option_basename"]; + } + } + + if ( ! isset( $optval ) ) { + global $rvy_default_options; + + if ( empty( $rvy_default_options ) ) { + if ( did_action( 'rvy_init' ) ) // Make sure other plugins have had a chance to apply any filters to default options + rvy_refresh_default_options(); + else { + $hardcode_defaults = rvy_default_options(); + if ( isset($hardcode_defaults[$option_basename]) ) + $optval = $hardcode_defaults[$option_basename]; + } + } + + if ( ! empty($rvy_default_options) && ! empty( $rvy_default_options[$option_basename] ) ) + $optval = $rvy_default_options[$option_basename]; + + if ( ! isset($optval) ) + return ''; + } + + return maybe_unserialize($optval); +} + +function rvy_log_async_request($action) { + // the function which performs requested action will clear this entry to confirm that the asynchronous call was effective + $requested_actions = get_option( 'requested_remote_actions_rvy' ); + if ( ! is_array($requested_actions) ) + $requested_actions = array(); + + $requested_actions[$action] = true; + update_option( 'requested_remote_actions_rvy', $requested_actions ); +} + +function rvy_confirm_async_execution($action) { + $requested_actions = get_option( 'requested_remote_actions_rvy' ); + if ( is_array($requested_actions) && isset($requested_actions[$action]) ) { + unset( $requested_actions[$action] ); + update_option( 'requested_remote_actions_rvy', $requested_actions ); + } else { + exit; + } +} + +function is_content_administrator_rvy() { + $cap_name = defined( 'SCOPER_CONTENT_ADMIN_CAP' ) ? SCOPER_CONTENT_ADMIN_CAP : 'activate_plugins'; + return current_user_can( $cap_name ); +} + +function rvy_notice( $message, $class = 'error fade' ) { + include_once( dirname(__FILE__).'/lib/error_rvy.php'); + $rvy_err = new RvyError(); + return $rvy_err->add_notice( $message, compact( 'class' ) ); +} + +function rvy_error( $err_slug, $arg2 = '' ) { + include_once( dirname(__FILE__).'/lib/error_rvy.php'); + $rvy_err = new RvyError(); + $rvy_err->error_notice( $err_slug ); +} + +function rvy_check_duplicate_mail($new_msg, $sent_mail, $buffer) { + foreach([$sent_mail, $buffer] as $compare_set) { + foreach($compare_set as $sent) { + foreach(['address', 'title', 'message'] as $field) { + if (!isset($new_msg[$field]) + || !isset($sent[$field]) + || ($new_msg[$field] != $sent[$field]) + ) { + continue 2; + } + } + + $min_seconds = (defined('ET_BUILDER_PLUGIN_VERSION') || (false !== stripos(get_template(), 'divi'))) ? 20 : 5; + + // If an identical message was sent or queued to the same recipient less than 5 seconds ago, don't send another + if (abs($new_msg['time_gmt'] - $sent['time_gmt']) <= $min_seconds) { + return true; + } + } + } +} + +/* + * wp_mail() wrapper, also implements mail buffer + * + * args: ['revision_id' => $revision_id, 'post_id' => $published_post->ID, 'notification_type' => $notification_type, 'notification_class' => $notification_class] + */ +function rvy_mail( $address, $title, $message, $args ) { + /* + * [wp-cron action checks wp_option revisionary_mail_buffer. If wait time has elapsed, send buffered emails (up to limit per minute)] + * + * If mail is already buffered to wp_option revisionary_mail_buffer, add this email to buffer + * + * - or - + * + * Check wp_option array revisionary_sent_mail + * - If exceeding daily, hourly or minute limit, add this email to buffer + * - If sending, add current timestamp to wp_option array revisionary_sent_mail + */ + + $send = apply_filters('revisionary_mail', compact('address', 'title', 'message'), $args); + + if (empty($send['address'])) { + return; + } + + $new_msg = array_merge($send, ['time' => strtotime(current_time( 'mysql' )), 'time_gmt' => time()], $args); + + if (!$buffer_status = rvy_mail_check_buffer($new_msg)) { + $buffer_status = (object)[]; + } + + if (!empty($buffer_status->new_msg_buffered)) { + return; + } + + $sent_mail = (!empty($buffer_status->sent_mail)) ? $buffer_status->sent_mail : []; + $buffer = (!empty($buffer_status->buffer)) ? $buffer_status->buffer : []; + if (rvy_check_duplicate_mail($new_msg, $sent_mail, $buffer)) { + return; + } + + if ( defined( 'RS_DEBUG' ) ) + $success = wp_mail( $new_msg['address'], $new_msg['title'], $new_msg['message'] ); + else + $success = @wp_mail( $new_msg['address'], $new_msg['title'], $new_msg['message'] ); + + if ($success || !defined('REVISIONARY_MAIL_RETRY')) { + if (!defined('REVISIONARY_DISABLE_MAIL_LOG')) { + if (!isset($buffer_status->sent_mail)) { + $buffer_status->sent_mail = []; + } + + $buffer_status->sent_mail[]= $new_msg; + update_option('revisionary_sent_mail', $buffer_status->sent_mail); + } + } +} + +function rvy_settings_scripts() { + if (defined('PUBLISHPRESS_REVISIONS_PRO_VERSION')) { + $suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '.dev' : ''; + wp_enqueue_script('revisionary-pro-settings', plugins_url('', REVISIONARY_PRO_FILE) . "/includes-pro/settings-pro{$suffix}.js", ['jquery', 'jquery-form'], PUBLISHPRESS_REVISIONS_VERSION, true); + } +} + +function rvy_omit_site_options() { + rvy_settings_scripts(); + add_thickbox(); + include_once( RVY_ABSPATH . '/admin/options.php' ); + rvy_options( false ); +} + +function rvy_wp_api_request() { + return ( function_exists('wp_api_request') ) ? wp_api_request() : false; +} + +function rvy_is_status_public( $status ) { + if ( $post_status_obj = get_post_status_object( $status ) ) { + return ! empty( $post_status_obj->public ); + } + + return false; +} + +function rvy_is_status_private( $status ) { + if ( $post_status_obj = get_post_status_object( $status ) ) { + return ! empty( $post_status_obj->private ); + } + + return false; +} + +function rvy_is_status_published( $status ) { + if ( $post_status_obj = get_post_status_object( $status ) ) { + return ! empty( $post_status_obj->public ) || ! empty( $post_status_obj->private ); + } + + return false; +} + +function rvy_halt( $msg, $title = '' ) { + if ( ! $title ) { + $title = esc_html__( 'Revision Workflow', 'revisionary' ); + } + wp_die( esc_html($msg), esc_html($title), array( 'response' => 200 ) ); +} + +function _revisionary_dashboard_dismiss_msg() { + $dismissals = get_option( 'revisionary_dismissals' ); + if ( ! is_array( $dismissals ) ) + $dismissals = array(); + + $msg_id = ( isset( $_REQUEST['msg_id'] ) ) ? sanitize_key($_REQUEST['msg_id']) : 'intro_revisor_role'; + $dismissals[$msg_id] = true; + update_option( 'rvy_dismissals', $dismissals ); +} + +function rvy_is_supported_post_type($post_type) { + global $revisionary; + + if (empty($revisionary->enabled_post_types[$post_type]) && $revisionary->config_loaded) { + return false; + } + + $types = rvy_get_manageable_types(); + return !empty($types[$post_type]); +} + +function rvy_get_manageable_types() { + $types = array(); + + global $current_user, $revisionary; + + if (empty($revisionary)) { + return []; + } + + foreach(array_keys($revisionary->enabled_post_types) as $post_type) { + $types[$post_type]= $post_type; + } + + $types = array_diff_key($types, array('acf-field-group' => true)); + return apply_filters('revisionary_supported_post_types', $types); +} + +// thanks to GravityForms for the nifty dismissal script +if (isset($_SERVER['PHP_SELF']) && in_array( basename($_SERVER['PHP_SELF']), array('admin.php', 'admin-ajax.php') ) ) { + add_action( 'wp_ajax_rvy_dismiss_msg', '_revisionary_dashboard_dismiss_msg' ); +} + +function rvy_is_network_activated($plugin_file = '') +{ + if (!$plugin_file && defined('REVISIONARY_FILE')) { + $plugin_file = plugin_basename(REVISIONARY_FILE); + } + + return (array_key_exists($plugin_file, (array)maybe_unserialize(get_site_option('active_sitewide_plugins')))); +} + +function rvy_init() { + global $wp_roles; + + if ( ! isset( $wp_roles->roles['revisor'] ) ) { + rvy_add_revisor_role(); + } else { + if (!get_site_transient('revisionary_previous_install')) { + set_site_transient('revisionary_previous_install', true, 86400); + } + } + + rvy_role_translation_support(); + + if ( is_admin() ) { + require_once(dirname(__FILE__).'/admin/admin-init_rvy.php'); + + if (defined('REVISIONARY_BULK_ACTION_EARLY_EXECUTION') || !isset($_REQUEST['action2'])) { + rvy_admin_init(); + } else { + // bulk approval fails on some sites due to post types not registered early enough + add_action('wp_loaded', 'rvy_admin_init'); + } + } else { // @todo: fix links instead + // fill in the missing args for Pending / Scheduled revision preview link from Edit Posts / Pages + if ( isset($_SERVER['HTTP_REFERER']) + && ( false !== strpos( urldecode(esc_url_raw($_SERVER['HTTP_REFERER'])),'p-admin/edit-pages.php') + || false !== strpos( urldecode(esc_url_raw($_SERVER['HTTP_REFERER'])),'p-admin/edit.php') ) ) { + + if ( ! empty($_GET['p']) ) { + if ( rvy_get_option( 'scheduled_revisions' ) || rvy_get_option( 'pending_revisions' ) ) { + if ( $post = get_post( sanitize_text_field($_GET['p']) ) ) { + if (rvy_in_revision_workflow($post)) { + $preview_arg = (defined('RVY_PREVIEW_ARG')) ? sanitize_key(constant('RVY_PREVIEW_ARG')) : 'rv_preview'; + $_GET[$preview_arg] = 1; + } + } + } + } + // Is this an asynchronous request to publish scheduled revisions? + } elseif (!empty($_GET['action']) && ('publish_scheduled_revisions' == $_GET['action']) && rvy_get_option('scheduled_revisions') + && !rvy_get_option('scheduled_publish_cron')) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + add_action( 'rvy_init', '_rvy_publish_scheduled_revisions' ); + } + } + + if (empty($_GET['action']) || (isset($_GET['action']) && ('publish_scheduled_revisions' != $_GET['action']))) { + if (isset($_SERVER['REQUEST_URI']) && ! strpos( esc_url_raw($_SERVER['REQUEST_URI']), 'login.php' ) && rvy_get_option( 'scheduled_revisions' ) + && !rvy_get_option('scheduled_publish_cron')) { + + // If a previously requested asynchronous request was ineffective, perform the actions now + // (this is not executed if the current URI is from a manual publication request with action=publish_scheduled_revisions) + if (defined('RVY_SCHEDULED_PUBLISH_FALLBACK')) { + $requested_actions = get_option( 'requested_remote_actions_rvy' ); + if ( is_array( $requested_actions) && ! empty($requested_actions) ) { + if ( ! empty($requested_actions['publish_scheduled_revisions']) ) { + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_publish_scheduled_revisions(); + unset( $requested_actions['publish_scheduled_revisions'] ); + } + + update_option( 'requested_remote_actions_rvy', $requested_actions ); + } + } + + $next_publish = get_option( 'rvy_next_rev_publish_gmt' ); + + // automatically publish any scheduled revisions whose time has come + if ( ! $next_publish || ( agp_time_gmt() >= strtotime( $next_publish ) ) ) { + update_option('rvy_next_rev_publish_gmt', '2035-01-01 00:00:00'); + + if ( ini_get( 'allow_url_fopen' ) && rvy_get_option('async_scheduled_publish') ) { + // asynchronous secondary site call to avoid delays // TODO: pass site key here + rvy_log_async_request('publish_scheduled_revisions'); + $url = site_url( 'index.php?action=publish_scheduled_revisions' ); + wp_remote_post( $url, array('timeout' => 5, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', true)) ); + } else { + // publish scheduled revision now + if ( ! defined('DOING_CRON') ) { + define( 'DOING_CRON', true ); + } + require_once( dirname(__FILE__).'/admin/revision-action_rvy.php'); + rvy_publish_scheduled_revisions(); + } + } + } + } + + require_once( dirname(__FILE__).'/revisionary_main.php'); + + global $revisionary; + $revisionary = new Revisionary(); + $revisionary->init(); +} + +function rvy_is_full_editor($post, $args = []) { + global $current_user, $revisionary; + + if (is_numeric($post)) { + $post = get_post($post); + } + + if (empty($post) || !is_object($post)) { + return false; + } + + if (!$type_obj = get_post_type_object($post->post_type)) { + return false; + } + + $cap = (!empty($type_obj->cap->edit_others_posts)) ? $type_obj->cap->edit_others_posts : $type_obj->cap->edit_posts; + + if (empty($current_user->allcaps[$cap])) { + return false; + } + + if (!empty($args['check_publish_caps'])) { + if (!empty($type_obj->cap->edit_published_posts) && empty($current_user->allcaps[$type_obj->cap->edit_published_posts])) { + return false; + } + } else { + if (empty($revisionary)) { + return false; + } + + return $revisionary->canEditPost($post, ['simple_cap_check' => true]); + } + + return true; +} + +function rvy_is_post_author($post, $user = false) { + if (!is_object($post)) { + if (!$post = get_post($post)) { + return false; + } + } + + if (false === $user) { + global $current_user; + $user_id = $current_user->ID; + } else { + $user_id = (is_object($user)) ? $user->ID : $user; + } + + if (!empty($post->post_author) && ($post->post_author == $user_id)) { + return true; + + } elseif (function_exists('is_multiple_author_for_post') && is_multiple_author_for_post($user_id, $post->ID)) { + return true; + } + + return false; +} + +function rvy_preview_url($revision, $args = []) { + if (is_scalar($revision)) { + $revision = get_post($revision); + } + + $defaults = ['post_type' => $revision->post_type]; // support preview url for past revisions, which are stored with post_type = 'revision' + foreach(array_keys($defaults) as $var) { + $$var = (!empty($args[$var])) ? $args[$var] : $defaults[$var]; + } + + if ('revision' == $post_type) { + $post_type = get_post_field('post_type', $revision->post_parent); + } else { + if ($post_type_obj = get_post_type_object($revision->post_type)) { + if (empty($post_type_obj->public) && !defined('FL_BUILDER_VERSION') && !apply_filters('revisionary_private_type_use_preview_url', false, $revision)) { // For non-public types, preview is not available so default to Compare Revisions screen + return apply_filters('revisionary_preview_url', rvy_admin_url("revision.php?revision=$revision->ID"), $revision, $args); + } + } + } + $post_type = sanitize_key($post_type); + + $link_type = apply_filters( + 'revisionary_preview_link_type', + rvy_get_option('preview_link_type'), + $revision + ); + + $status_obj = get_post_status_object(get_post_field('post_status', rvy_post_id($revision->ID))); + $post_is_published = $status_obj && (!empty($status_obj->public) || !empty($status_obj->private)); + + $preview_arg = (defined('RVY_PREVIEW_ARG')) ? sanitize_key(constant('RVY_PREVIEW_ARG')) : 'rv_preview'; + + if ('id_only' == $link_type) { + // support using ids only if theme or plugins do not tolerate published post url and do not require standard format with revision slug + $preview_url = add_query_arg($preview_arg, true, get_post_permalink($revision)); + + if ('page' == $post_type) { + $preview_url = str_replace('p=', "page_id=", $preview_url); + $id_arg = 'page_id'; + } else { + $id_arg = 'p'; + } + } elseif (('revision_slug' == $link_type) || !$post_is_published) { + // support using actual revision slug in case theme or plugins do not tolerate published post url + $preview_url = add_query_arg($preview_arg, true, get_permalink($revision)); + + if ('page' == $post_type) { + $preview_url = str_replace('p=', "page_id=", $preview_url); + $id_arg = 'page_id'; + } else { + $id_arg = 'p'; + } + } else { // 'published_slug' + // default to published post url, appended with 'preview' and page_id args + $preview_url = add_query_arg($preview_arg, true, get_permalink(rvy_post_id($revision->ID))); + $id_arg = 'page_id'; + } + + if (strpos($preview_url, "{$id_arg}=")) { + $preview_url = remove_query_arg($id_arg, $preview_url); + } + + $preview_url = add_query_arg($id_arg, $revision->ID, $preview_url); + + if (!strpos($preview_url, "post_type=")) { + $preview_url = add_query_arg('post_type', $post_type, $preview_url); + } + + if (!defined('REVISIONARY_PREVIEW_NO_CACHEBUST')) { + $preview_url = rvy_nc_url($preview_url); + } + + $preview_url = apply_filters('revisionary_preview_url', $preview_url, $revision, $args); + $preview_url = remove_query_arg('preview_id', $preview_url); + + return $preview_url; +} + +function rvy_set_ma_post_authors($post_id, $authors) +{ + require_once( dirname(__FILE__).'/multiple-authors_rvy.php'); + _rvy_set_ma_post_authors_custom_field($post_id, $authors); + + $authors = wp_list_pluck($authors, 'term_id'); + wp_set_object_terms($post_id, $authors, 'author'); +} + +function rvy_filtered_statuses($args = []) { + $defaults = ['output' => 'names', 'return' => 'array']; + $args = array_merge($defaults, $args); + foreach (array_keys($defaults) as $var) { + $$var = $args[$var]; + } + + $arr = apply_filters( + 'revisionary_main_post_statuses', + get_post_stati( ['public' => true, 'private' => true], $output, 'or' ), + $output + ); + + return ('csv' == $return) ? "'" . implode("','", $arr) . "'" : $arr; +} + +// REST API Cache plugin compat +add_action('init', 'rvy_rest_cache_compat', 9999); + +function rvy_rest_cache_compat() { + global $wp_post_types; + + if (!isset($_SERVER['REQUEST_URI'])) { + return; + } + + $uri = esc_url_raw($_SERVER['REQUEST_URI']); + + $rest_cache_active = false; + foreach(['rvy_ajax_field', 'rvy_ajax_value'] as $param) { + if (strpos($uri, $param)) { + $rest_cache_active = true; + break; + } + } + + $rest_cache_active = $rest_cache_active + || (strpos($uri, '_locale=user') && strpos($uri, 'wp-json') && strpos($uri, '/posts/') && rvy_is_plugin_active('wp-rest-cache/wp-rest-cache.php')); + + if ($rest_cache_active) { + foreach(array_keys($wp_post_types) as $key) { + if ((!empty($wp_post_types[$key]->rest_controller_class) && is_string($wp_post_types[$key]->rest_controller_class)) && false !== strpos('WP_Rest_Cache_Plugin', $wp_post_types[$key]->rest_controller_class)) { + $wp_post_types[$key]->rest_controller_class = ('attachment' == $key) ? 'WP_REST_Attachments_Controller' : 'WP_REST_Posts_Controller'; + } + } + } +} + +// REST API Cache plugin compat +add_filter('wp_rest_cache/skip_caching', 'rvy_rest_cache_skip'); + +function rvy_rest_cache_skip($skip) { + if (!isset($_SERVER['REQUEST_URI'])) { + return; + } + + $uri = esc_url_raw($_SERVER['REQUEST_URI']); + $uncached_params = array_merge($uncached_params, ['rvy_ajax_field', 'rvy_ajax_value']); + + foreach($uncached_params as $param) { + if (strpos($uri, $param)) { + $skip = true; + break; + } + } + + return $skip; +} + +function pp_revisions_body_class() { + $classes = body_class(); + + if (function_exists('rvy_post_id') + && ('page' === get_option('show_on_front')) + && (rvy_post_id(get_the_ID()) == get_option('page_on_front'))) { + $classes []= 'home'; + } + + return $classes; +} \ No newline at end of file diff --git a/wp-content/plugins/revisionary/rvy_init.php b/wp-content/plugins/revisionary/rvy_init.php new file mode 100644 index 000000000..27f230013 --- /dev/null +++ b/wp-content/plugins/revisionary/rvy_init.php @@ -0,0 +1,156 @@ +ID)) { + $return_val = $post_id->ID; + } + } else { + $return_val = $post_id; + } + } + + return $return_val; + }, 10, 2 + ); +} + +if (defined('JREVIEWS_ROOT') && !empty($_REQUEST['preview']) +&& ((empty($_REQUEST['preview_id']) && empty($_REQUEST['thumbnail_id'])) +|| (!empty($_REQUEST['preview_id']) && rvy_in_revision_workflow((int) $_REQUEST['preview_id'])) +) +) { + require_once('compat_rvy.php'); + _rvy_jreviews_preview_compat(); +} + +// Default early beta testers to same revision status labeling they are already using. They will be directly notified of the new setting. +$last_ver = get_option('revisionary_last_version'); + +if (version_compare($last_ver, '3.0-alpha', '>=') && version_compare($last_ver, '3.0-beta7', '<')) { + if (!get_option('pp_revisions_beta3_option_sync_done')) { + update_option('rvy_revision_statuses_noun_labels', 1); + update_option('pp_revisions_beta3_option_sync_done', 1); + } +} + +// Revision Edit in Gutenberg: Enable non-Editors to set requested publish date +add_action('init', function() { + global $revisionary; + + foreach(array_keys($revisionary->enabled_post_types) as $post_type) { + add_filter("rest_prepare_{$post_type}", '_rvy_rest_prepare', 10, 3); + } +}, 100); + + +// Yoast SEO: Prevent invalid "indexable" maintenance operation on revision creation / submission +if (defined('WPSEO_VERSION')) { + add_filter( + 'wpseo_should_save_indexable', + function($intend_to_save, $indexable) { + if (function_exists('rvy_detect_post_id')) { + $post_id = rvy_detect_post_id(); + + if ($post_id && rvy_in_revision_workflow($post_id)) { + return false; + } + } + + if (is_object($indexable) && isset($indexable->object_id) && empty($indexable->object_id)) { + // WordPress database error Duplicate entry '0' for key 'PRIMARY' for query INSERT INTO `wp_yoast_indexable` + return false; + } + + return $intend_to_save; + }, + 10, 2); +} + +// Prevent any default filters from screwing with our paging settings +foreach(['revisions_per_page', 'revision_archive_per_page'] as $option_val) { + add_filter("set_screen_option_{$option_val}", function($screen_option, $option, $value ) {return $value;}, 99, 3); +} diff --git a/wp-content/plugins/revisionary/submittee_rvy.php b/wp-content/plugins/revisionary/submittee_rvy.php new file mode 100644 index 000000000..6f63614de --- /dev/null +++ b/wp-content/plugins/revisionary/submittee_rvy.php @@ -0,0 +1,103 @@ +update_page_options( $sitewide, $customize_defaults ); + + global $wpdb; + $wpdb->query( "UPDATE $wpdb->options SET autoload = 'no' WHERE (option_name LIKE 'rvy_%' OR option_name LIKE 'revisionary_%') AND option_name != 'rvy_next_rev_publish_gmt'" ); + } + + function default_options( $sitewide = false, $customize_defaults = false ) { + check_admin_referer( 'rvy-update-options' ); + + $default_prefix = ( $customize_defaults ) ? 'default_' : ''; + + if (!empty($_POST['all_options'])) { + $reviewed_options = array_map('sanitize_key', explode(',', sanitize_text_field($_POST['all_options']))); + foreach ( $reviewed_options as $option_name ) { + rvy_delete_option($default_prefix . $option_name, $sitewide ); + } + } + } + + function update_sitewide() { + check_admin_referer( 'rvy-update-options' ); + + $reviewed_options = isset($_POST['rvy_all_movable_options']) ? array_map('sanitize_key', explode(',', $_POST['rvy_all_movable_options'])) : array(); + + $options_sitewide = isset($_POST['rvy_options_sitewide']) ? array_map('sanitize_key', (array) $_POST['rvy_options_sitewide']) : array(); + + update_site_option( "rvy_options_sitewide_reviewed", $reviewed_options ); + update_site_option( "rvy_options_sitewide", $options_sitewide ); + } + + function default_sitewide() { + check_admin_referer( 'rvy-update-options' ); + + rvy_delete_option( 'options_sitewide', true ); + rvy_delete_option( 'options_sitewide_reviewed', true ); + } + + function update_page_options( $sitewide = false, $customize_defaults = false ) { + $default_prefix = ( $customize_defaults ) ? 'default_' : ''; + + if (!empty($_POST['all_options'])) { + $reviewed_options = array_map('sanitize_key', explode(',', sanitize_text_field($_POST['all_options']))); + + foreach ( $reviewed_options as $option_basename ) { + if (isset($_POST[$option_basename])) { + if (is_array($_POST[$option_basename])) { + $value = array_map('sanitize_key', $_POST[$option_basename]); + } else { + $value = sanitize_key($_POST[$option_basename]); + } + } else { + $value = ''; + } + + rvy_update_option( $default_prefix . $option_basename, $value, $sitewide ); + } + } + } +} diff --git a/wp-content/plugins/revisionary/utils.php b/wp-content/plugins/revisionary/utils.php new file mode 100644 index 000000000..f9a6d4458 --- /dev/null +++ b/wp-content/plugins/revisionary/utils.php @@ -0,0 +1,223 @@ +=') || substr($wp_version, 0, 2) === '5.'; + } + + /** + * Based on Edit Flow's \Block_Editor_Compatible::should_apply_compat method. + * + * @return bool + */ + public static function isBlockEditorActive($postType = false) { + global $wp_version; + + // Check if PP Custom Post Statuses lower than v2.4 is installed. It disables Gutenberg. + if ( defined('PPS_VERSION') && version_compare(PPS_VERSION, '2.4-beta', '<') ) { + return false; + } + + if (class_exists('Classic_Editor')) { + if (isset($_REQUEST['classic-editor__forget']) && (isset($_REQUEST['classic']) || isset($_REQUEST['classic-editor']))) { + return false; + } elseif (isset($_REQUEST['classic-editor__forget']) && !isset($_REQUEST['classic']) && !isset($_REQUEST['classic-editor'])) { + return true; + } elseif (get_option('classic-editor-allow-users') === 'allow') { + if ($post_id = rvy_detect_post_id()) { + $which = get_post_meta( $post_id, 'classic-editor-remember', true ); + + if ('block-editor' == $which) { + return true; + } elseif ('classic-editor' == $which) { + return false; + } + } + } + } + + $pluginsState = array( + 'classic-editor' => class_exists( 'Classic_Editor' ), + 'gutenberg' => function_exists( 'the_gutenberg_project' ), + 'gutenberg-ramp' => class_exists('Gutenberg_Ramp'), + ); + + if (!$postType) { + if ( ! $postType = rvy_detect_post_type() ) { + $postType = 'page'; + } + } + + if ( $post_type_obj = get_post_type_object( $postType ) ) { + if ( empty( $post_type_obj->show_in_rest ) ) { + return false; + } + } + + $conditions = array(); + + /** + * 5.0: + * + * Classic editor either disabled or enabled (either via an option or with GET argument). + * It's a hairy conditional :( + */ + + if (version_compare($wp_version, '5.9-beta', '>=')) { + remove_action('use_block_editor_for_post_type', '_disable_block_editor_for_navigation_post_type', 10, 2); + remove_filter('use_block_editor_for_post_type', '_disable_block_editor_for_navigation_post_type', 10, 2); + } + + // Divi: Classic Editor option + if (function_exists('et_get_option') && ( 'on' == et_get_option( 'et_enable_classic_editor', 'off' ))) { + return false; + } + + // phpcs:ignore WordPress.VIP.SuperGlobalInputUsage.AccessDetected, WordPress.Security.NonceVerification.NoNonceVerification + + $_post = get_post(rvy_detect_post_id()); + + if (!empty($_post)) { + $conditions[] = (self::isWp5() || $pluginsState['gutenberg']) + && ! $pluginsState['classic-editor'] + && ! $pluginsState['gutenberg-ramp'] + && apply_filters('use_block_editor_for_post_type', true, $postType) + && apply_filters('use_block_editor_for_post', true, $_post); + } + + $conditions[] = self::isWp5() + && $pluginsState['classic-editor'] + && (get_option('classic-editor-replace') === 'block' + && ! isset($_GET['classic-editor__forget'])); + + $conditions[] = self::isWp5() + && $pluginsState['classic-editor'] + && (get_option('classic-editor-replace') === 'classic' + && isset($_GET['classic-editor__forget'])); + + if (!empty($_post)) { + $conditions[] = $pluginsState['gutenberg-ramp'] + && apply_filters('use_block_editor_for_post', true, $_post); + } + + if (defined('PP_CAPABILITIES_RESTORE_NAV_TYPE_BLOCK_EDITOR_DISABLE') && version_compare($wp_version, '5.9-beta', '>=')) { + add_filter('use_block_editor_for_post_type', '_disable_block_editor_for_navigation_post_type', 10, 2 ); + } + + // Returns true if at least one condition is true. + return count( + array_filter($conditions, + function ($c) { + return (bool)$c; + } + ) + ) > 0; + } + + /** + * Adds slashes only to strings. + * + * @param mixed $value Value to slash only if string. + * + * @return string|mixed + */ + public static function addslashes_to_strings_only( $value ) { + return \is_string( $value ) ? \addslashes( $value ) : $value; + } + + /** + * Replaces faulty core wp_slash(). + * + * Until WP 5.5 wp_slash() recursively added slashes not just to strings in array/objects, leading to errors. + * + * @param mixed $value What to add slashes to. + * + * @return mixed + */ + public static function recursively_slash_strings( $value ) { + return self::map_deep( $value, [ self::class, 'addslashes_to_strings_only' ] ); + } + + public static function map_deep( $value, $callback ) { + if ( is_array( $value ) ) { + foreach ( $value as $index => $item ) { + $value[ $index ] = self::map_deep( $item, $callback ); + } + } elseif ( is_object( $value ) ) { + if ( get_class($value) === "__PHP_Incomplete_Class" ) { + return $value; + } + + $object_vars = get_object_vars( $value ); + foreach ( $object_vars as $property_name => $property_value ) { + $value->$property_name = self::map_deep( $property_value, $callback ); + } + } else { + $value = call_user_func( $callback, $value ); + } + + return $value; + } + + public static function get_post_autosave($post_id, $user_id) { + global $wpdb; + + $autosave = $wpdb->get_row( + $wpdb->prepare( + "SELECT * + FROM $wpdb->posts + WHERE post_parent = %d + AND post_type = 'revision' + AND post_status = 'inherit' + AND post_name LIKE '%" . intval($post_id) . "-autosave%' + AND post_author = %d + ORDER BY post_date DESC + LIMIT 1", + $post_id, + $user_id + ) + ); + + if ( ! $autosave ) { + return false; + } + + return get_post($autosave); + } +} + From 73de4b3fa4ce614b160e5cff23726478577eae30 Mon Sep 17 00:00:00 2001 From: Rick Peterman Date: Thu, 2 May 2024 15:21:09 -0500 Subject: [PATCH 2/3] feat(twpreviews): add filter to change revisionary preview links - update css to to hide revisionary's extra preview button --- wp-content/plugins/tw-episode-importer/api/api.php | 4 ++-- wp-content/plugins/tw-previews/preview/ui.php | 1 + wp-content/themes/the-world/functions.php | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/wp-content/plugins/tw-episode-importer/api/api.php b/wp-content/plugins/tw-episode-importer/api/api.php index d51acf57e..fa336de5e 100644 --- a/wp-content/plugins/tw-episode-importer/api/api.php +++ b/wp-content/plugins/tw-episode-importer/api/api.php @@ -768,7 +768,7 @@ function ( $p ) use ( $post_type ) { return $p['type'] === $post_type; } ) : null; - $post = is_array( $post ) && ! empty( $post ) ? $post[0] : null; + $post = is_array( $post ) && ! empty( $post ) ? array_shift( $post ) : null; $was_imported = is_array( $post ) && isset( $post['guid'] ) ? $post['guid'] === $guid : false; $audio_is_different = is_array( $audio ) && isset( $audio['url'] ) && $api_item->_links->enclosure->href !== $audio['url']; $has_updated_audio = is_array( $audio ) && @@ -931,7 +931,7 @@ function tw_episode_importer_get_existing_post_data( $post_type, $guid, $audio_k // Attempt to get imported audio by guid. if ( is_null( $audio_post ) ) { - $audio_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE guid=%s", "http://{$guid}" ) ); + $audio_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE guid IN (%s, %s)", array( "{$guid}", "http://{$guid}" ) ) ); $audio_post = get_post( $audio_id ); } diff --git a/wp-content/plugins/tw-previews/preview/ui.php b/wp-content/plugins/tw-previews/preview/ui.php index ddb42e025..1b93d4caa 100644 --- a/wp-content/plugins/tw-previews/preview/ui.php +++ b/wp-content/plugins/tw-previews/preview/ui.php @@ -85,6 +85,7 @@ function tw_previews_preview_post_link( $preview_link, $post ) { } } add_filter( 'preview_post_link', 'tw_previews_preview_post_link', 100000, 2 ); +add_filter( 'revisionary_preview_url', 'tw_previews_preview_post_link', 100000, 2 ); /** * Render HTML and enqueue scripts for admin page. diff --git a/wp-content/themes/the-world/functions.php b/wp-content/themes/the-world/functions.php index 462111d6f..27fe83e37 100644 --- a/wp-content/themes/the-world/functions.php +++ b/wp-content/themes/the-world/functions.php @@ -71,8 +71,9 @@ function tw_admin_styles() { // Hides device options from preview menu dropdown. They are basically useless and confusing. echo ''; } endif; From c411fc79073ad0425fd30ed9219a0899263c237d Mon Sep 17 00:00:00 2001 From: Rick Peterman Date: Thu, 2 May 2024 16:08:34 -0500 Subject: [PATCH 3/3] chore(theme): filter function doc description correction. --- wp-content/themes/the-world/functions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wp-content/themes/the-world/functions.php b/wp-content/themes/the-world/functions.php index 27fe83e37..321b9e72f 100644 --- a/wp-content/themes/the-world/functions.php +++ b/wp-content/themes/the-world/functions.php @@ -81,8 +81,7 @@ function tw_admin_styles() { if ( ! function_exists( 'tw_admin_init_editor_styles' ) ) { /** - * Set cookie to store auth token. SHould be an http cookies. - * Assume frontend will be served from the same domain. + * Add editor styles. * * @return void */