Changeset 3432780
- Timestamp:
- 01/05/2026 02:16:16 PM (3 months ago)
- Location:
- surflink
- Files:
-
- 302 added
- 6 edited
-
tags/2.3.5 (added)
-
tags/2.3.5/assets (added)
-
tags/2.3.5/assets/css (added)
-
tags/2.3.5/assets/css/surfl-loginhider.css (added)
-
tags/2.3.5/assets/css/surfl.css (added)
-
tags/2.3.5/assets/fast-forward.php (added)
-
tags/2.3.5/assets/icon_logo_sm_20.png (added)
-
tags/2.3.5/assets/import_410_sample.csv (added)
-
tags/2.3.5/assets/import_redirect_sample.csv (added)
-
tags/2.3.5/assets/js (added)
-
tags/2.3.5/assets/js/redirects.js (added)
-
tags/2.3.5/assets/js/setting-scripts.js (added)
-
tags/2.3.5/assets/js/surfl-loginhider.js (added)
-
tags/2.3.5/assets/js/surfl.js (added)
-
tags/2.3.5/assets/surflink_white.png (added)
-
tags/2.3.5/includes (added)
-
tags/2.3.5/includes/class-filesystem-helper.php (added)
-
tags/2.3.5/includes/class-log-cleaner.php (added)
-
tags/2.3.5/includes/class-surfl-404.php (added)
-
tags/2.3.5/includes/class-surfl-410.php (added)
-
tags/2.3.5/includes/class-surfl-backup-cleanup.php (added)
-
tags/2.3.5/includes/class-surfl-backup-helper.php (added)
-
tags/2.3.5/includes/class-surfl-backup-settings.php (added)
-
tags/2.3.5/includes/class-surfl-br-loader.php (added)
-
tags/2.3.5/includes/class-surfl-fast-sr.php (added)
-
tags/2.3.5/includes/class-surfl-loader.php (added)
-
tags/2.3.5/includes/class-surfl-loginhider.php (added)
-
tags/2.3.5/includes/class-surfl-module-manager.php (added)
-
tags/2.3.5/includes/class-surfl-plugin-activation.php (added)
-
tags/2.3.5/includes/class-surfl-redirect.php (added)
-
tags/2.3.5/includes/class-surfl-restore-db.php (added)
-
tags/2.3.5/includes/class-surfl-restore-files.php (added)
-
tags/2.3.5/includes/uninstall.php (added)
-
tags/2.3.5/index.php (added)
-
tags/2.3.5/readme.txt (added)
-
tags/2.3.5/surf-link.php (added)
-
tags/2.3.5/templates (added)
-
tags/2.3.5/templates/question-tooltip.php (added)
-
tags/2.3.5/templates/surfl-404.php (added)
-
tags/2.3.5/templates/surfl-410-list.php (added)
-
tags/2.3.5/templates/surfl-410.php (added)
-
tags/2.3.5/templates/surfl-autolink-options.php (added)
-
tags/2.3.5/templates/surfl-backup-modals.php (added)
-
tags/2.3.5/templates/surfl-backup-options.php (added)
-
tags/2.3.5/templates/surfl-backup-table.php (added)
-
tags/2.3.5/templates/surfl-backup-warnings.php (added)
-
tags/2.3.5/templates/surfl-backup.php (added)
-
tags/2.3.5/templates/surfl-footer.php (added)
-
tags/2.3.5/templates/surfl-hard-unlink-report.php (added)
-
tags/2.3.5/templates/surfl-hard-unlink.php (added)
-
tags/2.3.5/templates/surfl-hardlink-history.php (added)
-
tags/2.3.5/templates/surfl-hardlink-report.php (added)
-
tags/2.3.5/templates/surfl-hardlink.php (added)
-
tags/2.3.5/templates/surfl-loginhider-failed-attempts.php (added)
-
tags/2.3.5/templates/surfl-loginhider-setting.php (added)
-
tags/2.3.5/templates/surfl-post-title-replace.php (added)
-
tags/2.3.5/templates/surfl-primary-nav.php (added)
-
tags/2.3.5/templates/surfl-pro-ad.php (added)
-
tags/2.3.5/templates/surfl-redirect-html.php (added)
-
tags/2.3.5/templates/surfl-redirect-list-html.php (added)
-
tags/2.3.5/templates/surfl-redirection-rules.php (added)
-
tags/2.3.5/templates/surfl-restore-backup-html.php (added)
-
tags/2.3.5/templates/surfl-restore-status.php (added)
-
tags/2.3.5/templates/surfl-restore-upload-status.php (added)
-
tags/2.3.5/templates/surfl-rules-info-modal.php (added)
-
tags/2.3.5/templates/surfl-saved-autolinks.php (added)
-
tags/2.3.5/templates/surfl-shortlink-form-html.php (added)
-
tags/2.3.5/templates/surfl-shortlink-list-html.php (added)
-
tags/2.3.5/templates/surfl-shortlink-options.php (added)
-
tags/2.3.5/templates/surfl-softlink.php (added)
-
tags/2.3.5/templates/surfl-sr-html.php (added)
-
tags/2.3.5/templates/surfl-sr-report.php (added)
-
tags/2.3.5/templates/surfl-srh.php (added)
-
tags/2.3.5/templates/surfl-text-tooltip.php (added)
-
tags/2.3.5/templates/surfl-url-replace-html.php (added)
-
tags/2.3.5/vendor (added)
-
tags/2.3.5/vendor/freemius (added)
-
tags/2.3.5/vendor/freemius/LICENSE.txt (added)
-
tags/2.3.5/vendor/freemius/assets (added)
-
tags/2.3.5/vendor/freemius/assets/css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/account.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/add-ons.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/affiliation.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/checkout.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/clone-resolution.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/common.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/connect.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/debug.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/dialog-boxes.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/gdpr-optin-notice.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/index.php (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/optout.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/admin/plugins.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/customizer.css (added)
-
tags/2.3.5/vendor/freemius/assets/css/index.php (added)
-
tags/2.3.5/vendor/freemius/assets/img (added)
-
tags/2.3.5/vendor/freemius/assets/img/index.php (added)
-
tags/2.3.5/vendor/freemius/assets/img/plugin-icon.png (added)
-
tags/2.3.5/vendor/freemius/assets/img/slt-surflink.png (added)
-
tags/2.3.5/vendor/freemius/assets/img/surf-link.png (added)
-
tags/2.3.5/vendor/freemius/assets/img/surflink.png (added)
-
tags/2.3.5/vendor/freemius/assets/img/theme-icon.png (added)
-
tags/2.3.5/vendor/freemius/assets/index.php (added)
-
tags/2.3.5/vendor/freemius/assets/js (added)
-
tags/2.3.5/vendor/freemius/assets/js/index.php (added)
-
tags/2.3.5/vendor/freemius/assets/js/jquery.form.js (added)
-
tags/2.3.5/vendor/freemius/assets/js/nojquery.ba-postmessage.js (added)
-
tags/2.3.5/vendor/freemius/assets/js/postmessage.js (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/14fb1bd5b7c41648488b06147f50a0dc.svg (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/178afa6030e76635dbe835e111d2c507.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/27b5a722a5553d9de0170325267fccec.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/4375c4a3ddc6f637c2ab9a2d7220f91e.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/45da596e2b512ffc3bb638baaf0fdc4e.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/a34e046aee1702a5690679750a7f4d0f.svg (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/b09d0b38b627c2fa564d050f79f2f064.svg (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/c03f665db27af43971565560adfba594.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/cb5fc4f6ec7ada72e986f6e7dde365bf.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/d65812c447b4523b42d59018e1c0bb53.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/f3aac72a8e63997d6bb888f816457e9b.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/fde48e4609a6ddc11d639fc2421f2afd.png (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/freemius-pricing.js (added)
-
tags/2.3.5/vendor/freemius/assets/js/pricing/freemius-pricing.js.LICENSE.txt (added)
-
tags/2.3.5/vendor/freemius/config.php (added)
-
tags/2.3.5/vendor/freemius/includes (added)
-
tags/2.3.5/vendor/freemius/includes/class-freemius-abstract.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-freemius.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-admin-notices.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-api.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-garbage-collector.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-hook-snapshot.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-lock.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-logger.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-options.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-plugin-updater.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-security.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-storage.php (added)
-
tags/2.3.5/vendor/freemius/includes/class-fs-user-lock.php (added)
-
tags/2.3.5/vendor/freemius/includes/customizer (added)
-
tags/2.3.5/vendor/freemius/includes/customizer/class-fs-customizer-support-section.php (added)
-
tags/2.3.5/vendor/freemius/includes/customizer/class-fs-customizer-upsell-control.php (added)
-
tags/2.3.5/vendor/freemius/includes/customizer/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/debug (added)
-
tags/2.3.5/vendor/freemius/includes/debug/class-fs-debug-bar-panel.php (added)
-
tags/2.3.5/vendor/freemius/includes/debug/debug-bar-start.php (added)
-
tags/2.3.5/vendor/freemius/includes/debug/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-affiliate-terms.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-affiliate.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-billing.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-entity.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-payment.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-plugin-info.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-plugin-license.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-plugin-plan.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-plugin-tag.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-plugin.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-pricing.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-scope-entity.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-site.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-subscription.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/class-fs-user.php (added)
-
tags/2.3.5/vendor/freemius/includes/entities/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/fs-core-functions.php (added)
-
tags/2.3.5/vendor/freemius/includes/fs-essential-functions.php (added)
-
tags/2.3.5/vendor/freemius/includes/fs-html-escaping-functions.php (added)
-
tags/2.3.5/vendor/freemius/includes/fs-plugin-info-dialog.php (added)
-
tags/2.3.5/vendor/freemius/includes/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/l10n.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-admin-menu-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-admin-notice-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-cache-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-checkout-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-clone-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-contact-form-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-debug-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-gdpr-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-key-value-storage.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-license-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-option-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-permission-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-plan-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/class-fs-plugin-manager.php (added)
-
tags/2.3.5/vendor/freemius/includes/managers/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions/ArgumentNotExistException.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions/EmptyArgumentException.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions/Exception.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions/InvalidArgumentException.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions/OAuthException.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/Exceptions/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/FreemiusBase.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/FreemiusWordPress.php (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/LICENSE.txt (added)
-
tags/2.3.5/vendor/freemius/includes/sdk/index.php (added)
-
tags/2.3.5/vendor/freemius/includes/supplements (added)
-
tags/2.3.5/vendor/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php (added)
-
tags/2.3.5/vendor/freemius/includes/supplements/fs-essential-functions-2.2.1.php (added)
-
tags/2.3.5/vendor/freemius/includes/supplements/fs-migration-2.5.1.php (added)
-
tags/2.3.5/vendor/freemius/includes/supplements/index.php (added)
-
tags/2.3.5/vendor/freemius/index.php (added)
-
tags/2.3.5/vendor/freemius/languages (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-cs_CZ.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-da_DK.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-de_DE.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-es_ES.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-fr_FR.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-he_IL.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-hu_HU.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-it_IT.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-ja.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-nl_NL.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-ru_RU.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-ta.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius-zh_CN.mo (added)
-
tags/2.3.5/vendor/freemius/languages/freemius.pot (added)
-
tags/2.3.5/vendor/freemius/languages/index.php (added)
-
tags/2.3.5/vendor/freemius/require.php (added)
-
tags/2.3.5/vendor/freemius/start.php (added)
-
tags/2.3.5/vendor/freemius/templates (added)
-
tags/2.3.5/vendor/freemius/templates/account (added)
-
tags/2.3.5/vendor/freemius/templates/account.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/billing.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials/activate-license-button.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials/addon.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials/deactivate-license-button.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials/disconnect-button.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/partials/site.php (added)
-
tags/2.3.5/vendor/freemius/templates/account/payments.php (added)
-
tags/2.3.5/vendor/freemius/templates/add-ons.php (added)
-
tags/2.3.5/vendor/freemius/templates/add-trial-to-pricing.php (added)
-
tags/2.3.5/vendor/freemius/templates/admin-notice.php (added)
-
tags/2.3.5/vendor/freemius/templates/ajax-loader.php (added)
-
tags/2.3.5/vendor/freemius/templates/api-connectivity-message-js.php (added)
-
tags/2.3.5/vendor/freemius/templates/auto-installation.php (added)
-
tags/2.3.5/vendor/freemius/templates/checkout (added)
-
tags/2.3.5/vendor/freemius/templates/checkout.php (added)
-
tags/2.3.5/vendor/freemius/templates/checkout/frame.php (added)
-
tags/2.3.5/vendor/freemius/templates/checkout/process-redirect.php (added)
-
tags/2.3.5/vendor/freemius/templates/checkout/redirect.php (added)
-
tags/2.3.5/vendor/freemius/templates/clone-resolution-js.php (added)
-
tags/2.3.5/vendor/freemius/templates/connect (added)
-
tags/2.3.5/vendor/freemius/templates/connect.php (added)
-
tags/2.3.5/vendor/freemius/templates/connect/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/connect/permission.php (added)
-
tags/2.3.5/vendor/freemius/templates/connect/permissions-group.php (added)
-
tags/2.3.5/vendor/freemius/templates/contact.php (added)
-
tags/2.3.5/vendor/freemius/templates/debug (added)
-
tags/2.3.5/vendor/freemius/templates/debug.php (added)
-
tags/2.3.5/vendor/freemius/templates/debug/api-calls.php (added)
-
tags/2.3.5/vendor/freemius/templates/debug/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/debug/logger.php (added)
-
tags/2.3.5/vendor/freemius/templates/debug/plugins-themes-sync.php (added)
-
tags/2.3.5/vendor/freemius/templates/debug/scheduled-crons.php (added)
-
tags/2.3.5/vendor/freemius/templates/email.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms (added)
-
tags/2.3.5/vendor/freemius/templates/forms/affiliation.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/data-debug-mode.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/deactivation (added)
-
tags/2.3.5/vendor/freemius/templates/forms/deactivation/contact.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/deactivation/form.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/deactivation/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/deactivation/retry-skip.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/email-address-update.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/license-activation.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/optout.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/premium-versions-upgrade-handler.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/premium-versions-upgrade-metadata.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/resend-key.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/subscription-cancellation.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/trial-start.php (added)
-
tags/2.3.5/vendor/freemius/templates/forms/user-change.php (added)
-
tags/2.3.5/vendor/freemius/templates/gdpr-optin-js.php (added)
-
tags/2.3.5/vendor/freemius/templates/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/js (added)
-
tags/2.3.5/vendor/freemius/templates/js/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/js/jquery.content-change.php (added)
-
tags/2.3.5/vendor/freemius/templates/js/open-license-activation.php (added)
-
tags/2.3.5/vendor/freemius/templates/js/permissions.php (added)
-
tags/2.3.5/vendor/freemius/templates/js/style-premium-theme.php (added)
-
tags/2.3.5/vendor/freemius/templates/partials (added)
-
tags/2.3.5/vendor/freemius/templates/partials/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/partials/network-activation.php (added)
-
tags/2.3.5/vendor/freemius/templates/plugin-icon.php (added)
-
tags/2.3.5/vendor/freemius/templates/plugin-info (added)
-
tags/2.3.5/vendor/freemius/templates/plugin-info/description.php (added)
-
tags/2.3.5/vendor/freemius/templates/plugin-info/features.php (added)
-
tags/2.3.5/vendor/freemius/templates/plugin-info/index.php (added)
-
tags/2.3.5/vendor/freemius/templates/plugin-info/screenshots.php (added)
-
tags/2.3.5/vendor/freemius/templates/pricing.php (added)
-
tags/2.3.5/vendor/freemius/templates/secure-https-header.php (added)
-
tags/2.3.5/vendor/freemius/templates/sticky-admin-notice-js.php (added)
-
tags/2.3.5/vendor/freemius/templates/tabs-capture-js.php (added)
-
tags/2.3.5/vendor/freemius/templates/tabs.php (added)
-
trunk/assets/js/redirects.js (modified) (3 diffs)
-
trunk/assets/js/surfl.js (modified) (3 diffs)
-
trunk/includes/class-surfl-fast-sr.php (modified) (4 diffs)
-
trunk/includes/class-surfl-loader.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (4 diffs)
-
trunk/surf-link.php (modified) (3 diffs)
-
trunk/templates/surfl-post-title-replace.php (added)
Legend:
- Unmodified
- Added
- Removed
-
surflink/trunk/assets/js/redirects.js
r3430214 r3432780 781 781 }); 782 782 783 784 $(document).on("click", "#surfl-toggle-srpt-btn", function () { 785 slideContent($(this), $("#surfl-srpt-advanced-options")); 786 }); 787 783 788 //hard-linker toggle 784 789 … … 789 794 790 795 //soft-linker toggle 791 792 796 $(document).on("click", "#surfl-toggle-soft-linker-btn", function () { 793 797 slideContent($(this), $("#surfl-soft-linker-advanced-options-one")); … … 802 806 // Search and Replace 803 807 $(document).on("click", "#surfl-goto-search-history", function () { 804 const tab = document.querySelectorAll(".surfl-side-nav")[ 2];808 const tab = document.querySelectorAll(".surfl-side-nav")[3]; 805 809 if (tab) { 806 810 tab.dispatchEvent( -
surflink/trunk/assets/js/surfl.js
r3430612 r3432780 334 334 * 335 335 * 336 ********* SR/SRURL 336 ********* SR/SRURL/SRPT 337 337 * 338 338 * … … 360 360 $(document).on("change", "#surfl-srurl-dry-run", function () { 361 361 handleCheck($(this), $("#surfl-srurl-status-text")); 362 }); 363 364 //SRPT 365 $(document).on("change", "#surfl-srpt-dry-run", function () { 366 handleCheck($(this), $("#surfl-srpt-status-text")); 362 367 }); 363 368 … … 502 507 503 508 509 510 // Handle URL Replace form submission via AJAX 511 $(document).on("submit", "#surfl-srpt-replace-form", function (e) { 512 e.preventDefault(); 513 const form = $(this); 514 const submitButton = form.find("#submit-srpt-replace-form"); 515 const originalButtonText = submitButton.html(); 516 processBatch( 517 form, 518 submitButton, 519 originalButtonText, 520 "surfl_process_post_title_replace", 521 "#surfl-srpt-replace-report-container-ajax" 522 ); 523 }); 504 524 }); 505 525 -
surflink/trunk/includes/class-surfl-fast-sr.php
r3431922 r3432780 35 35 add_action( 'wp_ajax_surfl_delete_srh', [$this, 'ajax_delete_srh'] ); 36 36 add_action( 'wp_ajax_surfl_process_replace', [$this, 'ajax_process_replace'] ); 37 add_action( 'wp_ajax_surfl_process_post_title_replace', [$this, 'ajax_process_post_title_replace'] ); 37 38 } 38 39 … … 187 188 return $value; 188 189 } 190 } 191 // MULTILINGUAL & UTF-8 COMPATIBILITY 192 if ( $this->case_insensitive ) { 193 // Quote the search string so regex characters (like ., *, +) are treated as text 194 $quoted_search = preg_quote( $search, '/' ); 195 // 'u' modifier = UTF-8, 'i' modifier = Case Insensitive 196 $data = preg_replace( '/' . $quoted_search . '/iu', $replace, $value_str ); 197 } else { 198 // Standard str_replace is usually fine for Case-Sensitive UTF-8 199 $data = str_replace( $search, $replace, $value_str ); 200 } 201 if ( $data !== $value ) { 202 $this->collect_contents( $value, $data ); 203 } 204 // Collect contents if modified 205 return $data; 206 } 207 208 private function replace_noserialized_value( $value, $search, $replace ) { 209 // Ensure inputs are strings 210 $value_str = (string) $value; 211 // Use mb_stripos for UTF-8 aware position check 212 if ( $this->case_insensitive ) { 213 $found = mb_stripos( $value_str, $search ); 214 } else { 215 $found = mb_strpos( $value_str, $search ); 216 } 217 if ( $found === false ) { 218 return $value; 189 219 } 190 220 // MULTILINGUAL & UTF-8 COMPATIBILITY … … 613 643 $is_numeric 614 644 ) { 645 } 646 647 private function process_pt_batch( 648 $table, 649 $primary_key, 650 $column, 651 $category, 652 $rows, 653 $search, 654 $replace, 655 $dry_run 656 ) { 657 $case_statements = []; 658 $ids = []; 659 foreach ( $rows as $row ) { 660 $original = $row[$column]; 661 $modified = $this->replace_noserialized_value( $original, $search, $replace ); 662 if ( $original !== $modified ) { 663 $occ = $this->count_occurrences( $search, $original ); 664 if ( !isset( $this->report_details[$category]['columns'][$column]['occurrences'] ) ) { 665 $this->report_details[$category]['columns'][$column]['occurrences'] = 0; 666 } 667 if ( !isset( $this->report_details[$category]['columns'][$column]['rows_modified'] ) ) { 668 $this->report_details[$category]['columns'][$column]['rows_modified'] = 0; 669 } 670 $this->report_details[$category]['columns'][$column]['occurrences'] += $occ; 671 $this->report_details[$category]['columns'][$column]['rows_modified']++; 672 if ( !$dry_run ) { 673 $case_statements[] = $this->wpdb->prepare( "WHEN %d THEN %s", $row[$primary_key], $modified ); 674 } 675 $ids[] = (int) $row[$primary_key]; 676 } 677 } 678 if ( !empty( $case_statements ) ) { 679 if ( !$dry_run ) { 680 $this->wpdb->query( 'START TRANSACTION' ); 681 $sql = "UPDATE {$table} SET {$column} = CASE {$primary_key} \r\n " . implode( ' ', $case_statements ) . " \r\n END WHERE {$primary_key} IN (" . implode( ',', array_unique( $ids ) ) . ")"; 682 $result = $this->wpdb->query( $sql ); 683 if ( $result === false ) { 684 $this->wpdb->query( 'ROLLBACK' ); 685 throw new Exception("Update failed for column {$column} in table {$table}: " . $this->wpdb->last_error); 686 } 687 $this->wpdb->query( 'COMMIT' ); 688 } 689 $this->reports[$category] = ($this->reports[$category] ?? 0) + count( $ids ); 690 } 615 691 } 616 692 … … 862 938 } 863 939 940 public function render_title_replace_ui() { 941 if ( !current_user_can( 'manage_options' ) ) { 942 wp_die( 'Access denied' ); 943 } 944 require_once SURFL_PATH . "templates/surfl-post-title-replace.php"; 945 } 946 864 947 public function ajax_process_url_replace() { 948 } 949 950 private function generate_post_type_for_title( $categories ) { 951 global $wpdb; 952 $tasks = []; 953 // Check if categories are provided 954 if ( empty( $categories ) ) { 955 return []; 956 } 957 // $categories now contains post type slugs (e.g., 'post', 'page', 'product') 958 foreach ( $categories as $post_type ) { 959 // Validate if the post type exists to be safe 960 if ( !post_type_exists( $post_type ) ) { 961 continue; 962 } 963 // Create the specific WHERE clause for this post type 964 // We ignore: Trash, Auto Drafts, Inherit (revisions) 965 $where_clause = $wpdb->prepare( "post_type = %s AND post_status NOT IN ('inherit', 'trash', 'auto-draft')", $post_type ); 966 // Get Post Type Object for a nice Label 967 $pt_object = get_post_type_object( $post_type ); 968 $label = ( $pt_object ? $pt_object->labels->name : ucfirst( $post_type ) ); 969 $tasks[] = [ 970 'table' => $wpdb->posts, 971 'column' => 'post_title', 972 'where' => $where_clause, 973 'category' => $label, 974 ]; 975 } 976 return $tasks; 977 } 978 979 public function ajax_process_post_title_replace() { 980 check_ajax_referer( 'hyperdb_replace', 'nonce' ); 981 if ( !current_user_can( 'manage_options' ) ) { 982 wp_send_json_error( [ 983 'message' => esc_html__( 'Access denied', 'surflink' ), 984 ] ); 985 } 986 $search = trim( wp_unslash( $_POST['search'] ) ); 987 $replace = trim( wp_unslash( $_POST['replace'] ) ); 988 $categories = ( isset( $_POST['categories'] ) ? array_map( 'sanitize_text_field', $_POST['categories'] ) : [] ); 989 if ( empty( $search ) || empty( $replace ) || empty( $categories ) ) { 990 wp_send_json_error( [ 991 'message' => 'Missing Input', 992 ] ); 993 } 994 self::log( 'search: ' . $search ); 995 self::log( 'replace: ' . $replace ); 996 if ( $search === $replace ) { 997 wp_send_json_error( [ 998 'message' => 'Search and Replace input are same', 999 ] ); 1000 } 1001 $dry_run = isset( $_POST['dry_run'] ) && $_POST['dry_run'] == '1'; 1002 $case_insensitive = isset( $_POST['case_insensitive'] ) && $_POST['case_insensitive'] == '1'; 1003 $offset = ( isset( $_POST['offset'] ) ? intval( $_POST['offset'] ) : 0 ); 1004 $current_task_index = ( isset( $_POST['current_table_index'] ) ? intval( $_POST['current_table_index'] ) : 0 ); 1005 $transient_key = 'surfl_replace_title_batch_state'; 1006 $state = get_transient( $transient_key ); 1007 if ( $offset === 0 && $current_task_index === 0 || $state === false ) { 1008 // Initial call or state expired/not found 1009 $tasks = $this->generate_post_type_for_title( $categories ); 1010 $state = [ 1011 'total_rows' => 0, 1012 'processed_rows' => 0, 1013 'current_task_index' => 0, 1014 'current_task_offset' => 0, 1015 'tasks_to_process' => $tasks, 1016 'reports' => [], 1017 'report_details' => [], 1018 'modified_table' => [], 1019 'start_time' => microtime( true ), 1020 'history_id' => false, 1021 ]; 1022 // Calculate total rows for all tasks 1023 foreach ( $tasks as $task ) { 1024 $table = $task['table']; 1025 $where = $task['where']; 1026 $query = "SELECT COUNT(*) FROM {$table}"; 1027 if ( !empty( $where ) ) { 1028 $query .= " WHERE {$where}"; 1029 } 1030 $state['total_rows'] += (int) $this->wpdb->get_var( $query ); 1031 } 1032 $history_id = $this->insert_into_history_table( 1033 $search, 1034 $replace, 1035 $dry_run, 1036 $case_insensitive, 1037 'srurl' 1038 ); 1039 $state['history_id'] = ( $history_id ? intval( $history_id ) : false ); 1040 } else { 1041 // Load existing report details and modified tables from state 1042 $state['current_task_index'] = $current_task_index; 1043 $this->report_details = $state['report_details']; 1044 $this->modified_table = $state['modified_table']; 1045 // in this case modified category 1046 } 1047 $is_complete = false; 1048 $message = ''; 1049 $reports = $state['reports']; 1050 $location = ''; 1051 // Process tasks in batches 1052 if ( $state['current_task_index'] < count( $state['tasks_to_process'] ) ) { 1053 $current_task = $state['tasks_to_process'][$state['current_task_index']]; 1054 $table = $current_task['table']; 1055 $column = $current_task['column']; 1056 $where = $current_task['where']; 1057 $category = $current_task['category']; 1058 $location = $category; 1059 $rows = []; 1060 $primary_key = 'ID'; 1061 $query = "SELECT {$primary_key}, {$column} FROM {$table}"; 1062 if ( !empty( $where ) ) { 1063 $query .= " WHERE {$where}"; 1064 } 1065 $query .= " LIMIT {$state['current_task_offset']}, {$this->batch_size}"; 1066 $rows = $this->wpdb->get_results( $query, ARRAY_A ); 1067 if ( !empty( $rows ) ) { 1068 $this->case_insensitive = $case_insensitive; 1069 $table_start = microtime( true ); 1070 $this->process_pt_batch( 1071 $table, 1072 $primary_key, 1073 $column, 1074 $category, 1075 $rows, 1076 $search, 1077 $replace, 1078 $dry_run 1079 ); 1080 // Accumulate report details and modified tables 1081 if ( !isset( $this->report_details[$category] ) ) { 1082 $this->report_details[$category] = [ 1083 'columns' => [], 1084 'time' => 0, 1085 'table' => $table, 1086 ]; 1087 } 1088 if ( !isset( $this->report_details[$category]['columns'][$column] ) ) { 1089 $this->report_details[$category]['columns'][$column] = [ 1090 'occurrences' => 0, 1091 'rows_modified' => 0, 1092 ]; 1093 } 1094 if ( !isset( $this->report_details[$category]['time'] ) ) { 1095 $this->report_details[$category]['time'] = 0; 1096 } 1097 $this->report_details[$category]['time'] += microtime( true ) - $table_start; 1098 self::log( "URL Replace - {$category} processing time: " . (microtime( true ) - $table_start) . " seconds." ); 1099 if ( !in_array( $category, $this->modified_table ) && ($this->report_details[$category]['columns'][$column]['occurrences'] > 0 || $this->report_details[$category]['columns'][$column]['rows_modified'] > 0) ) { 1100 $this->modified_table[] = $category; 1101 } 1102 $reports[$category] = ($reports[$category] ?? 0) + count( $rows ); 1103 // Count rows processed in this batch 1104 $state['processed_rows'] += count( $rows ); 1105 $state['current_task_offset'] += $this->batch_size; 1106 $message = sprintf( 1107 esc_html__( 'Processing URL replace for %s category,table %s, column %s.', 'surflink' ), 1108 $category, 1109 $table, 1110 $column 1111 ); 1112 // Simplified message 1113 self::log( "ajax_process_post_title_replace - Processing task: {$category}, Column {$column}. Offset: {$state['current_task_offset']}. Processed rows: {$state['processed_rows']}. Total rows: {$state['total_rows']}." ); 1114 } else { 1115 // Current task finished, move to next 1116 $message = sprintf( 1117 esc_html__( 'Finished URL replace for %s category,table %s, column %s.', 'surflink' ), 1118 $category, 1119 $table, 1120 $column 1121 ); 1122 self::log( "ajax_process_post_title_replace - Finished task for {$category} category, Column {$column}. Moving to next task." ); 1123 $state['current_task_index']++; 1124 if ( $state['current_task_index'] >= count( $state['tasks_to_process'] ) ) { 1125 $is_complete = true; 1126 } 1127 $state['current_task_offset'] = 0; 1128 // Reset offset for next task 1129 } 1130 } else { 1131 $is_complete = true; 1132 self::log( "ajax_process_post_title_replace - All tasks processed. Operation complete." ); 1133 } 1134 $state['reports'] = $reports; 1135 $state['report_details'] = $this->report_details; 1136 // Save accumulated report details 1137 $state['modified_table'] = $this->modified_table; 1138 // Save accumulated modified tables 1139 set_transient( $transient_key, $state, HOUR_IN_SECONDS ); 1140 $this->update_history_table( $state, $location, $is_complete ); 1141 if ( $is_complete ) { 1142 $elapsed_time = round( microtime( true ) - $state['start_time'], 4 ); 1143 if ( empty( $reports['errors'] ) ) { 1144 $msg = ( $dry_run ? "Dry run completed in {$elapsed_time} seconds. No changes were made." : "Operation completed in {$elapsed_time} seconds." ); 1145 $reports['success'][] = $msg; 1146 } 1147 $reports['dry_run'] = $dry_run; 1148 $this->reports = $reports; 1149 $this->reports['details'] = $this->report_details; 1150 // Ensure final reports include accumulated details 1151 ob_start(); 1152 require SURFL_PATH . "templates/surfl-sr-report.php"; 1153 $report_html = ob_get_clean(); 1154 ob_start(); 1155 $this->render_search_history(); 1156 $history_html = ob_get_clean(); 1157 delete_transient( $transient_key ); 1158 // Clean up transient 1159 wp_send_json_success( [ 1160 'is_complete' => true, 1161 'report_html' => $report_html, 1162 'history_html' => $history_html, 1163 'reports_data' => $this->reports, 1164 'message' => $msg, 1165 'current_table_index' => $state['current_task_index'], 1166 ] ); 1167 } else { 1168 wp_send_json_success( [ 1169 'is_complete' => false, 1170 'offset' => $state['current_task_offset'], 1171 'total_rows' => $state['total_rows'], 1172 'processed_rows' => $state['processed_rows'], 1173 'message' => $message, 1174 'current_table' => $current_task['category'] ?? '', 1175 'current_table_index' => $state['current_task_index'], 1176 ] ); 1177 } 865 1178 } 866 1179 -
surflink/trunk/includes/class-surfl-loader.php
r3430214 r3432780 268 268 ); 269 269 $this->render_nav_item( 270 $page_slug, 271 'surfl-srpt-tab', 272 'dashicons-edit-page', 273 'Title Updater', 274 $active_tab 275 ); 276 $this->render_nav_item( 270 277 'surfl-search-replace', 271 278 'surfl-srh-tab', … … 285 292 set_transient( $tab_transient, $active_tab, 5 * MINUTE_IN_SECONDS ); 286 293 $this->surfl_fast_sr->render_url_replace_ui(); 294 } elseif ( $active_tab === 'surfl-srpt-tab' ) { 295 set_transient( $tab_transient, $active_tab, 5 * MINUTE_IN_SECONDS ); 296 $this->surfl_fast_sr->render_title_replace_ui(); 287 297 } elseif ( $active_tab === 'surfl-srh-tab' ) { 288 298 set_transient( $tab_transient, $active_tab, 5 * MINUTE_IN_SECONDS ); -
surflink/trunk/readme.txt
r3431922 r3432780 6 6 **Requires PHP:** 7.4 7 7 **Tested up to:** 6.9 8 **Stable tag:** 2.3. 48 **Stable tag:** 2.3.5 9 9 **License:** GPLv3 or later 10 10 **License URI:** https://opensource.org/licenses/GPL-3.0 … … 70 70 #### Free Version Includes: 71 71 * **Search & Replace:** Standard DB search/replace, Dry Run, History Logs, "View Changes" diff. 72 * **Easy Title Updater:** Update post titles with a single click in post, page and custom post types. Dry Run, History Logs, "View Changes" diff. 72 73 * **Redirects:** Add specific (single/bulk) redirects, 404 Logs, Specific 410 (Gone) status, Import/Export. 73 74 * **Backup:** Manual Backup creation, Saved Backup logs, Manual Restore, Selective Restore. … … 141 142 == Changelog == 142 143 144 = 2.3.5 = 145 * New Feature: Title Updater ! Now you can easily update post titles in pages, posts and custom post types. Dry run is also supported for safe testing.Also includes History Logs. 146 143 147 = 2.3.4 = 144 148 * Improved: search and replace now support handling nested serialized data. … … 235 239 == Upgrade Notice == 236 240 237 Updated to version **2.0.0**, SurfLink is now structured into five powerful modules managed via a central Module Manager, keeping your admin interface clean and your site fast.241 New Feature: Title Updater ! Now you can easily update post titles in pages, posts and custom post types. Dry run is also supported for safe testing.Also includes History Logs. -
surflink/trunk/surf-link.php
r3431922 r3432780 7 7 * Author: SurfLab 8 8 * Author URI: https://surflabtech.com 9 * Version: 2.3. 49 * Version: 2.3.5 10 10 * Text Domain: surflink 11 11 * License: GPL-3.0-or-later … … 67 67 } 68 68 if ( !defined( 'SURFL_VERSION' ) ) { 69 define( 'SURFL_VERSION', '2.3. 4' );69 define( 'SURFL_VERSION', '2.3.5' ); 70 70 } 71 71 if ( !defined( 'SURFL_PLUGIN' ) ) { … … 99 99 } 100 100 if ( !defined( 'SURFL_VERSION' ) ) { 101 define( 'SURFL_VERSION', '2.3. 4' );101 define( 'SURFL_VERSION', '2.3.5' ); 102 102 } 103 103 if ( !defined( 'SURFL_SITE_URL' ) ) {
Note: See TracChangeset
for help on using the changeset viewer.