{"id":354385,"date":"2026-08-13T15:43:18","date_gmt":"2026-08-13T15:43:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flex-redirects\/"},"modified":"2026-08-13T15:42:47","modified_gmt":"2026-08-13T15:42:47","slug":"flex-redirects","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/flex-redirects\/","author":23082855,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.0","stable_tag":"1.3.0","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Flex Redirects","header_author":"FLEX","header_description":"Manage 301\/302\/307 redirects, log hits with referrer\/user info, and track 404s.","assets_banners_color":"fdfdfe","last_updated":"2026-08-13 15:42:47","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/flexible.am\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.0":{"tag":"1.3.0","author":"flexfields","date":"2026-08-13 15:42:47"}},"upgrade_notice":{"1.3.0":"<p>Ready for WordPress.org: safer redirect targets, CSV limits, and a complete readme. Existing rules are unchanged.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3645740,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3645740,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3645740,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3645740,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3645740,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3645740,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"All Redirects \u2014 add a rule and manage the list","2":"Hits Log \u2014 each redirect with user, referrer, and IP","3":"404 Log \u2014 missing paths you can turn into redirects","4":"Tools \u2014 CSV import\/export and path tester","5":"Settings \u2014 query string, 404 log, and hit logging"}},"plugin_section":[],"plugin_tags":[932,905,727,186,539],"plugin_category":[55],"plugin_contributors":[240619],"plugin_business_model":[],"class_list":["post-354385","plugin","type-plugin","status-publish","hentry","plugin_tags-932","plugin_tags-905","plugin_tags-redirect","plugin_tags-seo","plugin_tags-urls","plugin_category-seo-and-marketing","plugin_contributors-flexfields","plugin_committers-flexfields"],"banners":{"banner":"https:\/\/ps.w.org\/flex-redirects\/assets\/banner-772x250.png?rev=3645740","banner_2x":"https:\/\/ps.w.org\/flex-redirects\/assets\/banner-1544x500.png?rev=3645740","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/flex-redirects\/assets\/icon-128x128.png?rev=3645740","icon_2x":"https:\/\/ps.w.org\/flex-redirects\/assets\/icon-256x256.png?rev=3645740","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Flex Redirects<\/strong> sends visitors from an old path to a new URL before the theme loads. Use it after migrations, slug changes, or when you retire pages.<\/p>\n\n<ul>\n<li>Exact, prefix, and regex matching<\/li>\n<li>Regex targets can reuse capture groups with <code>$1<\/code> or <code>${1}<\/code><\/li>\n<li>301, 302, and 307 status codes<\/li>\n<li>Optional query-string matching and passthrough<\/li>\n<li>Hit counters per redirect<\/li>\n<li>Hits Log with referrer, IP, user agent, and logged-in user (latest 5000)<\/li>\n<li>Optional 404 logging (latest 1000 HTML\/permalink paths)<\/li>\n<li>CSV import (upsert) and export<\/li>\n<li>Dry-run tester for a path or URL<\/li>\n<li>Sortable columns and pagination on every list<\/li>\n<li>Clean uninstall removes tables and options<\/li>\n<\/ul>\n\n<p>No remote calls. Rules and logs stay in your WordPress database. CSS and JavaScript are loaded from this plugin only.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Flex Redirects stores redirect rules and optional 404 paths in your WordPress database.<\/p>\n\n<p>When <strong>Log redirect hits<\/strong> is enabled (on by default), it also stores per-hit visitor data: IP address, HTTP referrer, user agent, and WordPress user ID if the visitor is logged in. Only administrators can view this log. Disable the setting if you do not need visitor-level history; aggregate Hits counters still update.<\/p>\n\n<p>The plugin does not send data to external servers and does not load third-party scripts.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>flex-redirects<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the zip via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate <strong>Flex Redirects<\/strong>.<\/li>\n<li>Go to <strong>Flex Redirects \u2192 All Redirects<\/strong> and add your first rule.<\/li>\n<li>Confirm with <strong>Tools \u2192 Test a path<\/strong>, or visit the old URL in a private window.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20an%20seo%20plugin%3F\"><h3>Does this replace an SEO plugin?<\/h3><\/dt>\n<dd><p>No. Use Flex Redirects for URL redirects. Pair it with Flex SEO (or another SEO plugin) for titles, meta tags, and sitemaps.<\/p><\/dd>\n<dt id=\"how%20do%20regex%20replacements%20work%3F\"><h3>How do regex replacements work?<\/h3><\/dt>\n<dd><p>Use match type Regex with a pattern such as <code>^\/blog\/(.*)$<\/code> and a target like <code>\/news\/$1<\/code>. Enter the pattern without <code>#<\/code> delimiters. Invalid patterns are rejected when you save.<\/p><\/dd>\n<dt id=\"can%20i%20redirect%20to%20another%20domain%3F\"><h3>Can I redirect to another domain?<\/h3><\/dt>\n<dd><p>Yes. Put a full <code>https:\/\/<\/code> URL in Target. Only <code>http<\/code> and <code>https<\/code> destinations are allowed.<\/p><\/dd>\n<dt id=\"what%20is%20stored%20in%20the%20hits%20log%3F\"><h3>What is stored in the Hits Log?<\/h3><\/dt>\n<dd><p>Time, source, target, status code, logged-in user (or Guest), referrer, IP, and user agent. The log keeps about the latest 5000 rows. Turn it off under Settings if you do not need that history.<\/p><\/dd>\n<dt id=\"will%20this%20conflict%20with%20another%20redirect%20plugin%3F\"><h3>Will this conflict with another redirect plugin?<\/h3><\/dt>\n<dd><p>Possibly. If two plugins try to redirect the same path, the one that runs first wins. Disable overlapping rules, or use <strong>Tools \u2192 Test a path<\/strong> to see what Flex Redirects would do.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%3F\"><h3>What happens when I uninstall?<\/h3><\/dt>\n<dd><p>Deleting the plugin drops the redirect tables, hits log, 404 log, and settings. Deactivating alone keeps your data.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>WordPress.org submission hygiene: http(s)-only destinations, no inline JavaScript, CSV size\/row limits.<\/li>\n<li>About page links only to Flex plugins already listed on WordPress.org.<\/li>\n<li>Sync Stable tag with plugin version; expand readme privacy and FAQ.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Align sort arrows with column headers.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Sortable columns and always-visible pagination (20\/50\/100 per page) on All Redirects, Hits Log, and 404 Log.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Add Hits Log: each redirect with user, referrer, IP, and user agent.<\/li>\n<li>Setting to enable\/disable hit logging (keeps latest 5000 rows).<\/li>\n<li>Link rule hit counts on All Redirects into the filtered Hits Log.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Exact rules with a query string match on the path when \u201cIgnore query string\u201d is on.<\/li>\n<li>Prefix rules append the unmatched suffix (folder move) and reject source \/.<\/li>\n<li>Redirect GET\/HEAD only; skip login, feeds, and the Flex SEO sitemap.<\/li>\n<li>Insert query strings before URL fragments; validate regex on save; upsert 404 hits.<\/li>\n<li>Expand the Usage page with match types, query strings, 404 log, CSV, and tester details.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fix regex sources, prefix path boundaries, subdirectory installs, and query-string matching.<\/li>\n<li>Skip self-redirects and in-request loops; continue to the next rule.<\/li>\n<li>CSV import upserts by source and match type; schema upgrades on plugin update.<\/li>\n<li>Add regex <code>$1<\/code> targets, query passthrough, 404 static-file filter, pagination, and a dry-run tester.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Refreshed admin UI with a cleaner, card-based layout (local CSS only).<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix admin layout overlap on the redirects screen.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Manage 301\/302\/307 redirects, log hits with referrer and user info, and turn 404s into permanent moves.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/354385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=354385"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/flexfields"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=354385"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=354385"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=354385"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=354385"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=354385"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=354385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}