
Monitor retired URLs, audit redirect health, and automatically exclude redirected content from XML sitemaps.
A professional SEO and content retirement manager that helps WordPress users monitor redirected pages, blog posts and custom post types, automatically exclude redirected content from XML sitemaps, audit redirect health and maintain a clean index. It does not create redirects - it integrates with your existing redirect and SEO plugins.
This plugin does not create redirects. It integrates with redirect plugins (Redirection, Rank Math, Yoast Premium, and others) and SEO plugins (Yoast SEO, Rank Math, SEOPress, AIOSEO).
Need help on your WordPress site or broader SEO? See our custom software and web design services, SEO services, or browse developer resources, Insights, and Research.
No tracking, telemetry, or external API calls. All scans and imports run on your server.
Install Redirect Content Manager from WordPress.org.
Install Redirect Content Manager from the WordPress.org plugin directory.
That is the only supported public install channel. There is no public GitHub/GitLab download for end users yet.
1. In WordPress go to Plugins → Add New 2. Search for Redirect Content Manager 3. Click Install Now, then Activate 4. Open Redirect Manager in the admin menu
Or open the listing directly: wordpress.org/plugins/redirect-content-manager
1. Configure settings - Redirect Manager → Settings: monitored post types, redirect provider, SEO plugin 2. Import / Sync - pull rules from your redirect plugin, or import CSV / Ahrefs exports 3. Run a scan - Dashboard → Scan Everything 4. Review health issues - Health Issues page
Supports WordPress Multisite. Activate network-wide or per-site. Each site keeps its own monitored items and settings.
Before uninstalling, choose whether to keep data:
If unchecked, plugin tables and options are removed on uninstall.
| Issue | Solution |
|---|---|
| No redirects detected | Ensure a supported redirect plugin is active; check Settings → Redirect Provider |
| Sitemap exclusion not working | Verify SEO plugin is detected; check Settings → SEO Plugin |
| XLSX import fails | Enable the PHP ZipArchive extension |
| Slow scans on large sites | Increase batch size in Settings → Performance |
Architecture, namespaces, and contribution notes for Redirect Content Manager.
All classes use the RedirectContentManager\ PSR-4 namespace, autoloaded from the classes/ directory.
Access the container via:
$container = rcm()->container();
$scan_service = $container->get( \RedirectContentManager\Services\ScanService::class );Implement RedirectProviderInterface:
use RedirectContentManager\Interfaces\RedirectProviderInterface;
use RedirectContentManager\Models\RedirectResult;class MyRedirectProvider implements RedirectProviderInterface { public function get_slug(): string { return 'my-provider'; } public function get_name(): string { return 'My Provider'; } public function is_available(): bool { return true; } public function detect( string $url ): RedirectResult { /* ... */ } public function get_all_redirects(): array { /* ... */ } } ```
Register via filter:
add_filter( 'rcm_redirect_providers', function ( array $providers ) {
$providers['my-provider'] = new MyRedirectProvider();
return $providers;
} );Implement SeoAdapterInterface and register with rcm_seo_adapters filter.
add_filter( 'rcm_health_checks', function ( array $checks ) {
$checks['my_check'] = function () {
return array( /* HealthIssue objects */ );
};
return $checks;
} );add_filter( 'rcm_modules', function ( array $modules ) {
$modules['gsc'] = new MyGscModule();
return $modules;
} );Modules should implement a boot() method.
| Table | Purpose |
|---|---|
{prefix}rcm_monitored_items | Monitored URLs and scan data |
{prefix}rcm_scan_logs | Scan history |
{prefix}rcm_health_issues | SEO health issues |
{prefix}rcm_activity_logs | Activity audit trail |
All endpoints require the manage_options capability. Use WordPress REST nonce:
fetch('/wp-json/redirect-content-manager/v1/statistics', {
headers: { 'X-WP-Nonce': wpApiSettings.nonce }
});composer test # Unit + integration
composer test:unit # Unit tests only (no WordPress DB)
composer test:integration # Integration tests only
composer phpcs
composer phpstanIntegration tests live in tests/Integration/ and require the official WordPress test suite. Without the harness, they automatically call markTestSkipped().
Adjust database credentials as needed:
export WP_TESTS_DIR=/tmp/wordpress-tests-lib
export WP_CORE_DIR=/tmp/wordpress/git clone --depth=1 --branch trunk github.com/WordPress/wordpress-develop.git /tmp/wordpress-develop bash /tmp/wordpress-develop/bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 latest
composer test:integration ```
GitHub Actions (.github/workflows/ci.yml) provisions MySQL 8, installs the WordPress test suite from wordpress-develop, and runs the full PHPUnit suite (unit + integration) on PHP 8.2 and 8.3.
Actions and filters exposed by Redirect Content Manager.
Fires after the plugin has fully booted.
do_action( 'rcm_loaded', $plugin );Parameters: - $plugin (RedirectContentManager\Plugin) - Plugin instance
Fires after a scan completes.
do_action( 'rcm_scan_completed', $scanned, $issues, $type );Parameters: - $scanned (int) - Number of items scanned - $issues (int) - Number of health issues found - $type (string) - Scan type slug
Fires after an import completes.
do_action( 'rcm_import_completed', $result, $type );Parameters: - $result (array) - Import result with imported, skipped, errors - $type (string) - Import type (csv, xlsx, manual)
Fires when a monitored item is deleted via REST API.
do_action( 'rcm_item_deleted', $id );Parameters: - $id (int) - Deleted item ID
Cron hook for scheduled scans. Registered by the plugin; do not call directly unless testing.
Cron hook for weekly email reports.
Filter registered redirect detection providers.
apply_filters( 'rcm_redirect_providers', $providers );Parameters: - $providers (array<string, RedirectProviderInterface>)
Filter registered SEO plugin adapters.
apply_filters( 'rcm_seo_adapters', $adapters );Parameters: - $adapters (array<string, SeoAdapterInterface>)
Filter health check strategies.
apply_filters( 'rcm_health_checks', $checks );Parameters: - $checks (array<string, callable>) - Map of slug to callback returning HealthIssue[]
Filter whether a post should be excluded from sitemap.
apply_filters( 'rcm_exclude_from_sitemap', false, $post );Parameters: - $exclude (bool) - Current exclusion status - $post (WP_Post) - Post object
Used by: Yoast, Rank Math, AIOSEO, and core sitemap filters
Filter redirect detection result.
apply_filters( 'rcm_redirect_detected', $result, $url, $provider );Parameters: - $result (RedirectResult) - $url (string) - $provider (string) - Provider slug
Register optional future modules.
apply_filters( 'rcm_modules', $modules );Parameters: - $modules (array<string, object>)
The plugin adds rcm_monthly and rcm_custom schedules via the cron_schedules filter.
Version 1.0.39
All notable changes to Redirect Content Manager will be documented in this file.
Developer: InfoWebPlus
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
/home → /) are no longer flagged as critical broken redirects/countries/africa/cambodia falsely marked as the published /countries/cambodia page)noindex meta: redirected content is removed from the sitemap via the SEO plugin's official sitemap filters only, and its index state is left untouchedrcm_/RCM_ prefix to iwp_rcm_/IWP_RCM_ (options, hooks, AJAX actions, cron events, database tables, constants, cache group, script handle) to avoid collisions; existing installs are migrated automatically (tables, options and the scheduled scan are moved on upgrade)load_plugin_textdomain() call (translations load automatically on WordPress 4.6+)noindex; on upgrade, any noindex previously written by the plugin to excluded items is cleared automatically (one-time migration)scan, stats, import