{"id":358621,"date":"2026-09-04T12:38:19","date_gmt":"2026-09-04T12:38:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/megop-seo\/"},"modified":"2026-09-04T22:13:28","modified_gmt":"2026-09-04T22:13:28","slug":"megop-seo","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/megop-seo\/","author":23532127,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"8.3.0","stable_tag":"8.3.0","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Megop SEO","header_author":"\u0645\u062d\u0645\u062f \u0642\u0627\u0633\u0645\u06cc (Mohammad Ghasemi)","header_description":"Internal linking, broken-link repair, Search Console coverage and bulk editing for titles, meta and content - in one plugin. Persian-aware matching throughout.","assets_banners_color":"faf6f2","last_updated":"2026-09-04 22:13:28","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/megop.org\/","header_author_uri":"https:\/\/megop.org\/founder-bio\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"8.3.0":{"tag":"8.3.0","author":"hamuo1372","date":"2026-09-04 22:13:28","revision":3681862}},"upgrade_notice":{"8.3.0":"<p>Prices in the bulk grid are saved now, they never were. Search Console meta undo works, the control group is really drawn, the settings screen survives switching the linking module off, and a grid save no longer strips backslashes or corrupts Rank Math variables. Plugin Check clean. No data changes.<\/p>","8.0.2":"<p>Link Nurse only saw links written as full URLs; anything stored as \/path\/ was discarded unchecked. On one real site that was a quarter of every link and half of every page. Relative links are now resolved and checked, repairs keep the author&#039;s link style, and the XLSX export no longer 404s.<\/p>","8.0.1":"<p>Link Nurse could not see redirected links at all: the rewrite setting had been wired as a detection gate. Redirects are always reported now, a redirect landing on a 404 counts as broken, and no link is rewritten to an unverified target. No data changes.<\/p>","8.0.0":"<p>Link Nurse settings really save now. The previous fix could not reach the browser, because the module served a cached copy of its own JavaScript. Saving shows a green confirmation. Sitemap refresh added. No data changes.<\/p>","7.5.0":"<p>Link Nurse can now refresh the sitemap and check every address in it. Two Link Nurse bugs are fixed: settings were never saved, and the progress bar jumped down the page when the settings panel opened. No data changes.<\/p>","7.4.3":"<p>Fixes a fatal error on the automatic-linking screen when its statistics template was rendered twice in one request. No behaviour changes and no data changes.<\/p>","7.4.2":"<p>New: a Refresh sitemap button on the bulk manager header, which clears the sitemap cache and rebuilds the files before a crawler asks. Dark mode is remembered per person. The header no longer flips when you change language. No data changes.<\/p>","7.4.1":"<p>Fixes an admin-page slug collision that printed the Link Nurse screen on top of Internal Analytics, and clears every remaining Plugin Check notice. No behaviour changes elsewhere and no data changes.<\/p>","7.4.0":"<p>Repository compliance pass: translator comments, escaping at the point of output and a written reason on every direct query. No behaviour changes and no data changes.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3681203,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3681203,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3681203,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3681203,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["8.3.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Seo Bulk Manager: every post type and taxonomy in one grid, with resolved character counters, per row find and replace, prices and the Search Console column.","2":"Keyword coverage: which searches each page is shown for, in green, yellow and red, with the opportunity behind each.","3":"The automatic linking overview in shadow mode, with the engine status, the permanence card and the statistics.","4":"Link Nurse results, grouped by cause, with the destination of every redirect.","5":"Index status, with the reasons Google gave for each page it did not index.","6":"The effect report, with the control group card and the before and after dots per query."}},"plugin_section":[],"plugin_tags":[14279,11143,6681,1260,127115],"plugin_category":[55],"plugin_contributors":[276880],"plugin_business_model":[],"class_list":["post-358621","plugin","type-plugin","status-publish","hentry","plugin_tags-broken-links","plugin_tags-bulk-edit","plugin_tags-internal-links","plugin_tags-persian","plugin_tags-search-console","plugin_category-seo-and-marketing","plugin_contributors-hamuo1372","plugin_committers-hamuo1372"],"banners":{"banner":"https:\/\/ps.w.org\/megop-seo\/assets\/banner-772x250.png?rev=3681203","banner_2x":"https:\/\/ps.w.org\/megop-seo\/assets\/banner-1544x500.png?rev=3681203","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/megop-seo\/assets\/icon-128x128.png?rev=3681203","icon_2x":"https:\/\/ps.w.org\/megop-seo\/assets\/icon-256x256.png?rev=3681203","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Internal linking on WordPress is a paid category. The tools people recommend are commercial and closed source, their licences are proprietary, and the ones that publish a price ask anywhere from a monthly subscription to several hundred dollars. All of them were built for English first. The most translated of them ships a dozen interface languages, and Persian is not one of them.<\/p>\n\n<p>So for a Persian site the shelf has been empty. Not a free option, not an open one, and not one that knows a Persian phrase can be spelled four ways that look identical to a reader and are four different strings to a computer.<\/p>\n\n<p>This is the option that was missing. GPLv2, every line. Five tools that would normally be five purchases, sharing one index so they agree with each other instead of fighting.<\/p>\n\n<p>If you have been looking for a bulk editor, a bulk price editor for WooCommerce, a bulk duplicator, a search and replace tool, a redirect chain checker or a self hosted analytics plugin, five of those are here, in one plugin, free.<\/p>\n\n<p>Written and maintained by <a href=\"https:\/\/megop.org\/\">\u0645\u062d\u0645\u062f \u0642\u0627\u0633\u0645\u06cc (Mohammad Ghasemi)<\/a>, Tehran, Iran.<\/p>\n\n<h4>Seo Bulk Manager: your whole site in one grid<\/h4>\n\n<p>Every public post type and every public taxonomy, whatever registered them. Posts, pages, WooCommerce products, product categories, a custom post type a plugin created this morning. Nothing is hard coded and nothing is special cased.<\/p>\n\n<p><strong>Edit the row, not the page.<\/strong> H1, SEO title, meta description, featured image, status, category, term parent, and the regular and sale price of a product. Save one row and that row saves, in place, no reload.<\/p>\n\n<p><strong>The counter counts what Google sees.<\/strong> A title template such as <code>%title% %sep% %sitename%<\/code> is 24 characters in a plain counter and 61 on the search result. This one resolves the variables first, so the number under the field is the number that decides whether you get truncated.<\/p>\n\n<p><strong>Search and replace answers before it acts.<\/strong> Tick the fields, type the phrase, and the row tells you how many matches it found and where, Elementor data included. Then you commit.<\/p>\n\n<p><strong>Prices, variable products included.<\/strong> An empty field is left alone, never read as clear. One price is written to every variation.<\/p>\n\n<p><strong>Turn one page into fifty.<\/strong> List a word and its replacements, one page per line, and get fifty drafts with the terms, the featured image and the Elementor data intact. A product line with twelve near identical descriptions stops being twelve editing sessions.<\/p>\n\n<p><strong>Delete with a redirect, in one step.<\/strong> The row goes to the trash and its old address is redirected where you choose.<\/p>\n\n<p><strong>Headings, without touching layout.<\/strong> H1 to H6 of a page, read from the body and from Elementor widgets, editable as text. Adding and removing is deliberately impossible: where a heading belongs is a decision for the editor, not a list.<\/p>\n\n<p><strong>Sorted by clicks.<\/strong> With Search Console connected, the grid orders itself by real impressions and clicks over a range you pick.<\/p>\n\n<h4>Seo Auto Link: one keyword, every page<\/h4>\n\n<p>Register a phrase on a page and the engine links it everywhere that phrase appears. From an index, not a search of your content on every request: the heaviest page on the test site resolves in 7.3 milliseconds.<\/p>\n\n<p><strong>It starts in shadow mode.<\/strong> The index builds while nothing is injected. You read the reports, you fix the conflicts, and only then do you switch it live.<\/p>\n\n<p><strong>Persian folding before matching.<\/strong> Arabic and Persian characters folded together, the zero width non joiner treated as a space, digits normalised. Your content is read through an offset map, never rewritten.<\/p>\n\n<p><strong>Rules that stop it embarrassing you.<\/strong> Longest phrase first, ranges locked so two keywords cannot overlap, word boundaries on both sides, no link from a page to itself, and never inside a heading, a button, an existing link, a shortcode or an attribute. Caps per page, per target and per paragraph, all off by default because the right number is your content's, not a figure from a blog post.<\/p>\n\n<p><strong>It finds the links you wrote by hand years ago.<\/strong> A hand written link blocks the engine, so those phrases sit outside every report and never update when a destination moves. The pattern finder lists them and converts them in bulk, with the original of every page backed up first.<\/p>\n\n<p><strong>Nothing is lost when you leave.<\/strong> Deactivate the plugin and every link is written permanently into your content before it goes. Reactivate and the content returns to its clean state, byte for byte. Measured on a real site: 830 links across 227 pages, and the restored content identical to the original.<\/p>\n\n<h4>Search Console: what Google knows, on your screen<\/h4>\n\n<p>Upload your own Google service account key. The plugin reads your property and nothing leaves your site except the query to Google.<\/p>\n\n<p><strong>The gap, page by page.<\/strong> Google is already showing this page for these searches. Green means the phrase is on the page, word for word. Yellow means some of its words are. Red means the page does not say it at all, and red is where the opportunity is.<\/p>\n\n<p><strong>Index status, in Google's own words.<\/strong> One URL at a time, grouped the way Search Console groups them: indexed, crawled but not indexed, discovered, excluded by a tag, blocked by robots.<\/p>\n\n<p><strong>Writing, with the site holding the decisions.<\/strong> The site decides which page, which phrase and where the sentence goes; the model only writes prose. A rewrite, not a paragraph bolted onto the end. Off by default, and it stays off until you configure an endpoint.<\/p>\n\n<p><strong>Two ways of not fooling yourself.<\/strong> A control group is drawn from every queue as a holdout, and every edit is dated so the 28 days before it can be compared with the 28 days after. If the whole site drops past a threshold you set, everything stops.<\/p>\n\n<h4>Link Nurse: broken links found and repaired<\/h4>\n\n<p>Content, excerpts, term descriptions, Elementor data and your XML sitemap. Relative links resolved against the page they sit on, which is where most scanners quietly lose a quarter of a site's links.<\/p>\n\n<p><strong>Conservative on purpose.<\/strong> A 401, 403, 404 or 429 is checked again with a browser user agent before it is reported, because large publishers answer robots differently from browsers. Your own uploads are checked on disk, not over HTTP, which removes hundreds of self requests per scan.<\/p>\n\n<p><strong>A redirect chain is followed to its end.<\/strong> Up to ten hops, and a 301 that lands on a 404 is reported as broken with both codes, not as healthy.<\/p>\n\n<p><strong>Repairs keep your house style.<\/strong> A broken link is unwrapped and its text kept. Before the first repair to any field, the original is copied aside, so undo is per field and always available.<\/p>\n\n<h4>Internal Analytics: your visitors, your server<\/h4>\n\n<p>No third party anywhere in the path. One cookie holding a random session id, set in the browser, never sent to anyone.<\/p>\n\n<p><strong>Engagement, not page loads.<\/strong> Seconds accrue only while the tab is visible and the visitor actually moved, scrolled, typed or clicked.<\/p>\n\n<p><strong>Events out of the box.<\/strong> Outbound clicks, file downloads, tel and mailto links, form start and submit, CTA clicks, copy events.<\/p>\n\n<p><strong>Screens that answer questions.<\/strong> Visits, unique visitors, page views, engagement and bounce, average time, live visitors, and the pages and sources behind each number. Raw rows kept for a year by default, daily totals for twice that.<\/p>\n\n<h4>Persian and Arabic, from the first line<\/h4>\n\n<p>The same phrase can carry an Arabic character where a Persian one belongs, a zero width non joiner instead of a space, or a Persian digit where Google reports a Latin one. Every tool that matches text literally treats those as different phrases. This one folds them together first, everywhere: the linking engine, search and replace, keyword coverage and the reports.<\/p>\n\n<p>The screens themselves speak English, Persian or Arabic, and each person on the site picks their own. Choosing one does not change the language of the rest of the dashboard.<\/p>\n\n<h4>It works with your SEO plugin, not against it<\/h4>\n\n<p>This does not replace Rank Math and does not try to. Rank Math owns the SEO title, the meta description and the redirect table; this plugin reads and writes those fields rather than inventing its own, and resolves redirects from that table instead of making an HTTP request. Yoast, SEOPress and All in One SEO are detected for the sitemap tools.<\/p>\n\n<h4>Tested on a live shop, not a clean install<\/h4>\n\n<p>Every release runs against a live Persian WooCommerce site with several thousand posts before it is packaged. That is where the findings come from: a Jalali date reaching a SQL comparison and returning zero rows on a site with 66,000 recorded visits; a scanner that had never reported a quarter of a site's links because they did not begin with http; a bulk editor whose first version read an empty price field as clear. Each one is in the changelog with what caused it.<\/p>\n\n<h4>What it writes to your database<\/h4>\n\n<p>One table for the link index and eight for analytics, all prefixed. Keywords, exclusions and caps live in post and term meta. Settings live in options. Nothing is written outside your own database, and an uninstall switch decides whether all of it is removed or kept for a reinstall.<\/p>\n\n<h4>External services<\/h4>\n\n<p><strong>Google Search Console API<\/strong>, used only when you upload your own service account key. Your site sends the property URL, date ranges and page addresses to Google in order to read back the searches and index states Google holds for you. <a href=\"https:\/\/developers.google.com\/terms\/\">Terms<\/a>, <a href=\"https:\/\/policies.google.com\/privacy\">privacy<\/a>.<\/p>\n\n<p><strong>An AI endpoint of your choosing<\/strong>, optional and inert until you fill in a base URL, key and model. When configured, the text of the page being improved and the target phrases are sent to that endpoint so it can return prose. The provider is yours, so its terms are the ones that apply.<\/p>\n\n<p><strong>The sites you link to<\/strong>, when you scan for broken links. Each external address in your content is requested once, with a user agent naming this plugin and your site so the receiving site can see who is asking.<\/p>\n\n<h4>Author<\/h4>\n\n<p>Built in Tehran, and run every day on the two production sites it was written for. Bug reports and feature requests are welcome on the support forum; the <a href=\"https:\/\/megop.org\/founder-bio\/\">author's page<\/a> has the longer story.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it through the Plugins screen.<\/li>\n<li>Activate it. The linking engine starts in shadow mode, so nothing on your site changes yet.<\/li>\n<li>Open Megop SEO. The bulk grid is the first screen; the settings screen shows the five module switches.<\/li>\n<li>For automatic linking, add a keyword to a page from its editor or from the grid, open Seo Auto Link, press Full index rebuild, review what the engine would do, and switch the engine to live when you are satisfied.<\/li>\n<li>For Search Console, open the Search Console screen, upload a Google service account key file, press Test connection, then Sync now.<\/li>\n<\/ol>\n\n<p>For the SEO title and meta description columns in the bulk manager to appear in your page source, install Rank Math, because those are its fields.<\/p>\n\n<p>The Search Console features are optional and need a Google service account of your own. The screen walks you through creating one and accepts the key file as an upload. Link Nurse's XLSX export needs PHP's ZipArchive extension, which nearly every host provides.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20have%20to%20use%20all%20five%20modules%3F\"><h3>Do I have to use all five modules?<\/h3><\/dt>\n<dd><p>No. A module switched off registers no hooks at all: no menu, no route, no cost on any request. Its data stays untouched.<\/p><\/dd>\n<dt id=\"do%20i%20need%20rank%20math%3F\"><h3>Do I need Rank Math?<\/h3><\/dt>\n<dd><p>Only for the SEO title and description to reach your page source, because those fields are its own. Everything else works without it.<\/p><\/dd>\n<dt id=\"will%20it%20conflict%20with%20my%20seo%20plugin%3F\"><h3>Will it conflict with my SEO plugin?<\/h3><\/dt>\n<dd><p>It is built not to. No meta tags of its own, no sitemap of its own, no second set of fields to keep in sync.<\/p><\/dd>\n<dt id=\"who%20can%20use%20these%20screens%3F\"><h3>Who can use these screens?<\/h3><\/dt>\n<dd><p>Administrators, by default. Two settings can open keyword editing and the analytics to other roles. Both only widen access, so you cannot lock yourself out.<\/p><\/dd>\n<dt id=\"which%20language%20will%20i%20see%3F\"><h3>Which language will I see?<\/h3><\/dt>\n<dd><p>Whichever you pick. English, Persian and Arabic, stored per person, applied to these screens only. The rest of your dashboard never changes.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20persian%20and%20arabic%20text%3F\"><h3>Does it work with Persian and Arabic text?<\/h3><\/dt>\n<dd><p>That is what it was built for. The zero width non joiner and a space are one character, Arabic yeh and kaf fold to Persian, and coverage folds Persian digits too.<\/p><\/dd>\n<dt id=\"what%20does%20the%20bulk%20manager%20actually%20do%20that%20other%20bulk%20editors%20do%20not%3F\"><h3>What does the bulk manager actually do that other bulk editors do not?<\/h3><\/dt>\n<dd><p>Counts the finished title rather than the template, gives every row its own search and replace with a live count, edits prices beside titles, and writes a redirect as it deletes.<\/p><\/dd>\n<dt id=\"is%20bulk%20editing%20safe%20on%20a%20live%20shop%3F\"><h3>Is bulk editing safe on a live shop?<\/h3><\/dt>\n<dd><p>It is built for one. Nothing is written until you press Save on that row, and an empty price field never clears anything.<\/p><\/dd>\n<dt id=\"which%20post%20types%20can%20i%20edit%20in%20the%20grid%3F\"><h3>Which post types can I edit in the grid?<\/h3><\/dt>\n<dd><p>Every public one. The list is read from WordPress at load, so a custom post type registered this morning appears on its own.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20taxonomies%20too%2C%20including%20woocommerce%20categories%20and%20brands%3F\"><h3>Can I edit taxonomies too, including WooCommerce categories and brands?<\/h3><\/dt>\n<dd><p>Yes, every public taxonomy. A term row edits the name, the SEO title and the description, with a parent dropdown where the taxonomy is hierarchical.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20woocommerce%20prices%20in%20bulk%3F\"><h3>Can I edit WooCommerce prices in bulk?<\/h3><\/dt>\n<dd><p>Yes, regular and sale, for every product kind. On a variable product one value reaches every variation and the row tells you how many.<\/p><\/dd>\n<dt id=\"can%20i%20type%20into%20the%20body%20of%20a%20post%20from%20the%20grid%3F\"><h3>Can I type into the body of a post from the grid?<\/h3><\/dt>\n<dd><p>No, deliberately. A paragraph edited blind in a one line box is how content gets destroyed. For prose, open the post.<\/p><\/dd>\n<dt id=\"can%20i%20move%20posts%20or%20products%20into%20a%20different%20category%20from%20the%20grid%3F\"><h3>Can I move posts or products into a different category from the grid?<\/h3><\/dt>\n<dd><p>Yes, from a dropdown in the row. Forty products into the right category becomes forty clicks instead of forty page loads.<\/p><\/dd>\n<dt id=\"why%20is%20the%20category%20or%20parent%20dropdown%20locked%20on%20my%20site%3F\"><h3>Why is the category or parent dropdown locked on my site?<\/h3><\/dt>\n<dd><p>Because on your permalinks that change would change a URL, and that throws away whatever the old address earned. The screen says so where the control would be.<\/p><\/dd>\n<dt id=\"does%20the%20counter%20measure%20the%20template%20or%20the%20finished%20title%3F\"><h3>Does the counter measure the template or the finished title?<\/h3><\/dt>\n<dd><p>The finished title. A template is 24 characters as text and perhaps 61 once it renders, so the variables are resolved first.<\/p><\/dd>\n<dt id=\"can%20i%20use%20rank%20math%20variables%20like%20%25date%25%20and%20%25category%25%20in%20the%20grid%3F\"><h3>Can I use Rank Math variables like %date% and %category% in the grid?<\/h3><\/dt>\n<dd><p>Yes. WordPress's standard sanitiser eats a percent sign followed by two hex characters. These fields are cleaned without touching percent signs.<\/p><\/dd>\n<dt id=\"what%20does%20the%20live%20count%20in%20find%20and%20replace%20tell%20me%3F\"><h3>What does the live count in find and replace tell me?<\/h3><\/dt>\n<dd><p>How many times your phrase occurs in the fields you ticked, before you type the replacement. Then both strings and both counts, twice, before anything moves.<\/p><\/dd>\n<dt id=\"can%20i%20replace%20text%20in%20only%20some%20fields%20of%20a%20row%3F\"><h3>Can I replace text in only some fields of a row?<\/h3><\/dt>\n<dd><p>Yes: H1, title, description, content, in any combination, per row.<\/p><\/dd>\n<dt id=\"can%20i%20replace%20a%20phrase%20across%20many%20rows%20at%20once%3F\"><h3>Can I replace a phrase across many rows at once?<\/h3><\/dt>\n<dd><p>Yes. Tick the rows, press Bulk replace, and see how many matches in how many rows before anything saves.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20save%20the%20whole%20page%3F\"><h3>Do I have to save the whole page?<\/h3><\/dt>\n<dd><p>No. A row saves alone and reports in place, with no reload. Unsaved rows carry an orange bar, and leaving the page asks first.<\/p><\/dd>\n<dt id=\"does%20a%20save%20rewrite%20the%20whole%20post%3F\"><h3>Does a save rewrite the whole post?<\/h3><\/dt>\n<dd><p>It writes the H1, the body as the row holds it, and both SEO fields. An administrator's content goes in untouched.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20featured%20image%20without%20opening%20the%20post%3F\"><h3>Can I change the featured image without opening the post?<\/h3><\/dt>\n<dd><p>Yes. The media library opens over the row and the thumbnail updates as you choose.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20slug%2C%20the%20author%20or%20the%20date%20from%20the%20grid%3F\"><h3>Can I change the slug, the author or the date from the grid?<\/h3><\/dt>\n<dd><p>No. Those stay in the editor. The slug in particular, for the same reason the category lock exists.<\/p><\/dd>\n<dt id=\"can%20i%20sort%20the%20grid%20by%20what%20google%20actually%20shows%3F\"><h3>Can I sort the grid by what Google actually shows?<\/h3><\/dt>\n<dd><p>Yes, by clicks and impressions over a range you pick, read from the Search Console tables this same plugin fills.<\/p><\/dd>\n<dt id=\"why%20is%20the%20search%20console%20column%20missing%20from%20my%20grid%3F\"><h3>Why is the Search Console column missing from my grid?<\/h3><\/dt>\n<dd><p>Either the module is off, or the column is. It is a per person switch at the top of the grid.<\/p><\/dd>\n<dt id=\"are%20woocommerce%20variable%20products%20safe%20to%20edit%20here%3F\"><h3>Are WooCommerce variable products safe to edit here?<\/h3><\/dt>\n<dd><p>Yes. Only a price you changed is sent, so a title edit can never rewrite a catalogue, and an empty field means leave alone.<\/p><\/dd>\n<dt id=\"does%20the%20grid%20work%20on%20elementor%20pages%3F\"><h3>Does the grid work on Elementor pages?<\/h3><\/dt>\n<dd><p>Yes. Replace reaches the Elementor data, the headings tool reads its heading widgets, and the generated stylesheet is rebuilt afterwards.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20rows%20in%20bulk%3F\"><h3>What happens when I delete rows in bulk?<\/h3><\/dt>\n<dd><p>Two steps and reversibly. Delete moves rows to the trash. Delete with a redirect trashes them and writes one rule per row.<\/p><\/dd>\n<dt id=\"where%20do%20the%20redirects%20go%3F\"><h3>Where do the redirects go?<\/h3><\/dt>\n<dd><p>Into Rank Math's redirect table when its module is on, and the dialog offers to switch it on. Otherwise into <code>.htaccess<\/code>, and the dialog says so.<\/p><\/dd>\n<dt id=\"what%20is%20the%20duplicator%20for%3F\"><h3>What is the duplicator for?<\/h3><\/dt>\n<dd><p>Turning one page into fifty. Every copy arrives as a draft with the same terms, image, meta and Elementor data, with your replacements applied.<\/p><\/dd>\n<dt id=\"what%20does%20the%20headings%20tool%20do%3F\"><h3>What does the headings tool do?<\/h3><\/dt>\n<dd><p>Lists a page's H1 to H6, from the body and from Elementor, and edits the text inline. It will not add or remove a heading.<\/p><\/dd>\n<dt id=\"what%20does%20the%20sitemap%20refresh%20button%20do%3F\"><h3>What does the sitemap refresh button do?<\/h3><\/dt>\n<dd><p>Clears the cached sitemap and reads it back the way a crawler would, so the files are rebuilt before a crawler asks.<\/p><\/dd>\n<dt id=\"are%20my%20column%20and%20tool%20choices%20saved%3F\"><h3>Are my column and tool choices saved?<\/h3><\/dt>\n<dd><p>Yes, per browser. Language and the dark theme are stored per person instead.<\/p><\/dd>\n<dt id=\"what%20is%20internal%20linking%2C%20and%20why%20does%20it%20matter%3F\"><h3>What is internal linking, and why does it matter?<\/h3><\/dt>\n<dd><p>A link from one page to another tells a search engine the second exists and what it is about. The usual failure is not too few links, it is links placed once and never updated.<\/p><\/dd>\n<dt id=\"where%20do%20i%20type%20keywords%3F\"><h3>Where do I type keywords?<\/h3><\/dt>\n<dd><p>In the post editor's side box, on a category screen, or in the grid row. One phrase per Enter, up to a hundred per page.<\/p><\/dd>\n<dt id=\"which%20pages%20give%20links%2C%20and%20which%20receive%20them%3F\"><h3>Which pages give links, and which receive them?<\/h3><\/dt>\n<dd><p>Giving: the types you tick, posts and pages by default. Receiving: any published page carrying a keyword, plus custom targets.<\/p><\/dd>\n<dt id=\"will%20the%20linking%20engine%20slow%20my%20site%20down%3F\"><h3>Will the linking engine slow my site down?<\/h3><\/dt>\n<dd><p>No. All the matching happens once, in the admin. The heaviest page on the test site costs about seven milliseconds.<\/p><\/dd>\n<dt id=\"do%20links%20appear%20in%20feeds%2C%20widgets%20or%20content%20loaded%20by%20ajax%3F\"><h3>Do links appear in feeds, widgets or content loaded by AJAX?<\/h3><\/dt>\n<dd><p>No. Main content and category descriptions, in the main loop. Feeds, REST, previews and the Elementor editor are left alone.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20rebuild%20the%20index%20after%20editing%20keywords%3F\"><h3>Do I have to rebuild the index after editing keywords?<\/h3><\/dt>\n<dd><p>Saving a post re-indexes it at once. Bigger changes queue a rebuild you start, and the old index keeps serving until it finishes.<\/p><\/dd>\n<dt id=\"will%20it%20improve%20my%20rankings%3F\"><h3>Will it improve my rankings?<\/h3><\/dt>\n<dd><p>Nobody can promise that and this plugin does not. It makes your linking consistent and shows you the searches Google already ties to each page.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20change%20my%20content%3F\"><h3>Does the plugin change my content?<\/h3><\/dt>\n<dd><p>Not while the engine is live. Links are injected as the page renders, which is why switching the engine off makes them vanish cleanly.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20delete%20the%20plugin%20entirely%3F\"><h3>What happens if I delete the plugin entirely?<\/h3><\/dt>\n<dd><p>Nothing disappears from your pages. Deactivating writes every engine link permanently into your content first, and the uninstaller repeats it as a last defence.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20content%20built%20by%20shortcodes%20or%20a%20page%20builder%3F\"><h3>Does it work with content built by shortcodes or a page builder?<\/h3><\/dt>\n<dd><p>Yes. A shortcode is forbidden ground. On an Elementor page the engine links the rendered content, exactly as visitors see it.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20the%20engine%20linking%20on%20particular%20pages%3F\"><h3>Can I stop the engine linking on particular pages?<\/h3><\/dt>\n<dd><p>A tick in the editor for one, the blacklist screen for a list. Either way the page keeps receiving links and stops giving them out.<\/p><\/dd>\n<dt id=\"can%20i%20control%20how%20many%20links%20appear%3F\"><h3>Can I control how many links appear?<\/h3><\/dt>\n<dd><p>Yes, per page, per target, per paragraph and incoming. All off on a fresh install, because the right number is your content's.<\/p><\/dd>\n<dt id=\"what%20stops%20it%20linking%20a%20phrase%20inside%20a%20heading%20or%20another%20link%3F\"><h3>What stops it linking a phrase inside a heading or another link?<\/h3><\/dt>\n<dd><p>The tokeniser, not a setting. Twenty tag types are excluded before matching starts, so no combination of settings can switch the protection off.<\/p><\/dd>\n<dt id=\"will%20a%20keyword%20match%20inside%20a%20longer%20word%3F\"><h3>Will a keyword match inside a longer word?<\/h3><\/dt>\n<dd><p>No. A word boundary is required on both sides, and the zero width non joiner counts as one.<\/p><\/dd>\n<dt id=\"can%20one%20phrase%20point%20at%20two%20pages%3F\"><h3>Can one phrase point at two pages?<\/h3><\/dt>\n<dd><p>Not at once. The Anchor conflict screen lists every phrase on two targets and lets you pick the right one in place.<\/p><\/dd>\n<dt id=\"in%20what%20order%20are%20keywords%20applied%3F\"><h3>In what order are keywords applied?<\/h3><\/dt>\n<dd><p>Longest first by default, so a long phrase is never split by a short one inside it. Overlapping ranges are always refused.<\/p><\/dd>\n<dt id=\"i%20have%20hand%20written%20internal%20links%20from%20years%20ago.%20what%20happens%20to%20them%3F\"><h3>I have hand written internal links from years ago. What happens to them?<\/h3><\/dt>\n<dd><p>They keep working and they quietly block the engine, so those phrases sit outside every report. The Manual patterns screen finds them and converts them in bulk.<\/p><\/dd>\n<dt id=\"why%20is%20a%20%22read%20more%22%20link%20never%20offered%20as%20a%20pattern%3F\"><h3>Why is a \"read more\" link never offered as a pattern?<\/h3><\/dt>\n<dd><p>Because a call to action is navigation, not content. A stoplist of about 800 Persian, English and Arabic words filters them, and you can edit it.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20a%20bulk%20conversion%2C%20and%20is%20it%20undoable%3F\"><h3>Can I stop a bulk conversion, and is it undoable?<\/h3><\/dt>\n<dd><p>You can stop it and everything converted stays. Each page keeps its original in a backup, but no single click reverses the run, and the confirmation says so.<\/p><\/dd>\n<dt id=\"can%20a%20link%20end%20up%20nested%20inside%20another%20link%3F\"><h3>Can a link end up nested inside another link?<\/h3><\/dt>\n<dd><p>No, and not by a setting. The engine cannot see text inside a link, and a phrase you linked by hand is withdrawn from the whole page.<\/p><\/dd>\n<dt id=\"can%20i%20link%20a%20phrase%20to%20an%20address%20outside%20wordpress%3F\"><h3>Can I link a phrase to an address outside WordPress?<\/h3><\/dt>\n<dd><p>Yes. Give the Custom links screen a title, an address, nofollow and new tab switches and some keywords.<\/p><\/dd>\n<dt id=\"can%20i%20remove%20one%20keyword%20everywhere%20without%20opening%20pages%3F\"><h3>Can I remove one keyword everywhere without opening pages?<\/h3><\/dt>\n<dd><p>Yes. The keyword count on the statistics card opens a drawer with live incoming counts and a cross on each phrase.<\/p><\/dd>\n<dt id=\"i%20have%20hundreds%20of%20posts.%20do%20i%20have%20to%20type%20keywords%20one%20at%20a%20time%3F\"><h3>I have hundreds of posts. Do I have to type keywords one at a time?<\/h3><\/dt>\n<dd><p>Arriving from another linking plugin, the migration wizard copies keywords, blacklists, caps, custom links and settings in one step. Otherwise the grid is the fastest place.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20translation%20plugins%3F\"><h3>Does it work with translation plugins?<\/h3><\/dt>\n<dd><p>The keyword map is global. In practice a Persian keyword only matches Persian text, but a phrase shared between languages would link across them.<\/p><\/dd>\n<dt id=\"will%20my%20links%20disappear%20if%20i%20deactivate%20the%20plugin%3F\"><h3>Will my links disappear if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>No. Deactivation writes every link permanently into your content and reactivation takes them back out. Measured on a real site: 830 links across 227 pages, restored byte for byte.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20pages%20i%20blacklist%3F\"><h3>What happens to pages I blacklist?<\/h3><\/dt>\n<dd><p>They keep receiving links and stop giving them out. The pattern converter and the writing engine both leave their content alone.<\/p><\/dd>\n<dt id=\"can%20i%20see%20what%20it%20would%20do%20before%20it%20does%20anything%3F\"><h3>Can I see what it would do before it does anything?<\/h3><\/dt>\n<dd><p>That is the default. The engine starts in shadow mode: the index is built, every link it would place is counted and listed, and nobody is served one.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20google%20account%20for%20the%20search%20console%20features%3F\"><h3>Do I need a Google account for the Search Console features?<\/h3><\/dt>\n<dd><p>A Google service account of your own, which is free, and the screen walks you through it. No OAuth, no token to refresh, no account of mine in the path.<\/p><\/dd>\n<dt id=\"why%20a%20service%20account%20instead%20of%20signing%20in%20with%20google%3F\"><h3>Why a service account instead of signing in with Google?<\/h3><\/dt>\n<dd><p>Because a sign in flow needs a redirect through somebody's server, and that somebody would be me. This keeps the credential on your own site.<\/p><\/dd>\n<dt id=\"how%20long%20does%20the%20first%20sync%20take%2C%20and%20do%20i%20have%20to%20keep%20the%20page%20open%3F\"><h3>How long does the first sync take, and do I have to keep the page open?<\/h3><\/dt>\n<dd><p>The first sync walks back through your history while the tab is open, so leave it open until the tiles stop saying not complete. After that a daily run tops up by itself.<\/p><\/dd>\n<dt id=\"what%20is%20an%20orphan%20url%20on%20the%20sync%20tiles%3F\"><h3>What is an orphan URL on the sync tiles?<\/h3><\/dt>\n<dd><p>An address Google reported that matches no page of yours. Its data is kept, but there is nothing to write for.<\/p><\/dd>\n<dt id=\"what%20is%20the%20yellow%20state%20in%20keyword%20coverage%3F\"><h3>What is the yellow state in keyword coverage?<\/h3><\/dt>\n<dd><p>Green means the phrase is on the page word for word. Red means a word is missing. Yellow means every word is there but never together, usually the cheapest win on the page.<\/p><\/dd>\n<dt id=\"what%20is%20opportunity%3F\"><h3>What is opportunity?<\/h3><\/dt>\n<dd><p>The number the queue is ranked by. A red query is worth its impressions, a yellow one half, a green one nothing.<\/p><\/dd>\n<dt id=\"how%20does%20it%20decide%20which%20page%20a%20search%20belongs%20to%3F\"><h3>How does it decide which page a search belongs to?<\/h3><\/dt>\n<dd><p>Three signals, each printed beside the score: rarity weighted overlap with the title and headings, your page's share of the site's impressions for that query, and whether the rarest word is in the title.<\/p><\/dd>\n<dt id=\"what%20is%20the%20share%20signal%2C%20and%20why%20does%20it%20matter%20so%20much%3F\"><h3>What is the share signal, and why does it matter so much?<\/h3><\/dt>\n<dd><p>Share is what Google already decided, so it is worth almost half the score, more than any wording heuristic of mine deserves. Every part is shown, so you set your threshold by looking.<\/p><\/dd>\n<dt id=\"what%20is%20a%20mismatch%2C%20and%20what%20is%20a%20gap%3F\"><h3>What is a mismatch, and what is a gap?<\/h3><\/dt>\n<dd><p>A mismatch is Google showing page A for a search that belongs to page B, so you route it rather than write it. A gap is a search nobody ranks for: a page that does not exist yet.<\/p><\/dd>\n<dt id=\"what%20does%20routing%20a%20phrase%20actually%20change%3F\"><h3>What does routing a phrase actually change?<\/h3><\/dt>\n<dd><p>It adds the phrase to that page's linking keywords, and the writing engine then treats that page as its owner. One decision, two modules.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20press%20new%20draft%20on%20a%20gap%3F\"><h3>What happens when I press New draft on a gap?<\/h3><\/dt>\n<dd><p>A draft is created, titled with the search, and the phrase is routed to it. Nothing is ever published by the plugin.<\/p><\/dd>\n<dt id=\"can%20it%20ask%20google%20to%20index%20a%20page%3F\"><h3>Can it ask Google to index a page?<\/h3><\/dt>\n<dd><p>No, and any plugin that says it can is describing something else. This asks the opposite question, what Google decided about each URL, which is the more useful half.<\/p><\/dd>\n<dt id=\"why%20does%20an%20index%20check%20take%20so%20long%2C%20and%20why%20must%20the%20page%20stay%20open%3F\"><h3>Why does an index check take so long, and why must the page stay open?<\/h3><\/dt>\n<dd><p>Each call to Google takes about twelve seconds. The screen runs three lanes while it is open and estimates from your own host. Closed, the daily run continues at twenty pages a day.<\/p><\/dd>\n<dt id=\"which%20pages%20are%20checked%20automatically%2C%20and%20why%20are%20my%20categories%20never%20checked%3F\"><h3>Which pages are checked automatically, and why are my categories never checked?<\/h3><\/dt>\n<dd><p>Twenty posts a day: those due a first check, then the ones Google declined, then the never checked. Term archives change too rarely to spend quota on.<\/p><\/dd>\n<dt id=\"does%20a%20failed%20index%20check%20count%20against%20the%20quota%3F\"><h3>Does a failed index check count against the quota?<\/h3><\/dt>\n<dd><p>Yes, because Google counted it. The plugin caps itself at 1,000 a day against Google's 2,000.<\/p><\/dd>\n<dt id=\"what%20is%20mismatched%20canonical%20on%20the%20index%20status%20screen%3F\"><h3>What is Mismatched canonical on the index status screen?<\/h3><\/dt>\n<dd><p>A page where Google picked a different canonical from the one you declare. Both are shown, because it means Google is indexing a URL you did not intend.<\/p><\/dd>\n<dt id=\"my%20index%20status%20said%20every%20page%20was%20unknown%20to%20google.%20why%3F\"><h3>My index status said every page was unknown to Google. Why?<\/h3><\/dt>\n<dd><p>A real bug, now fixed, that bites any non Latin site: WordPress builds percent escapes in lower case and Google matches them in upper case.<\/p><\/dd>\n<dt id=\"can%20the%20writing%20engine%20damage%20my%20content%3F\"><h3>Can the writing engine damage my content?<\/h3><\/dt>\n<dd><p>The guardrails sit on your site. Only types you ticked, never a blacklisted or frozen page, caps per week and per ninety days, no growth past 20 percent, no links or images, and a full snapshot behind every edit.<\/p><\/dd>\n<dt id=\"where%20does%20the%20new%20text%20go%3F\"><h3>Where does the new text go?<\/h3><\/dt>\n<dd><p>After the heading whose words best match the query; at the end when none matches; never inside a list or a shortcode. A marker records what the engine wrote.<\/p><\/dd>\n<dt id=\"if%20i%20undo%20an%20edit%2C%20do%20i%20lose%20changes%20i%20made%20to%20the%20page%20afterwards%3F\"><h3>If I undo an edit, do I lose changes I made to the page afterwards?<\/h3><\/dt>\n<dd><p>Yes. Undo restores the whole snapshot, which is what makes it exact. Undo the newest edit first.<\/p><\/dd>\n<dt id=\"how%20can%20it%20rewrite%20a%20paragraph%20without%20wrecking%20the%20page%3F\"><h3>How can it rewrite a paragraph without wrecking the page?<\/h3><\/dt>\n<dd><p>By address, not instruction. The writer gets specific paragraphs with a hash of each, and may only replace a hash it was given. If the page changed meanwhile the edit is refused, not misapplied.<\/p><\/dd>\n<dt id=\"does%20the%20title%20and%20description%20button%20need%20rank%20math%3F\"><h3>Does the title and description button need Rank Math?<\/h3><\/dt>\n<dd><p>It writes Rank Math's two fields, capped at 55 and 155 characters, keeping the previous pair for undo. Without it they are written and nothing prints them.<\/p><\/dd>\n<dt id=\"why%20does%20it%20refuse%20to%20write%20a%20phrase%20that%20would%20help%20the%20page%3F\"><h3>Why does it refuse to write a phrase that would help the page?<\/h3><\/dt>\n<dd><p>Because it belongs to another of your pages, and writing it here would set two of your own pages against each other in one result. The skip is counted by name.<\/p><\/dd>\n<dt id=\"my%20page%20was%20skipped.%20what%20do%20the%20reasons%20mean%3F\"><h3>My page was skipped. What do the reasons mean?<\/h3><\/dt>\n<dd><p>Every skip is counted with its cause: blacklisted, frozen, unpublished, an unticked type, a cap reached, no long enough paragraph, or a query owned elsewhere.<\/p><\/dd>\n<dt id=\"what%20is%20the%20control%20group%20for%3F\"><h3>What is the control group for?<\/h3><\/dt>\n<dd><p>Telling a real improvement from a good season. A share of every queue is held out, so what happens to those pages is what would have happened anyway. Subtract it and what remains is what you caused.<\/p><\/dd>\n<dt id=\"what%20is%20the%20freezer%3F\"><h3>What is the freezer?<\/h3><\/dt>\n<dd><p>A page that falls by a quarter after an edit, over at least seven days, leaves the queue. The answer to a bad outcome is to stop touching that page, not to write more.<\/p><\/dd>\n<dt id=\"why%20does%20the%20effect%20report%20say%20waiting%20instead%20of%20giving%20me%20a%20number%3F\"><h3>Why does the effect report say waiting instead of giving me a number?<\/h3><\/dt>\n<dd><p>Because the window is under seven days, and a number from four days is a coin toss dressed as a result.<\/p><\/dd>\n<dt id=\"what%20does%20the%20site%20wide%20warning%20threshold%20do%3F\"><h3>What does the site wide warning threshold do?<\/h3><\/dt>\n<dd><p>It warns when the whole property has dropped past that percentage over four weeks. It does not stop the engine, it tells you to look first.<\/p><\/dd>\n<dt id=\"when%20does%20the%20daily%20run%20happen%3F\"><h3>When does the daily run happen?<\/h3><\/dt>\n<dd><p>Once a day, at the hour the key was first saved. It rides on WP-Cron, so a real cron job calling <code>wp-cron.php<\/code> makes it exact.<\/p><\/dd>\n<dt id=\"do%20i%20need%20an%20ai%20provider%3F\"><h3>Do I need an AI provider?<\/h3><\/dt>\n<dd><p>No. It ships with no endpoint, no key and no default provider, and with the fields blank no request is ever made.<\/p><\/dd>\n<dt id=\"which%20ai%20providers%20are%20supported%3F\"><h3>Which AI providers are supported?<\/h3><\/dt>\n<dd><p>Anything speaking the OpenAI chat completions shape: base URL, key, model name, and a Test button. Where the first party APIs are unreachable, you point it at a gateway you can actually use.<\/p><\/dd>\n<dt id=\"where%20is%20my%20ai%20key%20stored%3F\"><h3>Where is my AI key stored?<\/h3><\/dt>\n<dd><p>In the plugin's settings option, as typed. Treat it as you treat any key in a WordPress option: a database backup contains it.<\/p><\/dd>\n<dt id=\"which%20php%20extensions%20does%20search%20console%20need%3F\"><h3>Which PHP extensions does Search Console need?<\/h3><\/dt>\n<dd><p>OpenSSL and multibyte string support. The XLSX export needs ZipArchive.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20keep%20the%20browser%20tab%20open%20while%20link%20nurse%20scans%3F\"><h3>Do I have to keep the browser tab open while Link Nurse scans?<\/h3><\/dt>\n<dd><p>Yes, on purpose. A scan makes requests to other people's sites, and that should happen while someone is watching.<\/p><\/dd>\n<dt id=\"i%20pressed%20stop%2C%20then%20scan.%20why%20did%20it%20start%20from%20zero%3F\"><h3>I pressed Stop, then Scan. Why did it start from zero?<\/h3><\/dt>\n<dd><p>Because Scan always begins a fresh scan and clears the previous results. Stop leaves what it found on screen.<\/p><\/dd>\n<dt id=\"which%20links%20does%20link%20nurse%20deliberately%20never%20list%3F\"><h3>Which links does Link Nurse deliberately never list?<\/h3><\/dt>\n<dd><p>Links that do something rather than go somewhere: cart, login, logout, anything carrying a nonce. Share buttons. Feeds, REST, admin URLs, assets, previews, and your excluded domains.<\/p><\/dd>\n<dt id=\"why%20does%20link%20nurse%20report%20a%20link%20my%20browser%20opens%20fine%3F\"><h3>Why does Link Nurse report a link my browser opens fine?<\/h3><\/dt>\n<dd><p>Usually because the far end blocks robots. A 401, 403, 404 or 429 is checked again with a browser user agent first, and only 404 and 410 count as broken by default.<\/p><\/dd>\n<dt id=\"why%20is%20a%20link%20with%20an%20expired%20certificate%20not%20reported%20as%20broken%3F\"><h3>Why is a link with an expired certificate not reported as broken?<\/h3><\/dt>\n<dd><p>Because the check asks for a status code, and a certificate error would hide that answer behind a different problem.<\/p><\/dd>\n<dt id=\"what%20do%20the%20sites%20i%20link%20to%20see%3F\"><h3>What do the sites I link to see?<\/h3><\/dt>\n<dd><p>One HEAD request, then a GET if HEAD is refused, from a user agent naming this plugin and your site. Nothing about your visitors.<\/p><\/dd>\n<dt id=\"my%20internal%20links%20are%20written%20as%20%2Fpage-name%2F%20rather%20than%20full%20urls.%20are%20they%20checked%3F\"><h3>My internal links are written as \/page-name\/ rather than full URLs. Are they checked?<\/h3><\/dt>\n<dd><p>Yes, resolved against the page they sit on. This is where most scanners lose links: on the test site, 332 of 1,373, invisible on every scan until it was fixed.<\/p><\/dd>\n<dt id=\"why%20is%20a%20redirect%20shown%20as%20manual%20instead%20of%20being%20fixed%3F\"><h3>Why is a redirect shown as Manual instead of being fixed?<\/h3><\/dt>\n<dd><p>Because reporting a redirect and rewriting it are two different permissions, and only the second is optional. It is also Manual when the destination could not be established.<\/p><\/dd>\n<dt id=\"what%20does%20ignored%20mean%3F\"><h3>What does Ignored mean?<\/h3><\/dt>\n<dd><p>A bare domain redirecting to its own home page. Rewriting it would change nothing a reader notices, so it is listed and left alone.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20an%20elementor%20button%20whose%20domain%20i%20blacklisted%3F\"><h3>What happens to an Elementor button whose domain I blacklisted?<\/h3><\/dt>\n<dd><p>The URL goes and the button and its text stay, because restructuring Elementor's data to remove a widget is how pages break.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20a%20repair%3F\"><h3>Can I undo a repair?<\/h3><\/dt>\n<dd><p>Yes. The original of each field is copied aside before the first repair to it, and Undo restores that whole field. The backups survive a new scan.<\/p><\/dd>\n<dt id=\"why%20does%20link%20nurse%20only%20report%20a%20link%20if%20it%20appears%20on%20the%20rendered%20page%3F\"><h3>Why does Link Nurse only report a link if it appears on the rendered page?<\/h3><\/dt>\n<dd><p>Because a link no visitor ever receives is not worth your attention, and Elementor sites are full of them. If the page cannot be fetched, the finding is kept anyway.<\/p><\/dd>\n<dt id=\"where%20is%20the%20xlsx%20report%20saved%2C%20and%20who%20can%20download%20it%3F\"><h3>Where is the XLSX report saved, and who can download it?<\/h3><\/dt>\n<dd><p>In your uploads folder, under a name with a random suffix, keeping the five newest. Whoever has the exact link can open it, which is why it is not guessable.<\/p><\/dd>\n<dt id=\"does%20the%20analytics%20module%20set%20a%20cookie%3F\"><h3>Does the analytics module set a cookie?<\/h3><\/dt>\n<dd><p>One, a random session id for 30 days, set in the browser. PHP never sets it, because a Set-Cookie header on every page would make your whole site uncacheable.<\/p><\/dd>\n<dt id=\"does%20analytics%20store%20ip%20addresses%3F\"><h3>Does analytics store IP addresses?<\/h3><\/dt>\n<dd><p>Truncated by default, the last octet of IPv4 and the last 80 bits of IPv6 dropped. Behind a proxy, switch on Trust proxy headers or every visitor shares one address.<\/p><\/dd>\n<dt id=\"does%20analytics%20record%20who%20a%20logged%20in%20visitor%20is%3F\"><h3>Does analytics record who a logged in visitor is?<\/h3><\/dt>\n<dd><p>The user id and display name. Administrators are not tracked at all by default, and the untracked roles are a setting.<\/p><\/dd>\n<dt id=\"does%20it%20honour%20do%20not%20track%3F\"><h3>Does it honour Do Not Track?<\/h3><\/dt>\n<dd><p>No. Nothing is sent anywhere and no advertiser is involved, but the browser signal is not read, and I would rather say so.<\/p><\/dd>\n<dt id=\"does%20the%20tracking%20still%20work%20behind%20a%20full%20page%20cache%3F\"><h3>Does the tracking still work behind a full page cache?<\/h3><\/dt>\n<dd><p>Yes, and that is why it is a REST endpoint. A nonce baked into cached HTML dies within a day and takes the tracking with it, silently.<\/p><\/dd>\n<dt id=\"what%20counts%20as%20an%20engaged%20visit%2C%20and%20how%20is%20the%20bounce%20rate%20calculated%3F\"><h3>What counts as an engaged visit, and how is the bounce rate calculated?<\/h3><\/dt>\n<dd><p>Seconds count only while the tab is visible and the visitor is active. A visit is engaged with two page views or ten engaged seconds. Bounce is a hundred minus that.<\/p><\/dd>\n<dt id=\"how%20do%20i%20track%20a%20click%20on%20one%20specific%20button%3F\"><h3>How do I track a click on one specific button?<\/h3><\/dt>\n<dd><p>Three ways: a data attribute on the element, a CSS selector on the Events screen, or a call to <code>window.megopTrack()<\/code>.<\/p><\/dd>\n<dt id=\"why%20do%20today%27s%20numbers%20differ%20from%20what%20the%20chart%20showed%20yesterday%3F\"><h3>Why do today's numbers differ from what the chart showed yesterday?<\/h3><\/dt>\n<dd><p>The charts read daily totals, rebuilt for the last three days each night, while today is computed live. A day settles once the rollup passes over it.<\/p><\/dd>\n<dt id=\"can%20i%20export%20the%20analytics%3F\"><h3>Can I export the analytics?<\/h3><\/dt>\n<dd><p>Three CSV files for the range you are viewing, with a byte order mark so Excel opens Persian text. IP addresses and user agents are left out.<\/p><\/dd>\n<dt id=\"does%20it%20send%20my%20content%20or%20my%20visitors%20anywhere%3F\"><h3>Does it send my content or my visitors anywhere?<\/h3><\/dt>\n<dd><p>No. Analytics never leaves your database. Search Console talks to Google only after you upload a key. There is no telemetry of any kind.<\/p><\/dd>\n<dt id=\"why%20is%20date%20handling%20mentioned%20so%20often%3F\"><h3>Why is date handling mentioned so often?<\/h3><\/dt>\n<dd><p>Because it broke this plugin once, on a real site: with a Jalali calendar installed, a Persian date reaching SQL silently matches nothing, and every card read zero on 66,000 visits.<\/p><\/dd>\n<dt id=\"what%20does%20the%20plugin%20leave%20behind%20when%20i%20remove%20it%3F\"><h3>What does the plugin leave behind when I remove it?<\/h3><\/dt>\n<dd><p>Everything, by default, so a reinstall finds your work where it was. One switch removes it all instead. The backups that make a permanent link write reversible are never removed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>8.3.0<\/h4>\n\n<ul>\n<li>The whole codebase was read once more, file by file, against this readme, and four claims the page made were not true of the code. All four are fixed in this build.<\/li>\n<li>Fixed: prices typed in the bulk grid were never saved. The fields were drawn, the server was ready for them and the empty field rule was written and tested, but the browser sent only the title, the SEO fields and the body. A price now goes to the server only when you changed it, so a title edit never touches a catalogue, an empty field is left alone for every product kind, a variable product's value is written to all of its variations, and the row confirms what was written.<\/li>\n<li>Fixed: the Undo button on a Search Console title or description edit answered \"No backup was found\" for every one of them, because a meta edit keeps its backup under a different key from a content edit and the button only knew the content key. Undo now reaches both.<\/li>\n<li>Fixed: the control group was never actually drawn. Setting a percentage stored the number and the holdout was only ever formed by an operation no button called, so the effect report read \"Control group (0)\" whatever you set. The holdout is drawn every time the queue is built.<\/li>\n<li>Fixed: switching the linking module off made the settings screen fail to render, and because the endpoint that switches modules on lived inside that module, the module could not be switched back on from the screen. The switches and their endpoint belong to the plugin shell now, and the linking settings simply hide while the module is off.<\/li>\n<li>Fixed: every save from the bulk grid stripped backslashes from the title, the SEO fields and the body, because the values were unslashed once at the request boundary and once more by WordPress on the way in.<\/li>\n<li>Fixed: a Rank Math variable such as <code>%date%<\/code> or <code>%category%<\/code> typed into the grid was corrupted on save. WordPress's standard sanitiser removes any <code>%<\/code> followed by two hexadecimal characters, so <code>%date%<\/code> came back as <code>te%<\/code>. The two Rank Math fields are cleaned without touching percent signs now.<\/li>\n<li>Fixed: the whole body of a post was passed through the content filter on every grid save, even for an administrator, so an iframe or a form embedded in a page vanished when its H1 was edited. The body is filtered exactly as the block editor would filter it for the user saving it.<\/li>\n<li>The plugin wide delete on uninstall switch exists now, on the settings screen under the module switches, off by default. Before this build the option was read by the uninstaller and set by nothing. When on, every table this plugin created is dropped, including the eleven Search Console and analytics tables the old uninstaller left behind, and the analytics form's own switch removes only that module's tables.<\/li>\n<li>Fixed: the uninstaller's last chance write of the links died on a missing class when it was needed, because two of the files it depends on were never loaded there.<\/li>\n<li>The migration wizard now copies category keywords and custom links as well as post keywords; both routines existed and neither was called.<\/li>\n<li>Fixed: keeping a category archive as the right target on the anchor conflict screen stripped the phrase from that archive instead, because a term reference is negative and the handler dropped the sign.<\/li>\n<li>Fixed: a purely numeric keyword such as 1405 lost its phrase when the post and term keyword maps were merged, because PHP renumbers integer keys on merge.<\/li>\n<li>Fixed: the keyword chips on the Custom links screen had no handler, so a keyword could not be typed for a custom link.<\/li>\n<li>Fixed: on the Add category screen, the keyword chips of the term just added survived the form reset, so the next term silently inherited them.<\/li>\n<li>Fixed: removing several anchors at once from the anchor statistics table threw before the confirmation appeared.<\/li>\n<li>Fixed: a per page outgoing cap set in the editor's side box was ignored unless the site wide cap was also on.<\/li>\n<li>Fixed: while another index build held the lock, the screen re-requested the batch in a tight loop; it waits five seconds now.<\/li>\n<li>Fixed: the two step confirmation on Delete permanently for a term was skipped, because the post handler armed the button first.<\/li>\n<li>Fixed: the success message after a delete with redirect printed the status code where the count belongs, so it read 5 rows moved to trash and 301 redirects recorded.<\/li>\n<li>Fixed: the character counter added two spaces around <code>%sep%<\/code>, so the usual template counted two characters long.<\/li>\n<li>The Minimum impressions setting in Search Console now does what its label says: a query below it is never written for. Before this build only the gaps screen read it.<\/li>\n<li>The \"Correct Arabic yeh and kaf\" setting in Search Console is applied to the text the engine writes, in sections, rewrites, titles and drafts. Before this build nothing read it.<\/li>\n<li>Two switches that no code read are gone from the linking settings, Respect existing links and Link each phrase once per page, and the screen says instead that both rules are always on, which they always were.<\/li>\n<li>A dead Links button and its toggle are gone from the grid; the linking panel that does that job is the Show automatic linking toggle. The open page button is labelled View rather than Impressions. The headings tool's description says H1 to H6, which is what it edits. The Link Nurse self test tooltip says 24 tests, which is how many there are. Several settings hints and tour steps in Search Console now describe what the code does rather than what an earlier design intended.<\/li>\n<li>The delete with redirect success message and the price note carry new text, and every new or changed string is translated into Persian and Arabic.<\/li>\n<li>Every table and column name that reaches a query comes from one small class, <code>Megop_SEO_Db<\/code>, which builds the name itself from a literal list and hands back an empty string for anything it does not recognise. The three table helpers in the linking, Search Console and analytics modules all delegate to it, and the CSV exporter's column list and date column pass through the same check before they are used.<\/li>\n<li>Fixed a query shape that was safe and indefensible at the same time. The index status screen built a WHERE clause with <code>$wpdb-&gt;prepare()<\/code> and then concatenated that prepared fragment into a string handed straight to <code>get_results()<\/code>. Each of the five cases is a whole statement now, prepared once, with its own bound values and a bound limit.<\/li>\n<li>The <code>phpcs:ignore<\/code> reasons are rewritten. There were 136 copies of one 300 character paragraph explaining why an interpolated table name was safe. That explanation lives in <code>Megop_SEO_Db<\/code> now, and each suppression carries one short reason that is true of the line it sits on. Plugin Check reports no errors and no warnings.<\/li>\n<li>The donate link is removed. It pointed at the site's front page rather than at a donation page.<\/li>\n<li>This readme was rewritten from that reading of the code. Every capability described on this page was checked against the file that implements it, and several claims that were more than the code did have been cut or corrected.<\/li>\n<\/ul>\n\n<h4>8.0.2<\/h4>\n\n<ul>\n<li>Fixed, and this is the one that made the scanner look like it was working: Link Nurse could only see links written as full URLs. The extractor collected every href and src on the page and then discarded anything that did not begin with http, one line later. A link written as <code>\/product\/name\/<\/code>, the form the editor produces when you pick a page from the link dialog, was gathered, thrown away, and never checked. On the site this plugin is developed against, 332 of the 1,373 links in published content were stored that way, across 188 of its 364 items: a quarter of every link and half of every page, invisible on every scan since the module was written. Ten of them were internal 301s that a crawler had listed and Link Nurse never had. Relative links are now resolved against the page they sit on, exactly as a browser resolves them, and checked like every other link.<\/li>\n<li>A repair now rewrites the link in the form the author wrote it. Both forms are kept for each finding: the absolute one, because that is what a status code belongs to, and the stored one, because that is what has to be found and replaced in the content. A redirect fixed on a site-relative link stays site-relative afterwards, because absolute against relative is a house style and a repair has no business changing it.<\/li>\n<li>Fragments (<code>#section<\/code>) and non-http targets (<code>mailto:<\/code>, <code>tel:<\/code>, <code>javascript:<\/code>) are recognised and skipped instead of being swept up. Protocol-relative links (<code>\/\/example.com\/x<\/code>) are resolved and checked.<\/li>\n<li>Fixed: the XLSX export always ended on a 404. The report was written into <code>uploads\/megop-seo\/<\/code> while the browser was sent to <code>uploads\/megop-link-nurse\/<\/code>, one folder apart, with the file correct on disk the whole time. Both sides read one constant now, and if the file is genuinely missing the screen says so instead of navigating away from the results.<\/li>\n<li>Report filenames carry a random suffix. A report holds the site's own link data, and a timestamp-only name in a public uploads folder is guessable.<\/li>\n<\/ul>\n\n<h4>8.0.1<\/h4>\n\n<ul>\n<li>Fixed, and this is the one worth reading: Link Nurse could not see a single redirected link. Redirect handling sat behind a setting whose own label reads \"Rewrite 301\/302 to final 200 destination\", a repair switch that had been wired as a detection gate. With it off, the scanner never resolved where a 301 went, the classifier had no destination to judge, and every redirected link on the site was recorded as healthy. A crawl of one real site listed twenty internal 301s inside published posts that Link Nurse had passed over on every previous scan. Detection now always runs, and the setting decides only whether the link is rewritten for you. A redirect found while rewriting is off is listed as Manual, with its destination and a note naming the checkbox that unlocks it.<\/li>\n<li>Fixed: a redirect that lands on an error page was reported as healthy. The old branch would only speak if the chain ended in 200, so a 301 into a deleted product, the exact shape WooCommerce leaves behind, fell through as though nothing were wrong. It is reported as broken now, with both codes, for example HTTP 301 to 404.<\/li>\n<li>Fixed: a redirect whose destination could not be established, whether a chain still redirecting after ten hops, a loop, or a follow request that failed, was treated as fine, and one fallback path assigned a 200 to a destination it had never reached. Those are reported as Manual with the reason stated, and no link is ever rewritten to a target the plugin did not verify.<\/li>\n<li>The results table shows the destination on every row that has one, not only on rows the plugin intends to rewrite.<\/li>\n<li>A finding is no longer dropped because the theme prints the link in a different form. Front-page verification now also matches on path and query, so a link rendered with a different scheme, without www., protocol-relative, or as a host-relative href is still recognised.<\/li>\n<li>Link Nurse's heading no longer carries a version number of its own. The unified header was still appending it; only the standalone fallback header had been corrected in 8.0.0.<\/li>\n<\/ul>\n\n<h4>8.0.0<\/h4>\n\n<ul>\n<li>Fixed, and this is the one that mattered: the Link Nurse settings form never saved anything. Two separate faults, one on each side. In the browser, the whole settings object was handed to URLSearchParams, which stringified it, so PHP received the literal text \"[object Object]\" where it expected an array, fell back to defaults for every key and answered \"Settings saved\", which was true of nothing. And the module enqueued its own JavaScript with a frozen version constant instead of the file's modification time, so the corrected file sat on the server while every browser kept running the copy it had cached months earlier. The first fault made saving impossible; the second made fixing it invisible. Both are gone.<\/li>\n<li>Saving settings now says so. A green tick on success, a red line with the reason on failure, and the form is repainted from what the server actually stored rather than from what was typed, so if a value was clamped the field shows the stored one and the confirmation is telling the truth.<\/li>\n<li>Link Nurse can refresh the sitemap, and then follow it. Clearing a sitemap cache tells you nothing on its own, so the button does the second half too: every address the rebuilt sitemap lists is fetched with Link Nurse's own checker, and anything that does not answer 200 is reported. This reaches a class of problem no content scan can find: a URL listed for search engines but linked from nowhere on the site, such as a category whose last post was deleted. On one real site it found nine dead category URLs and twenty-one redirects the first time it ran. On by default, switchable in the scan settings.<\/li>\n<li>Fixed: opening the Link Nurse settings panel pushed the progress bar and every counter a screenful down the page, exactly while a scan was running and they were the thing worth watching. The progress bar sits above the panel now.<\/li>\n<li>Link Nurse no longer prints a version number of its own in its heading. It was a plugin once and it is a module now; the only version that means anything is the plugin's.<\/li>\n<li>Persian and Arabic catalogues cover the new strings, so the sitemap screens read in the site's language from the first run rather than after the next translation round.<\/li>\n<li>Deactivating the previous internal-linking plugin, offered at the end of the migration, now requires the capability to manage plugins. It was reachable by anyone the keyword-editor setting allowed, which an administrator can widen to author level, correct for editing keywords and far too wide for switching a plugin off.<\/li>\n<li>The bulk duplicator's find-and-replace pairs are sanitised before they reach a post title or body.<\/li>\n<li>Every remaining inline script tag is printed through WordPress rather than echoed by hand, including the tour's JSON data block, so nothing that filters, defers or adds a nonce to script output is bypassed.<\/li>\n<li>The uninstaller now also removes Link Nurse's own options. Its prefix differs from the plugin's by one letter, so the existing sweep never reached them.<\/li>\n<li>The plugin page has been rewritten with a full FAQ covering internal linking, bulk editing, broken links and the sitemap check.<\/li>\n<\/ul>\n\n<h4>7.5.0<\/h4>\n\n<ul>\n<li>New: Link Nurse can refresh the sitemap, and then follow it. Clearing a sitemap cache tells you nothing on its own, so the button does the second half too: every address the rebuilt sitemap lists is fetched with Link Nurse's own checker, and anything that does not answer 200 is reported. This reaches a class of problem no content scan can find: a URL that is listed for search engines but linked from nowhere on the site, such as a category whose last post was deleted. On one real site this found nine dead category URLs and twenty-one redirects that every previous scan had passed over. It is on by default and can be switched off in the scan settings.<\/li>\n<li>Fixed: Link Nurse settings were never saved. The browser sent the whole settings object as one form value, so PHP received the text \"[object Object]\" where it expected an array, fell back to the defaults for every key, and answered \"Settings saved\", which was true of nothing. Values are now sent in PHP's own bracket notation and arrive as the array the sanitiser expects.<\/li>\n<li>Fixed: opening the Link Nurse settings panel pushed the progress bar and every counter a screenful down the page, exactly while a scan was running and they were the thing worth watching. The progress bar sits above the panel now.<\/li>\n<li>Deactivating the previous internal-linking plugin, offered at the end of the migration, now requires the capability to manage plugins. It was reachable by anyone the keyword-editor setting allowed, which can be widened to author level, correct for editing keywords and far too wide for switching a plugin off.<\/li>\n<li>The bulk duplicator's find-and-replace pairs are sanitised before they reach a post title or body.<\/li>\n<li>Two remaining inline script tags are printed through WordPress instead of being echoed by hand, so anything that filters or defers script output can see them.<\/li>\n<li>The uninstaller now also removes Link Nurse's own options. Its prefix differs from the plugin's by one letter, so the existing sweep never reached them.<\/li>\n<\/ul>\n\n<h4>7.4.3<\/h4>\n\n<ul>\n<li>Fixed: a fatal \"cannot redeclare\" error on the automatic-linking screen. The link statistics template declared a helper function at file level, and PHP registers a function declared in an included file globally even when the include runs inside a method, so any request that rendered that template twice stopped the whole screen. The helper is a static method on the report class now, templates declare no functions at all, and the sort links lost a double escaping along the way: the URL is built once and escaped at the point of output.<\/li>\n<\/ul>\n\n<h4>7.4.2<\/h4>\n\n<ul>\n<li>New: a Refresh sitemap button on the bulk manager header. Publishing a post clears the sitemap cache on its own; bulk work does not, and the bulk editor is exactly where a hundred rows change without anyone pressing Publish. The button clears whatever the active generator caches, whether Rank Math, Yoast SEO or All in One SEO, and then reads the sitemap back over HTTP the way a crawler would, the index and every child file, so they are already rebuilt before a crawler asks for them. It reports how many sitemaps were rebuilt and how many URLs they list. It can be switched off under Settings, and it is hidden on a site with no sitemap at all.<\/li>\n<li>Dark mode is a saved preference now, and it is offered only where it is real. It used to live in the address bar, so it lasted exactly one click: opening the next module dropped the parameter and the screen snapped back to light. It is stored per person now and it stays. The toggle is printed on the bulk manager alone, because the analytics and broken-link modules declare their palettes on :root, where no wrapper class can reach them, and a switch that darkens the frame while every card inside stays white is worse than no switch at all. Those two modules need a stylesheet rewrite of their own, and that is its own release.<\/li>\n<li>The header no longer turns round when you change language. Direction is taken from the dashboard, so reading these screens in English on a Persian site translates the words and leaves the logo and the controls exactly where they were.<\/li>\n<li>The settings screen carried a second row of tabs above the form. The Internal Analytics settings are shown underneath the linking settings now, on the one page, with one navigation instead of two.<\/li>\n<li>The plugin page now describes all five modules in full, states plainly which parts use Rank Math's fields and which do not, and names the author. Documentation only, and no code changed.<\/li>\n<\/ul>\n\n<h4>7.4.1<\/h4>\n\n<ul>\n<li>Fixed: Link Nurse and Internal Analytics both registered their admin page under the same slug. WordPress runs every callback registered on a slug, so opening Internal Analytics also printed the whole Link Nurse screen above it. Link Nurse has its own slug now, and each screen prints only its own content.<\/li>\n<li>Plugin Check reports nothing at all, no errors and no warnings. Input from the bulk editor, the keyword fields and the Search Console screens is unslashed and sanitized at the point it is read, and every remaining notice is a direct query against one of this plugin's own tables that now carries a written reason a reviewer can check line by line.<\/li>\n<li>load_plugin_textdomain() is gone. WordPress has loaded the catalogue by itself since 4.6, and the per-user language switch is unaffected.<\/li>\n<\/ul>\n\n<h4>7.4.0<\/h4>\n\n<ul>\n<li>Every string with a placeholder now carries a translators comment, so a translator can see what each one refers to before guessing.<\/li>\n<li>One message had its placeholders in a fixed order, which meant a translation that reordered them would swap the two numbers. Both are now positional.<\/li>\n<li>Output escaping reviewed at every point of output; inline scripts now go through wp_print_inline_script_tag().<\/li>\n<li>unlink(), is_writable() and parse_url() replaced with their WordPress equivalents.<\/li>\n<\/ul>\n\n<h4>7.3.0<\/h4>\n\n<ul>\n<li>Every screen can now be read in English, Persian or Arabic, and each person chooses for themselves, because the choice is stored per user and applies only to this plugin.<\/li>\n<li>The JavaScript is translated too. Confirmations, live counters and inline messages follow the same choice as the rest of the screen.<\/li>\n<li>The Link Nurse module folded into the plugin's own text domain.<\/li>\n<li>The Analytics module is translatable for the first time; its screens were hard-coded in Persian.<\/li>\n<li>Catalogues rebuilt with the standard WordPress tooling, complete in Persian and Arabic.<\/li>\n<\/ul>\n\n<h4>7.2.0<\/h4>\n\n<ul>\n<li>Index status: ask Google what it knows about each page, grouped by reason.<\/li>\n<li>A guided tour on every Search Console screen, switchable off per user.<\/li>\n<li>Every stylesheet rule now lives in one enqueued file.<\/li>\n<\/ul>\n\n<h4>7.1.0<\/h4>\n\n<ul>\n<li>Search Console module: per-page keyword coverage, query-level effect measurement, control group and automatic freezing of pages that fall after an edit.<\/li>\n<li>Persian and Arabic-Indic digits are now folded during matching. On a mixed-script site this alone corrected about a third of the coverage verdicts.<\/li>\n<li>WooCommerce price is editable in the bulk manager, including variable products.<\/li>\n<li>Blacklists and whitelists are no longer cleared when settings are saved from an unrelated screen.<\/li>\n<\/ul>","raw_excerpt":"Bulk edit every post type and taxonomy in one grid, prices included. Persian-aware internal linking, broken-link repair, Search Console.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/358621","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=358621"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hamuo1372"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=358621"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=358621"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=358621"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=358621"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=358621"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=358621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}