{"id":329408,"date":"2026-06-22T07:23:49","date_gmt":"2026-06-22T07:23:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mits-no-lonely-words\/"},"modified":"2026-06-22T12:03:09","modified_gmt":"2026-06-22T12:03:09","slug":"mits-no-lonely-words","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mits-no-lonely-words\/","author":23503449,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.2.0","stable_tag":"2.2.0","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"MITS No Lonely Words","header_author":"MITS","header_description":"Prevents lonely single-letter conjunctions and prepositions at line ends \u2014 Polish typography fix. Processes content once on save, zero regex on frontend.","assets_banners_color":"","last_updated":"2026-06-22 12:03:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/mits.pl","rating":0,"author_block_rating":0,"active_installs":0,"downloads":83,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.1.0":{"tag":"2.1.0","author":"wpaluchmits","date":"2026-06-22 08:01:20"},"2.2.0":{"tag":"2.2.0","author":"wpaluchmits","date":"2026-06-22 12:03:09"}},"upgrade_notice":{"2.0.0":"<p>Major performance improvement. Content is now processed once on save instead of on every frontend request. Re-save existing posts to pre-populate the cache.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3581393,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3581393,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.1.0","2.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"No admin interface needed. The plugin works automatically in the background."}},"plugin_section":[],"plugin_tags":[9812,29743,1370,5126,29742],"plugin_category":[43],"plugin_contributors":[264685],"plugin_business_model":[],"class_list":["post-329408","plugin","type-plugin","status-publish","hentry","plugin_tags-nbsp","plugin_tags-orphans","plugin_tags-polish","plugin_tags-typography","plugin_tags-widows","plugin_category-customization","plugin_contributors-wpaluchmits","plugin_committers-wpaluchmits"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mits-no-lonely-words\/assets\/icon-128x128.png?rev=3581393","icon_2x":"https:\/\/ps.w.org\/mits-no-lonely-words\/assets\/icon-256x256.png?rev=3581393","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>No Lonely Words<\/strong> solves a common Polish typography problem: single-letter conjunctions and prepositions (a, i, w, z, o, u\u2026) left alone at the end of a line. The plugin replaces the trailing space after these words with a non-breaking space (<code>&amp;nbsp;<\/code>) so they always stay attached to the following word.<\/p>\n\n<h4>How it works<\/h4>\n\n<p>Content is processed <strong>once when a post is saved<\/strong> and the result is stored in post meta. On every subsequent frontend request the plugin reads directly from WordPress's in-memory meta cache (no regex, no extra database queries). For posts created before activation, inline processing runs on the first view and is cached for the rest of that request.<\/p>\n\n<h4>Supported words<\/h4>\n\n<p>Polish conjunctions and prepositions: a, i, w, z, o, u, do, ku, na, od, po, we, za, ze, ale, czy, bo, nie, ju\u017c, te\u017c, si\u0119, jak, co, to, oraz, lecz, wi\u0119c, przez, przed, przy, nad, pod, bez, dla, m.in., np., tj. and more.<\/p>\n\n<h4>Supported filters<\/h4>\n\n<ul>\n<li><code>the_title<\/code><\/li>\n<li><code>the_content<\/code><\/li>\n<li><code>the_excerpt<\/code><\/li>\n<li><code>woocommerce_short_description<\/code><\/li>\n<li><code>term_description<\/code><\/li>\n<li><code>widget_text_content<\/code><\/li>\n<li><code>single_cat_title<\/code><\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>PHP 8.0+, WordPress 6.0+<\/li>\n<\/ul>\n\n<p>Developed and maintained by <strong><a href=\"https:\/\/mits.pl\">MITS<\/a><\/strong>, a WordPress agency. We build fast, reliable WordPress sites for businesses in Poland and beyond.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin does not collect any personal data and does not make any external HTTP requests.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>no-lonely-words<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin via <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Re-save any existing posts to pre-process their content, or let the plugin handle them inline on the first view.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20affect%20the%20editor%3F\"><h3>Does it affect the editor?<\/h3><\/dt>\n<dd><p>No. The plugin only modifies the <strong>output<\/strong> of content filters. The raw post content in the database and in the editor stays unchanged.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Product titles, short descriptions, and full descriptions are all supported via dedicated WooCommerce filters.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20plugins%3F\"><h3>Does it work with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. Processed content is stored in post meta (a standard WordPress database table), so it survives full-page cache flushes and is always correct regardless of caching setup.<\/p><\/dd>\n<dt id=\"how%20do%20i%20process%20existing%20posts%3F\"><h3>How do I process existing posts?<\/h3><\/dt>\n<dd><p>Go to <strong>Posts \u2192 All Posts<\/strong> (or Products), select all, and use the <strong>Bulk Edit \u2192 Update<\/strong> action. This triggers <code>save_post<\/code> for each post, which processes and stores the content. Alternatively, any post re-saved individually is processed immediately.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wpml%20or%20polylang%3F\"><h3>Does it work with WPML or Polylang?<\/h3><\/dt>\n<dd><p>The plugin uses standard WordPress filters and post meta, so it is compatible with WPML and Polylang. Each language version of a post is stored and processed independently.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.2.0<\/h4>\n\n<ul>\n<li><code>the_content<\/code> filter now skips pages built with Elementor, Beaver Builder, or Divi. These builders replace <code>the_content<\/code> at priority 12 with their own fully-rendered HTML; running <code>mitsnolo_process<\/code> on that output corrupted widget markup (carousel, nested sections). The fix has no effect on standard posts\/pages.<\/li>\n<li>Each save now stores the previous version of the cache in <code>_no_lonely_words[prev]<\/code>.<\/li>\n<li>Added admin metabox (post sidebar) with \"Wyczy\u015b\u0107 cache\" and \"Przywr\u00f3\u0107 poprzedni\u0105\" buttons for manual revert.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Renamed all functions and constants to use the <code>mitsnolo_<\/code> prefix (4+ characters).<\/li>\n<li>Added <code>wp_kses_post()<\/code> escaping to content\/excerpt filter callbacks.<\/li>\n<li>Added <code>wp_kses()<\/code> escaping with inline-tag allowlist to title\/heading filter callbacks.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Rewrite: process on <code>save_post<\/code>, store result in postmeta. Zero regex on frontend requests.<\/li>\n<li>Static in-request cache layer for repeated filter calls within a single page load.<\/li>\n<li>Fallback inline processing for posts without cached meta (e.g. created before activation).<\/li>\n<li><code>the_title<\/code> filter now correctly receives the post ID as the second argument.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Polish typography fix. Prevents lonely conjunctions at line ends. Processes content once on save, zero overhead on frontend.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/329408","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=329408"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpaluchmits"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=329408"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=329408"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=329408"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=329408"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=329408"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=329408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}