[ 'label' => __( 'Cluster health', 'clusterlane' ), 'text' => __( 'Overall structural quality of a cluster, 0–100. Weighted from: article scores 30%, share of articles that have inbound links 25%, link density 20%, evenness of inbound links (inverse Gini) 15% and entropy 10%.', 'clusterlane' ), 'good' => __( '70+ is strong, 50–69 needs attention, under 50 is weak. The site’s average health (Dashboard, Cluster Inspector, sections, reports) is weighted by articles: a 40-article cluster counts eight times as much as a 5-article one.', 'clusterlane' ), 'fix' => __( 'Link the orphans first — that moves the two biggest weights at once.', 'clusterlane' ), ], 'entropy' => [ 'label' => __( 'Entropy', 'clusterlane' ), 'text' => __( 'How evenly the articles in a cluster share the work of linking to each other, 0–100. 100 = every article that links contributes equally; low = one or two articles do almost all the linking.', 'clusterlane' ), 'good' => __( 'Above 60 is healthy. Balanced Mesh needs 80+ (default threshold).', 'clusterlane' ), 'fix' => __( 'Add links FROM articles that rarely link to their siblings.', 'clusterlane' ), ], 'gini' => [ 'label' => __( 'Gini', 'clusterlane' ), 'text' => __( 'Inequality of inbound links inside a cluster, 0–100. 0 = every article gets the same number of links; 100 = one article gets them all.', 'clusterlane' ), 'good' => __( 'Under 40 is even. A high Gini is fine for a deliberate pillar structure, but 70+ together with low entropy means one hub hoards the links.', 'clusterlane' ), 'fix' => __( 'Point new links at Light and Orphan articles, not only at the pillar.', 'clusterlane' ), ], 'density' => [ 'label' => __( 'Density', 'clusterlane' ), 'text' => __( 'Share of all possible links between the cluster’s articles that actually exist, in %. 10 articles have 90 possible links; 9 existing links = 10%.', 'clusterlane' ), 'good' => __( 'Under 8% is classed as Weak Structure. Big clusters naturally have lower density than small ones.', 'clusterlane' ), 'fix' => __( 'Use Text Match and Link Suggestions within the cluster.', 'clusterlane' ), ], 'archetype' => [ 'label' => __( 'Archetype', 'clusterlane' ), 'text' => __( 'The cluster’s shape, read from its metrics. Checked in this order: Emerging (fewer than 6 articles), Balanced Mesh, Authority Pyramid, Over-Centralized Hub, Weak Structure, Fragmented (over 25% orphans), Developed Cluster, otherwise Mixed — analysed, but no single pattern stands out. WooCommerce product categories are always Product Range. Unclassified means the cluster has not been computed yet.', 'clusterlane' ), 'good' => __( 'Balanced Mesh, Authority Pyramid and Developed Cluster are healthy shapes.', 'clusterlane' ), 'fix' => __( 'The thresholds can be tuned under Settings → Cluster Thresholds.', 'clusterlane' ), ], 'sections' => [ 'label' => __( 'Sections', 'clusterlane' ), 'text' => __( 'Clusters grouped the way visitors see the site: by the top items of your main menu. A category cluster goes under the menu item its category (or a parent of it) sits under; a category not in the menu goes under its top-level parent category. Tag and custom clusters go where most of their articles belong. The rest are under Other.', 'clusterlane' ), 'good' => __( 'The menu decides before the category tree: a child category with its own top menu item is its own section.', 'clusterlane' ), 'fix' => __( 'Make your own groups with + New group, then drag clusters onto a section header — or open a cluster and pick its Section in the info bar. Automatic puts it back. Your groups come first; rename, reorder or delete them from their header.', 'clusterlane' ), ], 'archetype_mix' => [ 'label' => __( 'Archetype mix', 'clusterlane' ), 'text' => __( 'How your clusters are distributed across archetypes. Hover a segment to see its count.', 'clusterlane' ), 'good' => __( 'A growing share of Balanced Mesh, Authority Pyramid and Developed Cluster means the site structure is improving.', 'clusterlane' ), ], 'role' => [ 'label' => __( 'Role (Pillar · Support · Light · Orphan)', 'clusterlane' ), 'text' => __( 'An article’s role in a cluster, from its inbound links compared with the other members. Pillar = the cluster’s main article: the best-linked one (two in clusters of 20+), or the one you chose with Make pillar in Cluster Inspector. Light = bottom 35% with at most 1 inbound link. Orphan = no inbound links. Support = everything in between.', 'clusterlane' ), 'good' => __( 'One clear pillar that every other article links to, mostly supports, few lights and no orphans.', 'clusterlane' ), ], 'orphans' => [ 'label' => __( 'Orphans', 'clusterlane' ), 'text' => __( 'Articles that no other article on the site links to. Readers and search engines can only reach them through menus, archives or search.', 'clusterlane' ), 'good' => __( '0.', 'clusterlane' ), 'fix' => __( 'Open the cluster in Cluster Inspector → Improve this cluster, or run Text Match.', 'clusterlane' ), ], 'pillars' => [ 'label' => __( 'Pillar articles', 'clusterlane' ), 'text' => __( 'The main article of each cluster: the best-linked article, if it is in the cluster’s top quarter by inbound links and has at least 2 — one per cluster, two in clusters of 20 or more. If you choose a pillar yourself (the medal button in Cluster Inspector), that article is the only one.', 'clusterlane' ), 'good' => __( 'Every cluster with 4+ articles should have one — ideally an overview or guide that links to the rest.', 'clusterlane' ), 'fix' => __( 'No natural main article? Pillar & split check (Pro) suggests one to write; publish it, then make it the pillar with the medal button.', 'clusterlane' ), ], 'seo_titles' => [ 'label' => __( 'SEO title & meta description', 'clusterlane' ), 'text' => __( 'What an article shows as its search result: the blue title and the grey text under it. Read from your SEO plugin or custom fields (Settings → Content).', 'clusterlane' ), 'good' => __( 'Title up to 60 characters, description 70–160, both specific to the article.', 'clusterlane' ), 'fix' => __( 'Edit the text here and click Apply — or select articles and let AI suggest (Pro). Clusterlane writes only to custom fields; with an SEO plugin, copy the text into the post editor.', 'clusterlane' ), ], 'overall_score' => [ 'label' => __( 'Article score', 'clusterlane' ), 'text' => __( 'An article’s score, 0–100: SEO basics 35% + structure 35% + inbound links 15% + outbound links 15% (10 links in either direction gives full marks for that part). A WooCommerce product: SEO 35% + product page 35% (description, short description, images) + inbound links 30% (5 give full marks) — products are not expected to link out.', 'clusterlane' ), 'good' => __( '80+ is good, 60–79 OK, under 60 weak.', 'clusterlane' ), 'fix' => __( 'Add H2 headings, a meta description, images and internal links.', 'clusterlane' ), ], 'avg_score' => [ 'label' => __( 'Avg score', 'clusterlane' ), 'text' => __( 'Average article score across all scanned articles (SEO basics, structure and internal links).', 'clusterlane' ), 'good' => __( '80+ is good, 60–79 OK, under 60 weak.', 'clusterlane' ), ], 'seo_score' => [ 'label' => __( 'SEO score', 'clusterlane' ), 'text' => __( 'SEO title 20–70 characters (30 pts, 15 if outside) + meta description of 50+ characters (25) + word count 600+ (30, 15 from 300) + featured image (15). Title and description come from your SEO plugin or the fields set in Settings → Content, with the post title and excerpt as fallback.', 'clusterlane' ), ], 'structure_score' => [ 'label' => __( 'Structure score', 'clusterlane' ), 'text' => __( 'Word count 800+ (30 pts, 20 from 400, 10 from 200) + at least one H2 per 200 words (40, 20 if fewer) + 2+ images per 1,000 words (30, 15 from 0.5).', 'clusterlane' ), ], 'avg_inbound' => [ 'label' => __( 'Avg inbound', 'clusterlane' ), 'text' => __( 'Average number of internal links pointing to each scanned article.', 'clusterlane' ), 'good' => __( 'Higher means articles are easier to reach. Compare it over time rather than against a fixed target.', 'clusterlane' ), ], 'inbound' => [ 'label' => __( 'Inbound links', 'clusterlane' ), 'text' => __( 'Links from other articles on this site to this article.', 'clusterlane' ), ], 'outbound' => [ 'label' => __( 'Outbound links', 'clusterlane' ), 'text' => __( 'Internal links from this article to other articles on this site. External links are not counted.', 'clusterlane' ), ], 'percentile' => [ 'label' => __( 'Percentile', 'clusterlane' ), 'text' => __( 'The article’s rank within the cluster by inbound links. p80 = it has more inbound links than 80% of the cluster’s articles.', 'clusterlane' ), 'good' => __( 'Pillars are p75 or higher.', 'clusterlane' ), ], 'global_class' => [ 'label' => __( 'Global content class', 'clusterlane' ), 'text' => __( 'The article’s role across the whole site, independent of clusters: Orphan = 0 inbound links, Pillar = 5+ inbound, Support = 3+ outbound, otherwise Light.', 'clusterlane' ), ], 'word_count' => [ 'label' => __( 'Word count', 'clusterlane' ), 'text' => __( 'Words in the article body, without HTML tags and shortcodes.', 'clusterlane' ), ], 'image_count' => [ 'label' => __( 'Images', 'clusterlane' ), 'text' => __( 'Images found in the article: tags plus common gallery shortcodes (native [gallery], Envira, NextGEN and any you add in Settings).', 'clusterlane' ), ], 'h2_count' => [ 'label' => __( 'H2 headings', 'clusterlane' ), 'text' => __( 'Number of H2 headings. The structure score expects at least one per 200 words.', 'clusterlane' ), ], 'site_map' => [ 'label' => __( 'Site map', 'clusterlane' ), 'text' => __( 'Each rectangle is a cluster. Its area is the number of articles in it; its colour is the cluster\'s health, or the share of articles no other article links to. An article can belong to several clusters.', 'clusterlane' ), 'good' => __( 'Large red or dark blue areas are where most of your content needs work — start there.', 'clusterlane' ), ], 'improve_article' => [ 'label' => __( 'Improve this article', 'clusterlane' ), 'text' => __( 'What to do with this article, most important first: links it lacks (none or few pointing here, no link to its cluster\'s pillar), mentions that can be linked in one click, meta description and structure. Calculated from your scan and a Text Match check, no AI.', 'clusterlane' ), 'good' => __( 'Work from the top. Links show up in the graph after the next Scan.', 'clusterlane' ), ], 'focus_next' => [ 'label' => __( 'Focus next', 'clusterlane' ), 'text' => __( 'The three clusters below 70% health where work pays off most: low health weighted by size, plus articles with no links pointing to them. Calculated from your scan, no AI.', 'clusterlane' ), 'good' => __( 'Open a cluster and start with Improve this cluster; the list updates after the next scan and after every change you make in Clusterlane.', 'clusterlane' ), ], 'graph_layout' => [ 'label' => __( 'How the graph is laid out', 'clusterlane' ), 'text' => __( 'Each link pulls two articles together like a spring, and every article pushes the others away. Well-linked articles settle in the middle; articles with few links in the cluster drift to the edge. Size = inbound links, colour = role.', 'clusterlane' ), 'good' => __( 'Distance to the middle means something: the further out, the weaker an article is linked into the cluster. Two articles next to each other at the edge are not related — they are both weakly linked and happened to land there.', 'clusterlane' ), 'fix' => __( 'Give the articles at the edge a few links from their siblings (Improve this cluster, Text Match). The picture stays the same between visits until the links change.', 'clusterlane' ), ], 'flow_map' => [ 'label' => __( 'Cluster flow map', 'clusterlane' ), 'text' => __( 'Each node is a cluster (size = number of articles, colour = health). Each line is internal links between two clusters (width = number of links).', 'clusterlane' ), 'good' => __( 'Related clusters should be connected; an isolated weak cluster is a good place to start.', 'clusterlane' ), ], ]; } /* ------------------------------------------------------------------ Tooltip helper — call clusterlane_tip('entropy') anywhere in admin HTML. Renders the "?" trigger only; admin/js/clusterlane-tips.js shows the popover (positioned to stay on screen, keyboard and touch friendly). JS-rendered UI uses the same definitions via clusterlaneTip( 'entropy' ). ------------------------------------------------------------------ */ function clusterlane_tip( string $key ): void { echo wp_kses( clusterlane_tip_html( $key ), [ 'span' => [ 'class' => true, 'data-clusterlane-tip' => true, 'tabindex' => true, 'role' => true, 'aria-label' => true, 'aria-hidden' => true ], ] ); } function clusterlane_tip_html( string $key ): string { $defs = clusterlane_tip_definitions(); if ( ! isset( $defs[ $key ] ) ) return ''; /* translators: %s: term, e.g. Entropy */ $label = sprintf( __( 'What is %s?', 'clusterlane' ), $defs[ $key ]['label'] ); return '' . ''; } /* ------------------------------------------------------------------ Help page renderer ------------------------------------------------------------------ */ function clusterlane_render_help_page( ?callable $admin_section = null ): void { $help_url = admin_url( 'admin.php?page=clusterlane-help' ); ?>

admin_url( 'admin.php?page=' . $page ); $steps = [ [ 'title' => __( 'Scan your site', 'clusterlane' ), 'text' => [ __( 'Click Scan in the bar at the top of any Clusterlane page. Clusterlane reads every published article — words, headings, images, SEO title and description, scores and internal links — turns the categories, tags and other groups you picked in Cluster Admin into clusters, and works out each cluster’s health, archetype and the role of every article in it.', 'clusterlane' ), __( 'Run Scan again after publishing or editing articles, or after changing their categories or tags. Changes you make in Clusterlane itself — links, pillars, clusters — update the figures at once. The article texts take well under a minute for a few hundred articles. If Clusterlane also reads your published pages (Settings → Content), those are read afterwards in the background — Pages 120/296 next to Scan shows how far it has come, and you can keep working.', 'clusterlane' ), ], 'link' => [ 'clusterlane-dashboard', __( 'Go to Dashboard', 'clusterlane' ), true ], ], [ 'title' => __( 'Get the overview on the Dashboard', 'clusterlane' ), 'text' => [ __( 'The Site map shows every cluster at once — size is the number of articles, colour is health (or the share of articles without links). Click a cluster to see its link graph below.', 'clusterlane' ), __( 'Site Intelligence Analysis (Pro) reads the whole structure and writes what works, what to fix and in which order. Each action has a button that opens the right tool for the right cluster.', 'clusterlane' ), ], 'link' => [ 'clusterlane-dashboard', __( 'Open Dashboard', 'clusterlane' ), false ], ], [ 'title' => __( 'Fix clusters in Cluster Inspector', 'clusterlane' ), 'text' => [ __( 'Start with Focus next — the clusters where a few links make the biggest difference. Open a cluster and use Improve this cluster: link articles that nothing links to, turn existing mentions into links, and find missing articles.', 'clusterlane' ), __( 'Each cluster has one pillar (two in clusters of 20+ articles): its main article. Clusterlane picks the best-linked one; use the medal button in the article table to choose it yourself. Pillar & split check (Pro) tells you whether the pillar fits and whether a broad cluster should become smaller ones.', 'clusterlane' ), __( 'A long list is grouped into sections like your site’s main menu. Make your own groups with + New group and drag clusters onto them.', 'clusterlane' ), __( 'The eye next to a cluster’s name (here and in Report) opens a quick view: health and its trend, links, orphans, pillar, meta descriptions and the articles to start with. ← and → step through the other clusters in the list.', 'clusterlane' ), ], 'link' => [ 'clusterlane-cluster-inspector', __( 'Open Cluster Inspector', 'clusterlane' ), false ], ], [ 'title' => __( 'Improve single articles in Article Inspector', 'clusterlane' ), 'text' => [ __( 'Open any article: the row under the title shows its scores and links at a glance, and Improve this article lists what to do, most important first — with the fixes one click away. The search preview shows the SEO title and description as Google shows them; with Pro, Suggest writes better ones.', 'clusterlane' ), __( 'Articles to review lists every article with the ones that need attention first; filter by cluster, role or missing meta description.', 'clusterlane' ), ], 'link' => [ 'clusterlane-article-inspector', __( 'Open Article Inspector', 'clusterlane' ), false ], ], [ 'title' => __( 'Check every search result on SEO Titles', 'clusterlane' ), 'text' => [ __( 'SEO Titles lists every article’s SEO title and meta description as they show in Google. Filter on No description, Weak description, Long title or Duplicates, edit by hand and apply — each change can be undone for 30 minutes, and the first time Clusterlane changes an article’s title or description it keeps the original, so Restore original brings it back at any time.', 'clusterlane' ), __( 'With Pro, Check with AI reads each article and flags titles and descriptions that do not match it (AI: poor match), and Suggest with AI writes new ones. You choose per field: use the suggestion, or keep what you have.', 'clusterlane' ), ], 'link' => [ 'clusterlane-seo-titles', __( 'Open SEO Titles', 'clusterlane' ), false ], ], [ 'title' => __( 'Add links — you approve every one', 'clusterlane' ), 'text' => [ __( 'Text Match finds places where an article already mentions another article’s title without linking to it. Link Suggestions (Pro) writes a natural sentence with the link for any two articles. Every change needs your Apply, and can be undone.', 'clusterlane' ), __( 'Looked through the list and it all fits? Apply all links every mention on it, one after another, with a Stop button. Mentions that can no longer be linked (the words changed or are already linked) are skipped; any that fail for a passing reason stay on the list with the reason. Undo run removes every link the run added.', 'clusterlane' ), __( 'New links and link cards go into the article’s own text — never inside a box, a gallery, a page-builder module or an older link card. If the right place is unclear, the card goes at the end and the preview tells you so.', 'clusterlane' ), ], 'link' => [ 'clusterlane-text-match', __( 'Open Text Match', 'clusterlane' ), false ], ], ]; foreach ( $steps as $i => $st ) : ?>

$para ) : ?> >

