| 开发者 |
minorank
fotibout |
|---|---|
| 更新时间 | 2026年7月28日 22:43 |
| PHP版本: | 8.0 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
/sitemap.xml with per-type sub-sitemaps (posts, pages, categories, WooCommerce products and product categories). Supports pagination, image entries (Google image sitemap namespace), and per-post-type exclusions. Toggle each post type and taxonomy independently from the Settings page.
Image SEO Addon
Automatically fills missing alt text and title attributes on images using configurable token-based format strings (%post_title%, %filename%, %focus_keyword%, etc.). Supports casing rules and find-and-replace rules. Operates on rendered HTML — the database is never modified.
Redirections
Full CRUD admin UI for managing 301, 302, 307, 410, and 451 redirects stored in the database. Features: search by source or target, filter by type and group, bulk delete, group autocomplete. Redirections fire before WordPress loads any templates — zero overhead.
404 Monitor
Logs every 404 hit with URL, referrer, user agent, IP address, and cumulative hit count. Lets you sort by any column, bulk-dismiss entries, and convert any 404 directly into a redirect with one click.
JSON-LD Schema
Outputs structured data for every page type: WebSite + SearchAction on the homepage, LocalBusiness (with address, geo, opening hours, social profiles), Article / BlogPosting / NewsArticle on posts, WebPage on pages, Product on WooCommerce products, CollectionPage on category archives, and BreadcrumbList on all content pages.
Local Business Schema Addon
Full Local Business JSON-LD configuration — business name, type (110+ schema.org types in grouped categories), address, phone, email, and logo.
IndexNow
Automatically pings the IndexNow API (Bing, Yandex) whenever a post is published or updated. Also lets you manually ping any URL or the homepage on demand.
LLMs.txt
Generates a /llms.txt file following the llmstxt.org specification so AI crawlers can understand your site structure.
Post Type & URL Monitor
Detects new custom post types registered by newly activated plugins and notifies you in the admin so you can configure their SEO settings. Also monitors URL changes (renamed slugs, trashed or deleted posts) and creates redirects automatically.
REST API
Every feature is exposed via a versioned REST API at /wp-json/minorank/v1/. Endpoints accept either an X-Minorank-Key header or a standard WordPress admin session — no separate auth plugin needed.
Why Minorank SEO?
dbDelta(); plugin updates never wipe your data.declare(strict_types=1) throughout.minorank-seo folder to /wp-content/plugins/, or install it via Plugins → Add New in the WordPress admin.minorank_404s and minorank_redirections) and registers all rewrite rules for sitemaps, LLMs.txt, and IndexNow.Yes — Minorank SEO is a standalone plugin and does not require Rank Math or Yoast. It reads existing Rank Math and Yoast meta keys alongside its own for backwards-compatible imports.
wp_options (keys prefixed with minorank_).{prefix}minorank_404s custom table.{prefix}minorank_redirections custom table.{prefix}minorank_internal_links custom table.{prefix}minorank_broken_links custom table.No. Settings are stored in the WordPress database, not in plugin files. Updating the plugin files never touches your options or custom tables.
All endpoints live under /wp-json/minorank/v1/. You can authenticate with:
X-Minorank-Key: your-api-key request header, orYes. Product sitemaps, product category sitemaps, Product schema markup, and WooCommerce-specific content analysis are all built in.
Yes. Meta management, the SEO metabox, and content analysis work on any registered post type. The sitemap section lets you toggle any public post type individually.
No. WPML, Polylang, and TranslatePress all already generate their own hreflang tags automatically. Hreflang Health only reads the same translation-link data those plugins use internally and flags problems in it (a link pointing at a deleted page, two translations claiming the same language) — it never writes any tags itself, so there's no risk of duplicate or conflicting hreflang output. It's also invisible on single-language sites.
301 (Moved Permanently), 302 (Found / Temporary), 307 (Temporary Redirect), 410 (Gone), and 451 (Unavailable For Legal Reasons).
On activation a random key is generated and stored in wp_options. When you publish or update a post, the plugin pings https://api.indexnow.org/ with that key and the post URL. You can also trigger manual pings from the Settings page.
maybe_unserialize() on every public custom field value on a post, which allows unrestricted PHP object instantiation. Any user able to save custom fields (Editor, Author) could store a crafted payload that would run when an admin later opened that post — now uses the same restricted, allowed_classes: false unserialize already used for redirect import data.manage_options.</> characters, so a stored value containing </script> could break out of the schema <script> tag and run arbitrary JavaScript for site visitors.X-Forwarded-For/X-Real-IP headers for the logged visitor IP — only the actual connection IP is used.unserialize() call (object instantiation disabled), removing a PHP object-injection vector from imported data..DS_Store file that had been accidentally included in the plugin folder.$wpdb->prepare() placeholders.<img> tags inside the post content, so a keyword placed correctly in the main image's alt text (and nowhere else) was reported as missing. The classic editor (used for WooCommerce products and CPTs on the Classic Editor) already checked this correctly; Gutenberg and Elementor now match it, reusing the same main-image resolver that already handles custom-field-based images for CPT builders like JetEngine./wp-content/ links (uploaded PDFs, images, theme/plugin assets) as broken, since those are direct file paths rather than post permalinks and can never resolve via url_to_postid(). Now verified against the actual file on disk instead.<a href="..."> markup, affecting SEO score accuracy across the block editor, classic editor, and Elementor content analysis.\/ preventing any </script> sequence in stored data from breaking out of the script tag.phpcs:ignore to phpcs:disable/phpcs:enable — phpcs:ignore only covers one line, so PreparedSQL.NotPrepared and InterpolatedNotPrepared were still firing on inner string-concatenation lines inside multi-line prepare() calls (404, redirections, sitemap classes).NonceVerification.Recommended on REST API key fallback ($_GET['mnrk_key']) — intentional, nonce-free API key auth.Squiz.DiscouragedFunctions for @set_time_limit(300) in bulk importer — required for long-running operations.WPQueryParams.PostNotIn performance warnings on sitemap exclusion lists — standard feature, not a VIP host.phpcs:ignore for $_SERVER['REQUEST_URI'] in 404 monitor current_url().PreparedSQL.NotPrepared errors — added correct phpcs:ignore to all queries using string-concatenated class constants (. self::TABLE .) in 404, redirections, and sitemap classes.parse_url() with WordPress wrapper wp_parse_url() in redirections normalizer.phpcs:ignore for $_SERVER['REQUEST_URI'] in redirect handler (used only for path comparison, never for output).(int) cast with absint() in Elementor enqueue so PHPCS recognises it as sanitization.wp_kses_post() on the detail HTML and esc_html() on all string slots.uninstall.php — all top-level variables now prefixed with minorank_ per WordPress coding standards.$_SERVER input handling in 404 monitor — wp_unslash() now called at point of read for all server variables.$_GET unslash in content analysis Elementor enqueue.$_GET/$_SERVER in REST API check_permission().phpcs:ignore comments for PreparedSQL.NotPrepared on table-name-only COUNT queries in 404, redirections, and sitemap classes.phpcs:ignore on postmeta direct queries in import handler.wp_redirect() to wp_safe_redirect() in redirections handler.languages/ directory to match Domain Path plugin header..mn-filter-bar input CSS now excludes [type=checkbox] so the min-width rule no longer inflates it.table-layout:fixed with explicit header widths.hit_count as hits to match the JavaScript field name.uninstall.php — cleans up all plugin options and drops custom tables on uninstall./search-posts and /search-terms endpoints now return up to 50 results when called without parameters (for initial dropdown population).sitemap-posts-2.xml).<image:image> entries added to each URL using the Google image sitemap namespace./search-posts and /search-terms endpoints for sitemap exclude pickers.%post_title%, %filename%, %focus_keyword%, %attachment_title%, %site_name%, %category%, and %sep% separator token.Minorank SEO → Addons) with toggleable addon cards.pre_get_avatar_data filter.wp_get_attachment_image_attributes filter for block editor images, galleries, and thumbnails.class-image-seo.php) — automatically fills missing alt and title attributes on images using resolved format strings. Database is never modified; operates on rendered HTML only.class-post-type-monitor.php) — detects newly registered custom post types and shows an admin notice.class-url-monitor.php) — detects renamed slugs and trashed/deleted posts; creates redirects automatically.check_permission() is now public.output_schema() reads per-content-type schema type from settings; configurable from the Settings page.check_permission() accepts both API key and logged-in WP admin sessions._minorank_focus_keywords post meta._minorank_* meta fields (robots, canonical, OG, Twitter, schema type, pillar flag).output_schema().group_name column; extended type support to 307, 410, 451./llms.txt endpoint, IndexNow integration, and JSON-LD schema output.