{"id":372003,"date":"2026-10-04T10:17:48","date_gmt":"2026-10-04T10:17:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/solseo\/"},"modified":"2026-10-04T10:17:24","modified_gmt":"2026-10-04T10:17:24","slug":"solseo","status":"publish","type":"plugin","link":"https:\/\/as.wordpress.org\/plugins\/solseo\/","author":23461123,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.5.1","stable_tag":"2.5.1","tested":"7.1.2","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"SolSEO","header_author":"Solkarra Group","header_description":"Titles, meta, sitemaps, structured data, redirects and a content score for posts, pages and products.","assets_banners_color":"070731","last_updated":"2026-10-04 10:17:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/solseo.com.au\/plugin","header_author_uri":"https:\/\/solkarra.com.au","rating":0,"author_block_rating":0,"active_installs":0,"downloads":41,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.5.1":{"tag":"2.5.1","author":"hashyau","date":"2026-10-04 10:17:24","revision":3727295}},"upgrade_notice":{"2.3.5":"<p>Saving one Titles and Meta tab could switch off structured data or social tags set on another. Open both tabs after updating and check the ticks.<\/p>","1.2.0":"<p>Rules typed into robots.txt with a per cent encoded character in them have been saved without it since the first build. Open SolSEO, Tools, robots.txt and check yours.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3727295,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3727295,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3727295,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3727295,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"solseo\/faq":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"solseo\/faq","title":"Questions and answers","category":"text","icon":"editor-help","description":"A list of questions and answers, published as structured data so a search engine can read them.","keywords":["faq","questions","answers","schema"],"textdomain":"solseo","supports":{"html":false,"anchor":true,"spacing":{"margin":true,"padding":true}},"attributes":{"heading":{"type":"string","default":""},"items":{"type":"array","default":[],"items":{"type":"object"}}},"editorScript":"solseo-block-faq","editorStyle":"solseo-block-faq-editor","render":"file:.\/render.php"}},"tagged_versions":["2.5.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3727295,"resolution":"1","location":"assets","locale":"","width":1280,"height":860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3727295,"resolution":"2","location":"assets","locale":"","width":1280,"height":860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3727295,"resolution":"3","location":"assets","locale":"","width":1280,"height":860},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3727295,"resolution":"4","location":"assets","locale":"","width":1280,"height":860},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3727295,"resolution":"5","location":"assets","locale":"","width":1280,"height":860},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3727295,"resolution":"6","location":"assets","locale":"","width":1280,"height":860}},"screenshots":{"1":"The score and its checks in the editor sidebar, updating as you write.","2":"The posts list, with the score, the keyword, the structured data and the link counts, and a pencil that edits titles and descriptions from the list.","3":"The SolSEO dashboard, with the average score, the pages worth looking at first and the site checks.","4":"The robots.txt screen, showing what the site is serving and the sets of rules to choose from.","5":"Titles and meta templates, with the placeholders listed underneath.","6":"The redirect manager and the log of addresses that found nothing."}},"plugin_section":[262246],"plugin_tags":[683,726,1117,186,1557],"plugin_category":[55],"plugin_contributors":[284315],"plugin_business_model":[],"class_list":["post-372003","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-meta","plugin_tags-redirects","plugin_tags-schema","plugin_tags-seo","plugin_tags-sitemap","plugin_category-seo-and-marketing","plugin_contributors-hashyau","plugin_committers-hashyau"],"banners":{"banner":"https:\/\/ps.w.org\/solseo\/assets\/banner-772x250.png?rev=3727295","banner_2x":"https:\/\/ps.w.org\/solseo\/assets\/banner-1544x500.png?rev=3727295","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/solseo\/assets\/icon-128x128.png?rev=3727295","icon_2x":"https:\/\/ps.w.org\/solseo\/assets\/icon-256x256.png?rev=3727295","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/solseo\/assets\/screenshot-1.png?rev=3727295","caption":"The score and its checks in the editor sidebar, updating as you write."},{"src":"https:\/\/ps.w.org\/solseo\/assets\/screenshot-2.png?rev=3727295","caption":"The posts list, with the score, the keyword, the structured data and the link counts, and a pencil that edits titles and descriptions from the list."},{"src":"https:\/\/ps.w.org\/solseo\/assets\/screenshot-3.png?rev=3727295","caption":"The SolSEO dashboard, with the average score, the pages worth looking at first and the site checks."},{"src":"https:\/\/ps.w.org\/solseo\/assets\/screenshot-4.png?rev=3727295","caption":"The robots.txt screen, showing what the site is serving and the sets of rules to choose from."},{"src":"https:\/\/ps.w.org\/solseo\/assets\/screenshot-5.png?rev=3727295","caption":"Titles and meta templates, with the placeholders listed underneath."},{"src":"https:\/\/ps.w.org\/solseo\/assets\/screenshot-6.png?rev=3727295","caption":"The redirect manager and the log of addresses that found nothing."}],"raw_content":"<!--section=description-->\n<p>SolSEO does the SEO work every site needs and gets out of the way. Nothing is held back behind a key, nothing phones home, and there are no notices on screens that have nothing to do with it.<\/p>\n\n<p><strong>A score you can act on<\/strong><\/p>\n\n<p>Every post, page and product is scored out of a hundred from around thirty checks: how the page is aimed at its keyword, titles and links, how the writing reads, and what a shopping result needs. Each check says what to change. The score updates as you type, and the posts list gets a column you can edit in place, so forty titles can be fixed without opening a page.<\/p>\n\n<p><strong>Titles, meta and sitemaps<\/strong><\/p>\n\n<p>Write a title and description per page, or set a template per post type with placeholders in braces, such as {title} {sep} {sitename}. A pixel gauge shows when a title is about to be cut off. XML sitemaps cover posts, pages, products, categories, tags and author archives, list the images on each page, and are added to robots.txt.<\/p>\n\n<p><strong>Structured data<\/strong><\/p>\n\n<p>Organisation or person, the site, breadcrumbs, articles and products. A product with variations gets one offer per variation with its own price, SKU and stock state, which is what sends a buyer to the right size.<\/p>\n\n<p><strong>The rest<\/strong><\/p>\n\n<ul>\n<li>A monthly crawl of up to three hundred of your own pages that turns up internal links going nowhere, each one naming the pages it is written on, and links arriving by way of two or more redirects. It only ever asks your own server for your own addresses<\/li>\n<li>Redirects with 301, 302, 307 and 410, and a log of dead links that becomes a redirect in one click<\/li>\n<li>Internal link suggestions that write a real link and store a revision<\/li>\n<li>An image report: files far bigger than the space they are drawn in, missing width and height, missing alt text, uploads no page uses<\/li>\n<li>Six accessibility checks on your own content, each named by guideline<\/li>\n<li>Open Graph and card tags, canonicals, noindex and nofollow, SEO fields on categories and tags, breadcrumbs<\/li>\n<li>A robots.txt screen with ready made rule sets and a way back<\/li>\n<li>Import from another SEO plugin, previewed first, originals left in place<\/li>\n<li>Search Console figures for the page you are editing, on a read only permission<\/li>\n<\/ul>\n\n<p><strong>Works with WooCommerce<\/strong><\/p>\n\n<p>Product schema, product checks in the score, galleries in the sitemap, and price, SKU and stock placeholders. Twelve checks from Google's product data specification run against your products here rather than turning up in Merchant Centre three days later. WooCommerce is optional.<\/p>\n\n<h3>External services<\/h3>\n\n<p>SolSEO does not contact anybody else on its own. Every service below is off until you switch it on yourself, and each one stops the moment you switch it off, remove its key or press Disconnect. This is the whole list.<\/p>\n\n<p>Two things in this plugin ask your own server for your own pages, and neither is one of these. The crawler on the Technical screen reads your published pages when you press the button, and the tag check on the Connections screen reads your home page when you press that button. Both go through the same piece of code, which refuses any address that is not on your own site. Nothing about those pages leaves your server, so there is no third party to name here.<\/p>\n\n<p>Some screens also carry a link to somebody else's documentation, and a link is not a service. The robots.txt screen lists the AI crawlers by name and links each one to what its operator publishes about it, at OpenAI, Anthropic, Google, Common Crawl, Perplexity, ByteDance, Apple, Meta and Amazon. The Connections screen links Google's pages about API keys, the analytics check links each tag vendor's own installation guide, and the Australian checks link the OAIC, the ACCC and the ATO. Nothing is fetched from any of them: the addresses sit in a href and go nowhere until you click one, at which point your browser goes there and this plugin is not involved. They are here so that what a screen tells you about a crawler or a rule can be checked against the people who set it.<\/p>\n\n<h4>Google PageSpeed Insights, at www.googleapis.com<\/h4>\n\n<p>Off until you paste a Google API key on the Connections screen, and used only when you press the button on the Speed screen.<\/p>\n\n<p>Each check sends one address from your own site, plus your key, and Google sends back how that page performs: a test it runs itself, and, if enough people have visited the page recently, what those visits measured. Nothing else is sent, no check runs on a schedule, and removing the key stops it.<\/p>\n\n<p>The key is yours, from your own Google Cloud project. Google's terms and privacy policy cover what they do with the address you send.<\/p>\n\n<p>Terms: https:\/\/developers.google.com\/terms\nPrivacy policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>IndexNow, at api.indexnow.org<\/h4>\n\n<p>Off until you switch it on under SolSEO, Technical, Indexing.<\/p>\n\n<p>When it is on, publishing or updating a page sends that page's address, once, so the search engines that take part know to come and look. One submission reaches all of them: Bing, Yandex, Seznam and Naver read the same endpoint. Nothing is sent for a draft, a private page, or a page you have asked to stay out of search results.<\/p>\n\n<p>Each submission carries your site's host name, the page addresses, the key described below and the address of the key file. Nothing else. The same screen also has a button that sends up to a thousand of your published addresses in one go, which is useful the first time you switch it on; it only runs when you press it, and only while IndexNow is on.<\/p>\n\n<p>IndexNow also needs a key file at the root of your site, which this plugin creates and serves for you. It holds a line of letters and numbers and nothing else, and it is how the engines check the submission came from whoever runs the site.<\/p>\n\n<p>IndexNow is run by its sponsors, Microsoft, Yandex and Seznam.cz.<\/p>\n\n<p>Terms of use: https:\/\/www.indexnow.org\/terms\nPrivacy policy: https:\/\/privacy.microsoft.com\/privacystatement\nHow it works: https:\/\/www.indexnow.org\/documentation<\/p>\n\n<h4>Google Search Console, at searchconsole.googleapis.com<\/h4>\n\n<p>Off until you connect a Google account under SolSEO, Settings, Connections, and you can disconnect on the same screen.<\/p>\n\n<p>Once connected, the plugin asks Google two things. At the moment you connect, and again if you press the button to refresh the list, it asks which Search Console properties your Google account can see, so it can show you the list and match one to this site. After that, when you open a post or a page in the editor, it asks what that one page did in Google over the last twenty eight days: clicks, impressions, average position, and the search terms people used to reach it. The answer is kept on your own server for six hours so that opening the same page twice does not ask twice.<\/p>\n\n<p>The permission asked for is read only. It is https:\/\/www.googleapis.com\/auth\/webmasters.readonly, which is the narrowest one Search Console publishes: it cannot add a property, remove one, or submit a sitemap. Nothing is ever written to your Google account.<\/p>\n\n<p>What is sent is the address of the page you are editing and the address of the property you matched it to. No page content, no customer data and nothing about your visitors.<\/p>\n\n<p>None of what comes back is sent anywhere. The figures are shown in your own WordPress admin and stored on your own server, and the plugin has no route that sends Search Console data to SolSEO or to anybody else.<\/p>\n\n<p>Terms: https:\/\/policies.google.com\/terms\nPrivacy policy: https:\/\/policies.google.com\/privacy<\/p>\n\n<h4>Connecting that Google account, at accounts.google.com, oauth2.googleapis.com and solseo.com.au<\/h4>\n\n<p>Off until you press Connect on that same screen. This is the one place in this plugin that contacts solseo.com.au without a SolSEO account, and it is worth reading before you press it.<\/p>\n\n<p>Connecting to Google needs an application secret, and a secret that shipped inside a plugin anybody can download is not a secret. So the plugin holds none. When you press Connect, your browser goes to solseo.com.au, which sends you on to Google's own sign in and permission screen at accounts.google.com. When you say yes, Google sends your browser back to solseo.com.au, which sends it straight back to your site with a one-time code. Your site then asks solseo.com.au to turn that code into a token at oauth2.googleapis.com. Google's tokens last an hour, so when the plugin next needs Search Console figures and finds the token has run out, it asks solseo.com.au to refresh it the same way, sending the long-lived refresh token Google issued.<\/p>\n\n<p>What solseo.com.au sees is the one-time code, the refresh token when it is renewing one, the token Google hands back, and the address of your site because your browser came from it. It keeps none of them. There is no account, no row and no log line: the code is exchanged and the answer is passed straight to your site, which is where the token is stored, scrambled, in your own database.<\/p>\n\n<p>If you would rather we were not in the middle at all, you do not have to be. Under \"Use my own Google app\" on the same screen you can paste a client id and secret from your own Google Cloud project, and then nothing in this handshake touches solseo.com.au: your site talks to accounts.google.com and oauth2.googleapis.com directly.<\/p>\n\n<p>Disconnecting deletes the stored token, tells Google to forget the permission, and stops all of it in the same click. Deleting the plugin with \"remove my data\" ticked under SolSEO, Tools, Data does the same: it tells Google to forget the permission, once, before the stored token is deleted. You can also revoke it from your own Google account at https:\/\/myaccount.google.com\/permissions.<\/p>\n\n<p>Google terms: https:\/\/policies.google.com\/terms\nGoogle privacy policy: https:\/\/policies.google.com\/privacy\nSolSEO terms: https:\/\/solseo.com.au\/terms\nSolSEO privacy policy: https:\/\/solseo.com.au\/privacy<\/p>\n\n<h4>SolSEO, at solseo.com.au<\/h4>\n\n<p>Off until you paste a pairing code on the Connect screen. This is separate from the Google handshake above, which uses solseo.com.au as a post box and needs no account.<\/p>\n\n<p>Once paired, the plugin sends twice a day: the site address and time zone, the WordPress, PHP, WooCommerce and plugin versions, the number of published items of each post type SolSEO manages (posts, pages, products and any others you switched on), and the permalink structure. In return it reads back which plan the account is on, a summary of the sites on it, and what the account's monitoring last measured about this site from outside it, which is what the dashboard widget shows. It only ever talks to solseo.com.au, whatever a reply from there says.<\/p>\n\n<p>No page content, no customer data, no Search Console figures and nothing about your visitors is sent. Disconnecting on the Connect screen removes the stored key and stops it at once.<\/p>\n\n<p>Service terms: https:\/\/solseo.com.au\/terms\nPrivacy policy: https:\/\/solseo.com.au\/privacy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Open SolSEO in the admin menu. It works from the moment it is switched on, with no setup. If you would rather answer a few questions, SolSEO, Setup walks through five of them.<\/li>\n<li>Under Titles and Meta, set the organisation name and logo so the structured data is complete.<\/li>\n<li>If you are moving from another SEO plugin, go to SolSEO, Tools, Import, and check the preview before you copy anything.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20anything%20need%20an%20account%3F\"><h3>Does anything need an account?<\/h3><\/dt>\n<dd><p>No. Everything described above works with no account, no key and no network connection.<\/p><\/dd>\n<dt id=\"is%20there%20a%20paid%20version%3F\"><h3>Is there a paid version?<\/h3><\/dt>\n<dd><p>Yes, and nothing in this plugin is held back for it. SolSEO Pro is a separate add-on that installs beside this one. It scores every phrase you are aiming at rather than only the focus keyword, and it shows your tracked positions in the editor. There is a page about it under SolSEO, Upgrade, and at https:\/\/solseo.com.au\/pro<\/p><\/dd>\n<dt id=\"will%20it%20clash%20with%20another%20seo%20plugin%3F\"><h3>Will it clash with another SEO plugin?<\/h3><\/dt>\n<dd><p>Two plugins writing meta tags will produce two of everything. Import your fields first, then switch the other one off.<\/p><\/dd>\n<dt id=\"i%20imported%20by%20mistake.%20is%20the%20old%20data%20gone%3F\"><h3>I imported by mistake. Is the old data gone?<\/h3><\/dt>\n<dd><p>No. The import copies. It never deletes or changes what the other plugin stored, so switching that plugin back on puts things as they were.<\/p><\/dd>\n<dt id=\"will%20it%20stop%20ai%20crawlers%20using%20my%20writing%3F\"><h3>Will it stop AI crawlers using my writing?<\/h3><\/dt>\n<dd><p>There is a set of rules under SolSEO, Tools, robots.txt that names eight of them: GPTBot, ClaudeBot, Google-Extended, CCBot, PerplexityBot, Bytespider, Applebot-Extended and meta-externalagent. One button fills the box and nothing is saved until you press Save.<\/p>\n\n<p>Three things are worth knowing, and the screen says all three. Two of those eight do not fetch anything at all; they decide what may be done with pages an ordinary search crawler already read, so saying no to them costs you nothing in search results. One of them is a search crawler whose owner says it does not train on what it reads, so blocking it takes your site out of that product's answers and saves no training use. And one of them has been seen fetching addresses it was told to stay off. A robots.txt is a request. The well behaved crawlers follow it.<\/p><\/dd>\n<dt id=\"does%20it%20change%20the%20robots.txt%20file%20on%20my%20server%3F\"><h3>Does it change the robots.txt file on my server?<\/h3><\/dt>\n<dd><p>No. WordPress generates robots.txt when there is no file, and that is what this adds to. If there is a real file on your server, nothing you type here is served, and the screen says so and shows you what the file contains. It offers once to take over: it copies the file's lines into the box first so nothing is lost, then renames the file to robots.txt.solseo-backup. It never deletes it, it never does it on its own, and one button puts it back.<\/p><\/dd>\n<dt id=\"where%20did%20my%20robots.txt%20go%3F\"><h3>Where did my robots.txt go?<\/h3><\/dt>\n<dd><p>If you took that offer, it is robots.txt.solseo-backup, in the same folder. \"Put it back as it was\" on SolSEO, Tools, robots.txt returns it.<\/p><\/dd>\n<dt id=\"where%20is%20the%20sitemap%3F\"><h3>Where is the sitemap?<\/h3><\/dt>\n<dd><p>At \/sitemap.xml. It replaces the one WordPress generates.<\/p><\/dd>\n<dt id=\"can%20i%20change%20what%20a%20check%20expects%3F\"><h3>Can I change what a check expects?<\/h3><\/dt>\n<dd><p>The word count target can be filtered with <code>solseo_minimum_words<\/code>, and the whole set of results can be filtered with <code>solseo_checks<\/code> before it is scored.<\/p><\/dd>\n<dt id=\"does%20deleting%20the%20plugin%20remove%20my%20seo%20fields%3F\"><h3>Does deleting the plugin remove my SEO fields?<\/h3><\/dt>\n<dd><p>Not unless you ask it to, under SolSEO, Tools, Data.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.5.1<\/h4>\n\n<p>The answer to the third wordpress.org review. Every value a form sends is now\nsanitised by a WordPress function on the line that reads it: the robots.txt\nrules and the profile addresses through wp_strip_all_tags(), which keeps their\nlines and percent encoded characters, before SolSEO's own checks run. The\nTitles, Writing and Tools screens read each field with its own sanitiser rather\nthan the whole form at once. Redirects copied from another plugin have their\ntargets cleaned as addresses, and reading that plugin's table can no longer\nprint a database error.<\/p>\n\n<h4>2.5.0<\/h4>\n\n<p>Moving from another SEO plugin now brings its category and tag fields across\nwith the pages: titles, descriptions, canonicals, focus keywords, and whether a\ncategory is kept out of search. A field SolSEO already holds on a category is\nnever replaced. The import's check covers categories too, so the offer to switch\nthe other plugin off waits until they are all across. Redirects kept in the\nother plugin's own table can be copied into SolSEO's, from the Import tab or the\nlast step of setup, with a list of what each one will do first. Rules that\nmatched part of an address come across as patterns that answer the same\naddresses, one already here is left as it is, and one that cannot work here is\nnamed with the reason. Both read the other plugin's data whether or not it is\nstill switched on. A page's automatic description no longer picks up a form's\n\"please enable JavaScript\" line, its labels or its button.<\/p>\n\n<h4>2.4.0<\/h4>\n\n<p>WooCommerce products and categories can drop \/product\/ and \/product-category\/\nfrom their addresses, so \/product-category\/string-wax\/ becomes \/string-wax\/.\nThe two switches are under Titles and Meta, on the Post types and Taxonomies\ntabs, and both start off. A third removes parent categories from a\nsubcategory's address. The old addresses send a permanent redirect to the new\nones, and canonicals, sitemaps and breadcrumbs print the new ones. A page keeps\nits address when a product or category shares its name, and a product keeps it\nover a category, so switching on never hides a page. A site moving from an SEO\nplugin that already removed these keeps them removed: SolSEO reads that\nplugin's setting once, when it is first activated. \/sitemap_index.xml now sends\na permanent redirect to \/sitemap.xml when nothing else on the site answers it.<\/p>\n\n<h4>2.3.5<\/h4>\n\n<p>Saving one tab of Titles and Meta no longer switches off settings on another.\nSaving the Social tab turned off structured data, the site search box,\nbreadcrumbs and the search results noindex from the General tab, and saving\nGeneral turned off Open Graph and card tags from Social. Each tab now saves\nonly the switches it shows. If you saved either tab on 2.3.4 or earlier, open\nboth and check the ticks.<\/p>\n\n<h4>2.3.4<\/h4>\n\n<p>The answer to the second wordpress.org review, plus the audit that followed it.\nThe sitemap's browser view carries no CSS at all, so nothing is printed outside\nthe enqueue system. Every request value is sanitised on the line that reads it\nand every output is escaped where it is printed. The Google callback writes\nnothing without a live handshake. The role map is enforced on every path that\nsaves SEO fields, SQL lists use placeholders, the crawler verifies certificates,\nand deleting the plugin with \"remove my data\" ticked now removes every table,\noption and stored credential, and tells Google to forget the permission.<\/p>\n\n<h4>2.3.3<\/h4>\n\n<p>No node in the structured data can point at a node that is not there. 2.3.2\nfixed the one case Search Console had reported, the home page naming a\nbreadcrumb list it did not have. This release makes the rule general: after\nevery builder and every filter has run, any reference to an id that no node in\nthe graph carries is removed. An author reference to a person who has since\nbeen deleted, or a reference left behind by an add-on that replaced a node,\ncan no longer reach the page as an empty item that Google reports as a missing\nfield. Pages whose references all resolve, which is every page on a normal\nsite, print exactly what they printed before.<\/p>\n\n<h4>2.3.2<\/h4>\n\n<p>The home page no longer points at a breadcrumb trail it does not have. A trail\nneeds two crumbs and the front page has one, so no BreadcrumbList was written\nthere, but the WebPage node still named \"#breadcrumb\" as its breadcrumb. Google\nreads a reference to an id nothing else carries as an empty BreadcrumbList, and\nSearch Console reported the home page as missing itemListElement. The page node\nnow names a breadcrumb only when the list is in the same graph. Every other\npage is unchanged.<\/p>\n\n<h4>2.3.1<\/h4>\n\n<p>The WooCommerce shop page prints the title and description typed on it. The\nshop is drawn at the address of a real page, and that page has the SolSEO\nmeta box, but the query calls the view an archive, so what was typed there was\nnever read and the shop showed \"Shop - Sitename\" whatever the editor said. The\nshop archive now carries its page, the way the blog home already carried its,\nso title, description, robots and social tags all come from the page. Every\nother archive is unchanged.<\/p>\n\n<h4>2.3.0<\/h4>\n\n<p>A page title can no longer break the structured data. The JSON-LD block was\nwritten with forward slashes left unescaped, so a title, description or product\nfield holding the six characters of a closing script tag ended the block early\nand everything after it in that field went onto the page as markup. The graph is\nnow written so that neither half of a tag can appear in it. Nothing is deleted:\nthe words a person typed are still in the graph, and a search engine reads the\nsame page it always did.<\/p>\n\n<p>The admin stylesheet no longer reaches WordPress' own screens. Its colours were\ndeclared on the document, so every screen that loaded it handed nine SolSEO\nvalues to everything else drawn there, and it loaded on the Dashboard, the posts\nlist, the editor and the term screen whether or not there was anything of ours\non them. The colours are now declared on this plugin's own elements, and the\nstylesheet loads on a screen only when this plugin has drawn something on it:\nthe Dashboard only with one of its panels turned on, a posts list only for a\npost type it manages, a term screen only for a taxonomy it manages.<\/p>\n\n<p>The robots.txt rules ask WordPress where the admin is instead of assuming. A\nsite in a subdirectory, or one whose admin folder has been moved, was getting a\nrule for a folder that does not exist and an Allow line that did not cover\nadmin-ajax.php. Both lines now come from the address WordPress reports.<\/p>\n\n<p>The sitemap stylesheet is a file. It used to be written into the transform,\nwhich meant a browser fetched it again with every sitemap it drew.<\/p>\n\n<p>Four links that had gone dead now point at pages that exist: ByteDance's own\npage about its crawler, Hotjar's tracking code guide, the ATO on tax invoices,\nand two ACCC pages behind the Australian checks. The readme also now says, in\nthe External services section, that the crawler and compliance tables carry\nlinks to other people's documentation and that this plugin fetches none of them.<\/p>\n\n<h4>2.2.0<\/h4>\n\n<p>The score in the editor now matches the audit. The editor analysis and the\nchecks that run on the SolSEO service had each grown their own copy of the same\nrules and drifted apart, so a description could be written at a length the\neditor accepted and then reported as too long by the same company's check. The\nalt text rule in the accessibility panel and the one in the SEO panel disagreed\nwith each other in the same editor. All of them now read one definition.<\/p>\n\n<p>An empty alt attribute is read as an answer rather than as a missing one. A\ndecorative image is meant to carry an empty alt, and pages were being marked\ndown for doing it correctly.<\/p>\n\n<h4>2.1.0<\/h4>\n\n<p>The dashboard widget is about this site and nothing else. It used to list every\nsite on the connected SolSEO account, so a site built for a client showed that\nclient the names and scores of every other site on the account. It now shows\nthis one.<\/p>\n\n<p>The panel's five sections are now also panels of their own: content score, what\nneeds work, site health and keywords, site monitoring, and pages worth fixing.\nThey start switched off. The Screen Options tab at the top of the Dashboard\nturns any of them on, for you and not for everybody else on the site.<\/p>\n\n<p>The widget also says a good deal more: how the pages are spread across the\nscore bands, how many have never been scored, how many have no search summary,\nhow many are hidden from search, and anything switched on that stops the site\nbeing found at all. A connected site adds its health score and the change since\nthe audit before, its tracked keyword count, when it was last audited, and,\nwhere monitoring is on, whether the site is answering, how long the certificate\nhas left and whether the sitemap works.<\/p>\n\n<h4>2.0.2<\/h4>\n\n<p>Switching off the other SEO plugin after an import now switches off its paid\nadd-on at the same time. Before this, only the free plugin went off and the\nadd-on kept running with nothing underneath it, which took the whole site down\nuntil somebody switched the first one back on.<\/p>\n\n<p>The import screen also stops reloading itself. A finished run reloaded the page\nonce to show what it had unlocked, then the reloaded page saw the same finished\nrun and reloaded again, over and over.<\/p>\n\n<h4>2.0.0<\/h4>\n\n<p>Connect your Google Search Console account and see what each page actually did\nin Google over the last twenty eight days, in the editor, beside the page you\nare writing: clicks, impressions, average position, and the searches that\nbrought them. The permission asked for is read only. If you would rather\nsolseo.com.au were not in the middle of the connection, paste a client id and\nsecret from your own Google Cloud project and it will not be.<\/p>\n\n<p>A product page no longer carries two Product descriptions. When SolSEO's\nstructured data is on and it describes the product, WooCommerce's own copy is\nleft out, so a search engine sees one product with one rating. A filter,\nsolseo_schema_replace_woo, keeps WooCommerce's instead. When another SEO plugin\nis also publishing structured data, the Titles and Meta screen says so in one\nline and asks you to turn one of them off. Add-ons can now hear when a page's\nSearch Console figures have been read.<\/p>\n\n<h4>1.5.0<\/h4>\n\n<p>The free halves of six paid features: internal link suggestions you approve one\nat a time, a warning when two pages go for the same phrase, a Merchant Centre\nfeed audit, six accessibility checks, six Australian business checks, and a\nverification that your analytics tag fires once rather than twice or not at all.\nAlso a crawl of your own pages, the links on them that go nowhere, and what your\nimages cost a visitor.<\/p>\n\n<h4>1.3.1<\/h4>\n\n<p>The Upgrade screen described the add-on as adding two things over a list of\nthree. It no longer counts them in a sentence the list can outgrow.<\/p>\n\n<h4>1.3.0<\/h4>\n\n<p>Seven SolSEO tests in WordPress's own Site Health screen, built from what the\nplugin already knows and working with no account: whether search engines are\nallowed in, readable addresses, the sitemap, structured data, pages with no\ndescription of their own, images with no alt text, and how many pages are kept\nout of search results on purpose. A SolSEO section on the Info tab lists the\nversion, the post types scored, whether a sitemap is served and how the scoring\nstands, and none of it leaves the site.<\/p>\n\n<p>Two places an add-on can hook into, and the image description tool can now be\npointed at the images on one page.<\/p>\n\n<h4>1.2.0<\/h4>\n\n<p>First release on wordpress.org.<\/p>\n\n<p>A setup screen covering the five things a new site cannot guess. A panel in the block editor sidebar, opened from the score in the top right, in place of the box below the content; the classic editor keeps its box. The posts list column now carries the keyword, the structured data type and three link counts, and a pencil in its header lets you edit titles and descriptions straight from the list.<\/p>\n\n<p>The robots.txt screen shows what your site is actually serving, offers five ready made sets of rules, records what the site served before this plugin arrived, and can put it back. Anything with a per cent encoded character in it was being silently stripped on save before now, so it is worth reopening that box.<\/p>\n\n<p>Every bulk tool queues the whole job instead of asking you to press a button repeatedly. The importer reads four more plugins, checks itself when it finishes, and then offers to switch the other one off for you. A notice appears when another SEO plugin is writing the same tags, on three screens only, dismissible for good.<\/p>\n\n<p>Breadcrumbs have a live preview and the prefix setting finally has a field.<\/p>\n\n<h4>1.0.0<\/h4>\n\n<p>Built, and never published.<\/p>","raw_excerpt":"Titles, meta, sitemaps, structured data, redirects and a content score for posts, pages and products.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372003","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=372003"}],"author":[{"embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hashyau"}],"wp:attachment":[{"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372003"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372003"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372003"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372003"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372003"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/as.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}