→
[ 'q' => $f[0], 'a' => $f[1] ], $faqs ); foreach ( $faqs as $faq ): ?>


[ '#f97316', __( 'The cluster’s main article: the best-linked one (two in clusters of 20+ articles), or the one you chose with the medal button. Ideally an overview that links to the rest.', 'clusterlane' ) ], 'Support' => [ '#eab308', __( 'An ordinary, reasonably linked article that covers one part of the topic. Should link to the pillar and to related articles.', 'clusterlane' ) ], 'Light' => [ '#22c55e', __( 'In the bottom 35% of the cluster by inbound links, with at most one link pointing to it. Easy to reach from nowhere — add a few links to it.', 'clusterlane' ) ], 'Orphan' => [ '#3b82f6', __( 'No article on the site links to it. Readers and search engines only find it through menus, archives or search — fix these first.', 'clusterlane' ) ], ]; foreach ( $roles as $label => [ $color, $desc ] ): ?>

__( 'Healthy cluster with a clear pillar and well-linked support articles. The ideal structure.', 'clusterlane' ), 'Balanced Mesh' => __( 'Good internal linking with no single dominant article. Works well for topic clusters without a natural hub.', 'clusterlane' ), 'Developed Cluster' => __( 'Mature cluster with solid coverage and decent linking. Room to strengthen the pillar.', 'clusterlane' ), 'Over-Centralized Hub' => __( 'One article receives almost all inbound links. Other members are underlinked and underexposed.', 'clusterlane' ), 'Fragmented' => __( 'Poor internal linking throughout. Articles exist in the cluster but don\'t link to each other.', 'clusterlane' ), 'Weak Structure' => __( 'Low health across the board. Typically a new or neglected cluster with thin content and few links.', 'clusterlane' ), 'Product Range' => __( 'A WooCommerce product category. Health here is half the product pages’ own scores (description, short description, images, SEO) and half the share of products that articles link to — products are not expected to link to each other.', 'clusterlane' ), 'Emerging Cluster' => __( 'Fewer than 6 articles — too small to have a clear shape yet. Grow it, or merge it into a related cluster.', 'clusterlane' ), 'Mixed' => __( 'Analysed, but no single pattern stands out — typically medium linking without a clear main article. Choosing a pillar and linking the other articles to it is a good first step.', 'clusterlane' ), ]; foreach ( $archetypes as $label => $desc ): ?>