| 开发者 |
seoyen
tevfikgulep |
|---|---|
| 更新时间 | 2026年9月11日 06:02 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
<a> elements in your content, then links only the first still-unlinked occurrence of the anchor text — so it never writes a link inside an existing link, and never double-links the same phrase.<script type="application/ld+json"> block.robots.txt and llms.txt through virtual routes — no file permission changes required./{key}.txt route, and Google Instant Indexing authenticates with your own Google Cloud service-account JSON over an OAuth2 JWT (RS256) — no third-party libraries involved.
SEO plugin integrations
The plugin talks to existing SEO plugins so there are no conflicts:
assets/js/vendor/chart.min.js, MIT License, https://www.chartjs.org/ — unminified source at https://github.com/chartjs/Chart.js) for the admin charts. No other third-party library is bundled and no script or style is loaded from a CDN.
SEOYEN account required for AI features
The internal-links apply, redirect management, and local admin tools work without an account. Panel-driven features (AI content, meta description generation, audit auto-fix driven from the panel, suggestion lists) require an active SEOYEN account so the WordPress plugin can talk to the panel API.
wp-content/plugins/seoyen/.Yes for AI and panel-driven features (AI content publish, meta description apply, audit auto-fix from the panel, suggestion lists, webhook dispatch back to the panel). The redirect manager, admin UI, and local debugging pages work without a panel connection.
Yoast SEO (Free and Premium), Rank Math, SEOPress, and AIOSEO (All in One SEO) are detected automatically. If none of these are active, the plugin falls back to writing meta descriptions, canonical tags, and Open Graph tags itself. You only need one of these (including the native fallback) to get meta description support.
The redirect manager, admin UI, activity log, and system status work without a panel connection. AI features, audit auto-fix from the panel, and suggestion lists require an active SEOYEN account because the data comes from the panel API.
No. The plugin adds no public-facing tracking scripts and sets no cookies. There is no separate telemetry switch: after you save a SEOYEN API key the plugin talks only to your own SEOYEN panel — a short status report (site address, plugin version, which optional features are enabled, and product/category counts on WooCommerce stores) that is pushed when you save settings, test the connection, or the plugin version changes, and otherwise read by your panel about once a day; and, while AI bot logging is enabled, an aggregate of AI-crawler visits (per day, per bot name, per path — counts only, no IP addresses, no human visitor data) that your panel reads about once an hour. The plugin itself runs no scheduled job. Removing the API key stops every outbound call and every authenticated read. The full list is in the External Services section above.
Redirects are stored in the custom table {prefix}seoyen_redirects. On every public request the plugin hooks template_redirect at priority 1, normalizes the request URI, looks up the destination, and — if a match is found — issues a wp_safe_redirect() with the configured status code. Hit counts are updated on the shutdown hook so they do not slow down the response.
No. The plugin uses an adapter pattern. If Yoast is active, meta descriptions are written into Yoast's post meta keys; the same is true for Rank Math, SEOPress, and AIOSEO (written into AIOSEO's own database table). If none are active, the plugin writes its own meta tags in the head. The plugin never outputs duplicate meta tags.
Yes. In SEOYEN SEO > Settings there is a "Keep data on uninstall" toggle. When disabled, uninstalling the plugin drops all six custom tables (redirects, activity log, webhooks, AI-bot hits, WooCommerce change state and journal), deletes _seoyen_* post meta and term meta, the plugin's own user preferences (dashboard widget options, welcome-notice dismissal), its options and cached transients, and removes the seoyen_manage capability. Meta written into Yoast, Rank Math, SEOPress or AIOSEO fields is left untouched. On a multisite network every site is cleaned according to its own toggle. The default is to keep data so you can reactivate without losing redirects or activity history.
No. When a physical robots.txt exists in the WordPress root, the web server serves that file directly and WordPress never runs the virtual robots.txt — the AI-bot toggles and any rule pushed from the panel are silently bypassed. SEOYEN SEO > Settings > SEO Behavior shows a warning with a one-click "delete the physical file" button while this is the case; the plugin only writes a physical file when the panel explicitly asks for it, and the files/status endpoint reports physical_exists.
Yes. SEOYEN SEO Platform is released under GPLv2 or later, the same license as WordPress core.
Please contact support through https://seoyen.com/ or open an issue in the SEOYEN panel's help section.
og:type, og:url, twitter:card and hreflang were written only to this plugin's own storage and never rendered on the page — yet the endpoint reported success and the panel closed the issue. They now report honestly as not applied, and the issue stays in your report.http:// → https:// and non-www → www links — the most common redirects on a WordPress site; the fix was skipping every one of them as "nothing to change".LocalBusiness subtypes (Hotel, Restaurant, Store, clinics…); the gate accepted only the exact LocalBusiness type. Unrelated types are still rejected.mode is rejected instead of silently falling back to append and duplicating a graph node.post_content field is a stale copy; body-writing fixes, paragraph insertion and internal links now detect the builder and report honestly that the fix must be applied inside the builder editor (seoyen_page_builder_owner filter)."false" no longer counts as true on REST endpoints (noindex, physical robots.txt, llms.txt enabled, redirect is_active); an unrecognised boolean returns 400 before anything is written.’; countable strings use proper plurals; status-strip stamps use the same site-time reader as the run table; the Search Console connect link passes the scheme filter.seoyen_redirects_imported webhook event; schema mode is a closed set at the write site too; skipped term fixes carry their reason in hint; the plugin advertises which suggestion types it can write (apply_tool_ids) so the panel no longer guesses from the version.wpmu_drop_tables when a network site is deleted; the network install queue, a user-meta key and an owner override option are cleaned on uninstall; the post-upgrade version announcement uses a 5-second timeout; activation sends home_url() on subdirectory installs.http/https pass now), and admin assets loaded on foreign plugin pages whose slug started with seoyen (exact screen match now).@id linking) and breadcrumbs ([seoyen_breadcrumbs] shortcode and seoyen_breadcrumbs() template tag) are all applied now, and the visible breadcrumb trail and the one reported to search engines finally come from one source.{token} syntax in patterns. {title} {sep} {sitename} replaces %%title%% %%sep%% %%sitename%%; existing records migrate on their own and both forms keep resolving. An unrecognised token is rejected when you save and reported to you instead of leaking into your page title, and a token sitting inside a resolved value is no longer resolved a second time or silently deleted.{sitename} rather than baked in, and your real site name pulled in so the length counter is honest. A recommendation is not a default: nothing changes on your site until you save, and the screen says so.wp-config.php salts and never stored. Existing installs migrate on first read; if the envelope cannot be opened after a salt change or a server move you are told to re-upload the JSON instead of seeing a silent "not connected".((a+))+), ambiguous alternation ((a|aa)+) and the spaced x form (/^( a + ) + $/x) were all accepted before at the same cost, and on servers with an unlimited PCRE backtrack limit the clamp was skipped exactly where it mattered (measured: 15 seconds for one rule). The bucket counting bad API-key attempts used read-modify-write, so concurrent requests multiplied the per-minute limit, and the 250 ms delay was paid before the counter moved.robots.txt shadowing the virtual one returns an explicit error instead of 200; invalid og:type, og:url, twitter:card and review ratings never reach storage; the same paragraph is not written twice; "nothing changed" no longer fires your webhook; term fixes go through the same gate as post fixes; and a failed callback to the panel is now shown instead of "✓ Fixed".ERR_TOO_MANY_REDIRECTS: only a single step was checked, and editing an existing rule's target skipped the gate entirely. Create and update now share one gate that walks the chain. Bulk import no longer accepts fields outside the contract, an already-inactive rule is not counted as "1 hop removed", and resolving a chain appends to your note instead of overwriting it.og:title/twitter:title; a card is no longer left without a description; both cards use the same image; the site-wide pattern no longer overwrites a post's own social title or description; and a canonical you wrote is really applied when the theme printed its own first. Raw HTML entities are gone from JSON-LD across 27 fields (measured live: Türkiye'nin) while address and identity fields stay untouched, @graph members no longer carry @context, and variable WooCommerce products are reported with AggregateOffer instead of a single lowest price. Unticking "Output native meta tags" no longer leaves titles, robots, schema, breadcrumbs and redirects unbound or deletes our own schema nodes, and removing one bot from robots.txt no longer deletes another bot's shared Disallow: or migrates rules into the wrong group.SEO was written as <a href="…">SEO</a>YEN, splitting a brand name in your published body with no way back — and in the other direction an unlinked phrase was skipped as "already linked". Both gates now share one Unicode word-boundary grammar (required for Turkish). Separately, an update from the panel no longer silently demotes a published post to draft: unknown statuses are rejected, and statuses your own site registers (archived) are kept.#…) can now be fixed. The "links to a redirect" fix could not find a link that carried a section anchor (/privacy-policy/#your-rights): it answered "this may come from a theme template, fix it by hand" while the link was right there in the page body (measured on the live site). Matching now ignores the anchor and carries it over to the new address: /privacy-policy/#your-rights → /privacy/#your-rights. If the destination the panel measured carries an anchor of its own, that one wins; links without an anchor behave exactly as before.<a href> on the page stayed unchanged, so the issue came straight back on the next crawl (and most calls failed outright because the panel could not produce the data that fix needed). The link on the page is now rewritten to the final destination the panel measured live, and your markup style is preserved — a relative link stays relative. If the link lives in a custom menu item instead of the post body, the menu URL is updated and read back to verify the write.www. and non-www. addresses are treated as different targets — that difference is the defect being fixed.success: the activity log recorded success, the seoyen_audit_applied event — and therefore your webhook — fired, and the row in wp-admin was marked "✓ Fixed". Such a result is now logged as skipped, the webhook does not fire, the row is not marked fixed, and the reason is shown on screen. The same contract was closed on the internal-link endpoint in 2.2.4; the audit endpoint was still open.<ul>, ignored heading levels, and was written permanently to the top of the post with no way back. Detection stays: the "no table of contents" finding is still reported — solve it with your theme's or a dedicated plugin's own component. The content-editing mode list is down from six to five (append, replace, add_subheadings, split_paragraphs, simplify_sentences); the removed add_toc mode is now rejected explicitly.?utm_source=…, ?fbclid=…), percent-encoded requests match rules written with Turkish characters, a prefix rule whose target sits under its own source no longer loops, and a bulk import above 500 rows is rejected explicitly instead of being silently truncated.noindex removal, site-wide settings and schema deletion are no longer reported "applied" without a verified write; "internal link applied" is reported only when the link was really inserted (a skipped result is logged as skipped, with a reason, and fires no webhook); writing llms-full.txt no longer returns an unverified 2xx; sending the same article twice returns the existing post instead of creating a second one; and an appended paragraph no longer lands inside a Gutenberg heading block.https://$1) — an open door that could send a visitor to a completely foreign site based on what they typed. Such a target is now rejected on save and, even if one was saved earlier, is never applied at request time; using $1 in the path still works. Your IndexNow key — IndexNow's proof of ownership for your site — is now served only from its own path instead of being readable from any address on your site._seoyen_* fields on categories and tags, the plugin's own user preferences, three forgotten option rows, five transient families and a leftover scheduler. On multisite networks every site is now walked individually and each follows its own "keep my data" preference; Yoast / Rank Math / SEOPress fields are left untouched.og:type, og:url, twitter:card, image alt text, llms-full.txt and writes to a third-party SEO plugin now require a verified write before success is claimed. Re-saving a post through a panel-applied fix used to permanently remove manually-added <iframe> (YouTube embeds, maps), <object> and <script> elements — your existing content is now preserved as-is. Internal-link insertion is scoped to visible text only, so an anchor word that also appears inside an alt= attribute or a Gutenberg block comment no longer breaks the image or the block.<h1> tag in the post content, while most themes print the visible heading from the post title, not the content. Measured (28 August 2026, three rounds): the target posts had no <h1> in their content at all, the fix was silently skipped all three rounds, and the same finding kept coming back on every audit.<h1> in the content to change, the plugin no longer gives up silently; the panel shows a "Also update the post title" checkbox under the fix. Nothing changes unless the box is checked.content.meta_too_long, content.meta_too_short, content.meta_description_duplicate, and social_meta.og_description_missing stayed silent 3/3 rounds.<meta name="description"> tag before the plugin's turn comes. This wasn't specific to any one site — every site whose theme prints its own description had the same silent no-op.twitter:card is no longer duplicated — if the theme (or a plugin like Jetpack) already prints its own card tag, a second, conflicting one is no longer added. All three output points in the class now follow the same contract.draft / publish) stayed the same.