[
'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' );
?>
>
→