{"id":324047,"date":"2026-07-16T15:16:14","date_gmt":"2026-07-16T15:16:14","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/word-spotlight\/"},"modified":"2026-07-16T14:48:49","modified_gmt":"2026-07-16T14:48:49","slug":"devshujon-keyword-highlighter","status":"publish","type":"plugin","link":"https:\/\/th.wordpress.org\/plugins\/devshujon-keyword-highlighter\/","author":23481245,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"trunk","tested":"7.0.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Dev Highlighter","header_author":"Dev Shujon","header_description":"Highlight, style, and automatically link keywords across your entire WordPress website.","assets_banners_color":"707683","last_updated":"2026-07-16 14:48:49","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/devshujon.com\/dev-highlighter","header_author_uri":"https:\/\/devshujon.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":36,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":{"1.2.0":"<p>Adds documented extension points for optional add-ons. The core rules engine is unchanged and all existing rules are preserved.<\/p>","1.1.0":"<p>Adds a full rules engine: multiple rules per keyword with page\/post\/category\/tag\/post-type targeting and priority. Existing keywords become Site-Wide rules automatically.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3610416,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3610416,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3610416,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3610416,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3610416,"resolution":"1","location":"assets","locale":"","width":3020,"height":1612},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3610416,"resolution":"2","location":"assets","locale":"","width":3024,"height":1686},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3610416,"resolution":"3","location":"assets","locale":"","width":3008,"height":1606}},"screenshots":{"1":"The Keywords list with live style previews.","2":"Adding a keyword with colour pickers and styling options.","3":"The Settings screen with post type control and exclusions.","4":"Import \/ Export with merge or replace."}},"plugin_section":[],"plugin_tags":[7625,271907,70720,251074,271906],"plugin_category":[],"plugin_contributors":[263082],"plugin_business_model":[],"class_list":["post-324047","plugin","type-plugin","status-publish","hentry","plugin_tags-auto-link","plugin_tags-highlight-keywords","plugin_tags-keyword-highlight","plugin_tags-keyword-linking","plugin_tags-text-highlighter","plugin_contributors-devshujon","plugin_committers-devshujon"],"banners":{"banner":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/banner-772x250.png?rev=3610416","banner_2x":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/banner-1544x500.png?rev=3610416","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/icon-128x128.png?rev=3610416","icon_2x":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/icon-256x256.png?rev=3610416","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/screenshot-1.png?rev=3610416","caption":"The Keywords list with live style previews."},{"src":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/screenshot-2.png?rev=3610416","caption":"Adding a keyword with colour pickers and styling options."},{"src":"https:\/\/ps.w.org\/devshujon-keyword-highlighter\/assets\/screenshot-3.png?rev=3610416","caption":"The Settings screen with post type control and exclusions."}],"raw_content":"<!--section=description-->\n<p>Dev Highlighter lets you turn any word or phrase into a styled, optionally-linked highlight everywhere it appears in your content \u2014 without editing a single post by hand.<\/p>\n\n<p>Define a keyword once, choose how it should look (text colour, background colour, bold, italic, underline), optionally give it a link, and Dev Highlighter does the rest on the front end. It is built for performance: rules are compiled and cached, and content is parsed safely with DOMDocument so your markup is never mangled.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Context-aware rules engine<\/strong> \u2014 one keyword can have many rules, each with its own colour, link, and target. Highlight \"Mental Health\" gold site-wide, green on selected pages, and blue in a category \u2014 all at once.<\/li>\n<li><strong>Targeting<\/strong> \u2014 apply a rule Site-Wide, or to Selected Pages, Selected Posts, Categories, Tags, or Post Types.<\/li>\n<li><strong>Exclusions<\/strong> \u2014 exclude specific posts\/pages by ID, categories, or whole post types per rule.<\/li>\n<li><strong>Priority system<\/strong> \u2014 when several rules match, the most specific one wins (Page \u203a Post \u203a Category \u203a Tag \u203a Post Type \u203a Site-Wide); a per-rule priority breaks ties.<\/li>\n<li><strong>Smart conflict detection<\/strong> \u2014 the admin flags keywords with multiple rules and shows which one wins.<\/li>\n<li><strong>Future-proof architecture<\/strong> \u2014 a pluggable condition registry and filterable scope weights make new conditions drop-in additions.<\/li>\n<li><strong>Unlimited keyword rules<\/strong> \u2014 add as many as you need.<\/li>\n<li><strong>Styling<\/strong> \u2014 text colour, background colour, bold, italic, and underline per keyword.<\/li>\n<li><strong>Auto-linking<\/strong> \u2014 add an optional URL to turn a keyword into a link, with optional \"open in new tab\" (adds <code>rel=\"noopener noreferrer\"<\/code>).<\/li>\n<li><strong>Smart phrase protection<\/strong> \u2014 longer phrases always win, so \"Mental Health Program\" is never broken into \"Mental Health\" + \"Program\".<\/li>\n<li><strong>Post type control<\/strong> \u2014 choose exactly where processing runs: Posts, Pages, or any public custom post type.<\/li>\n<li><strong>Safe parsing<\/strong> \u2014 never touches text inside <code>script<\/code>, <code>style<\/code>, <code>textarea<\/code>, <code>pre<\/code>, <code>code<\/code>, or existing links.<\/li>\n<li><strong>Optimised CSS<\/strong> \u2014 identical styles are de-duplicated into shared, generated classes; no repeated inline CSS.<\/li>\n<li><strong>Import \/ Export<\/strong> \u2014 move your rules between sites as JSON, with merge or replace.<\/li>\n<li><strong>Performance first<\/strong> \u2014 compiled rules are cached in a transient and only rebuilt when a rule changes, so sites with 500+ keywords stay fast.<\/li>\n<li><strong>Translation ready<\/strong> \u2014 fully internationalised with the <code>dev-highlighter<\/code> text domain.<\/li>\n<\/ul>\n\n<h4>Where processing runs<\/h4>\n\n<p>Dev Highlighter only filters <code>the_content<\/code> on the front end. It never runs in the admin area, feeds, REST requests, AJAX requests, or cron. It makes no external\/third-party HTTP requests.<\/p>\n\n<h4>Extensible by design<\/h4>\n\n<p>Dev Highlighter exposes documented filters and actions (<code>word_spotlight_condition_evaluators<\/code>, <code>word_spotlight_collect_conditions<\/code>, <code>word_spotlight_sanitize_extra_conditions<\/code>, <code>word_spotlight_rule_builder_fields<\/code>, and the scope-weight filters) so optional add-ons can register new targeting conditions and rule-builder fields without modifying the core engine. An optional premium add-on, <strong>Dev Highlighter Pro<\/strong>, builds on these hooks; it is a separate plugin and is not required for any feature described above.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>dev-highlighter<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>Dev Highlighter \u2192 Keywords<\/strong> and add your first keyword rule.<\/li>\n<li>Visit <strong>Dev Highlighter \u2192 Settings<\/strong> to choose which post types are processed and to set any exclusions.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20modify%20my%20stored%20content%3F\"><h3>Does it modify my stored content?<\/h3><\/dt>\n<dd><p>No. Highlighting happens on output via the <code>the_content<\/code> filter. Your posts are never altered in the database.<\/p><\/dd>\n<dt id=\"will%20it%20break%20my%20html%3F\"><h3>Will it break my HTML?<\/h3><\/dt>\n<dd><p>No. Content is parsed with DOMDocument rather than naive string replacement, and text inside <code>script<\/code>, <code>style<\/code>, <code>textarea<\/code>, <code>pre<\/code>, <code>code<\/code>, and existing <code>a<\/code> tags is skipped.<\/p><\/dd>\n<dt id=\"how%20does%20phrase%20protection%20work%3F\"><h3>How does phrase protection work?<\/h3><\/dt>\n<dd><p>Keywords are sorted longest-first and matched with ordered alternation, so the longest matching phrase at any position always wins.<\/p><\/dd>\n<dt id=\"is%20it%20fast%20on%20large%20sites%3F\"><h3>Is it fast on large sites?<\/h3><\/dt>\n<dd><p>Yes. Compiled rules and the generated stylesheet are cached in a transient and only rebuilt when you change a rule. A fast pre-check skips the DOM entirely on content that contains no keywords.<\/p><\/dd>\n<dt id=\"how%20do%20i%20exclude%20my%20cart%20or%20checkout%20page%3F\"><h3>How do I exclude my cart or checkout page?<\/h3><\/dt>\n<dd><p>Go to <strong>Dev Highlighter \u2192 Settings \u2192 Exclusions<\/strong> and add the page slugs (for example <code>cart<\/code>, <code>checkout<\/code>, <code>my-account<\/code>) or their post IDs.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20contact%20any%20external%20service%3F\"><h3>Does the plugin contact any external service?<\/h3><\/dt>\n<dd><p>No. The free plugin makes no outbound network requests and stores all of its data in your own WordPress database.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added documented extension points (filters\/actions) so optional add-ons can register custom targeting conditions and rule-builder fields without modifying the core engine.<\/li>\n<li>Internal refinements to the rules engine and admin.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: context-aware rules engine \u2014 multiple rules per keyword, each with its own styling, link, and target.<\/li>\n<li>New: rule targeting by Site-Wide, Selected Pages, Selected Posts, Categories, Tags, or Post Types.<\/li>\n<li>New: per-rule exclusions (post\/page IDs, categories, post types) and a priority tiebreaker.<\/li>\n<li>New: specificity-based priority resolution (Page \u203a Post \u203a Category \u203a Tag \u203a Post Type \u203a Site-Wide) \u2014 the most specific rule always wins.<\/li>\n<li>New: visual rule builder with a live preview and smart conflict detection.<\/li>\n<li>New: pluggable condition registry and filters for future conditions.<\/li>\n<li>Existing keywords are automatically migrated to Site-Wide rules \u2014 no action needed.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Highlight, style, and automatically link keywords across your WordPress site with a flexible, context-aware rules engine.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/324047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=324047"}],"author":[{"embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/devshujon"}],"wp:attachment":[{"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=324047"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=324047"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=324047"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=324047"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=324047"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/th.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=324047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}