{"id":361,"date":"2026-10-06T16:14:57","date_gmt":"2026-10-07T00:14:57","guid":{"rendered":"https:\/\/rainier-it.com\/blog\/?p=361"},"modified":"2026-10-21T00:06:41","modified_gmt":"2026-10-21T07:06:41","slug":"shop-orting-free-local-business-directory","status":"publish","type":"post","link":"https:\/\/rainier-it.com\/blog\/shop-orting-free-local-business-directory\/","title":{"rendered":"Shop Orting: How We Built a Free Directory for Every Business in Our Hometown"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>&#8220;Is there a plumber in Orting?&#8221; There are several. Until this month, the fastest way to find one was asking on Facebook.<\/em><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Orting is a small town at the foot of Mount Rainier, and Rainier IT is an Orting business. Our town has about a hundred businesses: tow trucks and taco shops, accountants, a veterinary hospital, child care centers, a doughnut shop, farm stands. If you want to find them, you&#8217;re stuck with a map app that lists half of them and Facebook groups where the answer scrolls away by lunchtime.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So we built <strong>Shop Orting<\/strong> at <a href=\"https:\/\/shoporting.org\" target=\"_blank\" rel=\"noopener\">shoporting.org<\/a>: a free directory of every business in Orting, with hours, a map, &#8220;open now&#8221;, an events calendar and a visitor guide. Listings are free forever. There are no ads, no paid placement and nothing to buy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This post is the tour: what it does, how it&#8217;s built, and a few pieces of code we&#8217;re proud of.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-home-desktop.jpg\" alt=\"The Shop Orting home page: a Daffodil Parade photo behind the headline &quot;Find it here. Keep it local.&quot; with a search box and quick filters\" class=\"wp-image-355\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-home-desktop.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-home-desktop-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-home-desktop-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-home-desktop-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">The home page. The hero photo rotates every two hours between local shots.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udded What&#8217;s on the site<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The whole thing is designed around one question: <em>what are you looking for in Orting, right now?<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>The directory.<\/strong> 99 businesses in 11 categories, each with hours, contact info, photos and a map pin. An &#8220;Open now&#8221; filter does the time math in Pacific time.<\/li>\n\n\n\n<li><strong>A map that stays readable.<\/strong> Nearby pins group into clusters that split apart as you zoom, so downtown doesn&#8217;t turn into a red smear.<\/li>\n\n\n\n<li><strong>Search that understands people.<\/strong> Type &#8220;vet&#8221;, &#8220;mechanic&#8221; or &#8220;donuts&#8221; and you get the animal hospital, the auto shops and the doughnut shop.<\/li>\n\n\n\n<li><strong>Events.<\/strong> 26 community events and counting, each with <em>Add to Google Calendar<\/em> and <em>Apple \/ Outlook<\/em> buttons, plus a calendar you can subscribe to once and forget.<\/li>\n\n\n\n<li><strong>Topic pages.<\/strong> Pages like &#8220;Child Care &amp; Preschools in Orting&#8221; or &#8220;Auto Repair in Orting&#8221; answer the exact searches locals type into Google.<\/li>\n\n\n\n<li><strong>A visitor guide.<\/strong> Annual events, history and getting here, for the thousands of people who come for the Daffodil Parade.<\/li>\n\n\n\n<li><strong>Owner accounts.<\/strong> Businesses claim their listing for free, then update hours, photos and descriptions themselves. Owners can also post their own events.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-directory-map.jpg\" alt=\"The directory page: search box, category chips, business cards and a map with clustered pins\" class=\"wp-image-351\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-directory-map.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-directory-map-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-directory-map-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-directory-map-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">The directory. Pins cluster by area, and the numbers show how many businesses are in each group.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcf1 Built for the phone in your pocket<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most people find a local business on their phone, often while they&#8217;re already in the car. Every page is designed for a phone first, then spread out for a desktop screen. There&#8217;s no app to install.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"900\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-mobile.jpg\" alt=\"Three phones showing the Shop Orting home page, the map with clustered pins, and an event page\" class=\"wp-image-357\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-mobile.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-mobile-300x193.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-mobile-1024x658.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-mobile-768x494.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">Home, map and an event page on a phone.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">On a phone, call, directions and website links are one tap away. The map is a lightweight Leaflet and OpenStreetMap map, with no Google Maps fees. Photos load at the right size for the screen, and every image reserves its space so the page doesn&#8217;t jump around while you&#8217;re trying to tap something.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd0e Search that knows &#8220;vet&#8221; means &#8220;animal hospital&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress search is literal. If a listing says &#8220;animal hospital&#8221; and you type &#8220;vet&#8221;, you get nothing. Real people don&#8217;t search the way businesses describe themselves, so we wrote a small layer on top.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It does two things for each word you type:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Synonyms.<\/strong> A plain list maps everyday words to how businesses actually describe themselves.<\/li>\n\n\n\n<li><strong>Simple stemming.<\/strong> &#8220;Plumbers&#8221; also matches &#8220;plumbing&#8221; and &#8220;plumber&#8221;, and &#8220;donuts&#8221; also matches &#8220;doughnut&#8221;.<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>function so_search_synonyms() {\n\treturn [\n\t\t'oil change'   => &#91; 'auto repair', 'automotive', 'auto services', 'drivetrain' &#93;,\n\t\t'mechanic'     => &#91; 'auto repair', 'automotive', 'auto services', 'drivetrain' &#93;,\n\t\t'vet'          => &#91; 'animal hospital' &#93;,\n\t\t'doctor'       => &#91; 'medical', 'family practice', 'urgent care' &#93;,\n\t\t'realtor'      => &#91; 'real estate', 'realty' &#93;,\n\t\t'donut'        => &#91; 'doughnut' &#93;,\n\t\t'cpa'          => &#91; 'accounting', 'tax' &#93;,\n\t\t'haircut'      => &#91; 'hair', 'barber' &#93;,\n\t\t\/\/ ...and more, added whenever a search comes up empty\n\t];\n}\n\nfunction so_search_variants( $w ) {\n\t$v   = &#91; $w &#93;;\n\t$syn = so_search_synonyms();\n\tforeach ( &#91; $w, rtrim( $w, 's' ) &#93; as $k ) \/\/ \"donuts\" \u2192 \"donut\" for the synonym lookup\n\t\tif ( isset( $syn&#91; $k &#93; ) ) $v = array_merge( $v, $syn&#91; $k &#93; );\n\tforeach ( &#91; 'ies' => 'y', 'ers' => '', 'ing' => '', 'ant' => '', 'ian' => '', 'er' => '', 'es' => '', 's' => '' &#93; as $suf => $rep ) {\n\t\t$n = strlen( $suf );\n\t\tif ( substr( $w, -$n ) === $suf &amp;&amp; strlen( $w ) - $n >= 4 ) { $v[] = substr( $w, 0, -$n ) . $rep; break; }\n\t}\n\treturn array_unique( $v );\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">function<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">so_search_synonyms<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">oil change<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">auto repair<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">automotive<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">auto services<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">drivetrain<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">mechanic<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">     <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">auto repair<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">automotive<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">auto services<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">drivetrain<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">vet<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">animal hospital<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">doctor<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">       <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">medical<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">family practice<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">urgent care<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">realtor<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">real estate<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">realty<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">donut<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">doughnut<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">cpa<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">accounting<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">tax<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">haircut<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">hair<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">barber<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">\t\t<\/span><span style=\"color: #616E88\">\/\/ ...and more, added whenever a search comes up empty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #ECEFF4\">]<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">function<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">so_search_variants<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">v<\/span><span style=\"color: #D8DEE9FF\">   <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">syn<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">so_search_synonyms<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">foreach<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">rtrim<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">s<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">k<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #616E88\">\/\/ &quot;donuts&quot; \u2192 &quot;donut&quot; for the synonym lookup<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">isset<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">syn<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">k<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">v<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">array_merge<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">v<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">syn<\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">k<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">foreach<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">ies<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">y<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">ers<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">ing<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">ant<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">ian<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">er<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">es<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">s<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#93;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">suf<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">rep<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">n<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strlen<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">suf<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">substr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">-$<\/span><span style=\"color: #D8DEE9\">n<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">===<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">suf<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&amp;&amp;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strlen<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">n<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&gt;=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">v<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">substr<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">w<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">-$<\/span><span style=\"color: #D8DEE9\">n<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">rep<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">break;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">array_unique<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">v<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A <code>posts_search<\/code> filter then requires every word you typed to match, with each word allowed to match any of its variants. Multi-word searches stay precise, and single words get forgiving. No search plugin and no external index to keep in sync.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-search-plumber.jpg\" alt=\"Search results for &quot;plumber&quot; showing two plumbing companies and the map\" class=\"wp-image-359\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-search-plumber.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-search-plumber-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-search-plumber-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-search-plumber-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">Searching for &#8220;plumber&#8221; finds the plumbing companies, even though neither listing uses that exact word.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcc5 Events you can put in your own calendar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A town calendar is only useful if people actually see it. So every event page has <strong>Add to Google Calendar<\/strong> and <strong>Apple \/ Outlook (.ics)<\/strong> buttons, and the whole calendar is a live feed you can subscribe to. Subscribe once, and new Orting events show up in your phone&#8217;s calendar on their own.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-events.jpg\" alt=\"Events page showing upcoming Orting events as cards\" class=\"wp-image-353\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-events.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-events-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-events-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-events-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">Upcoming events, with a &#8220;this week&#8221; line at the top.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"380\" height=\"326\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-event-calendar-buttons.jpg\" alt=\"The When &amp; Where card on an event page, with Add to Google Calendar and Apple \/ Outlook buttons\" class=\"wp-image-352\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-event-calendar-buttons.jpg 380w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-event-calendar-buttons-300x257.jpg 300w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><figcaption class=\"wp-element-caption\">One tap to add an event to your calendar.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Calendar files are an old, picky format. Lines longer than 75 bytes must be &#8220;folded&#8221; onto continuation lines, and a multi-byte character like an emoji must never be split in half. Here&#8217;s the folding function that keeps Outlook and Apple Calendar happy:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/** Fold to 75-octet lines as RFC 5545 requires. *\/\nfunction so_ics_fold( $line ) {\n\t$out = ''; $cur = '';\n\tforeach ( preg_split( '\/\/u', $line, -1, PREG_SPLIT_NO_EMPTY ) as $ch ) {\n\t\tif ( strlen( $cur . $ch ) > 74 ) { $out .= $cur . \"\\r\\n \"; $cur = ''; }\n\t\t$cur .= $ch;\n\t}\n\treturn $out . $cur . \"\\r\\n\";\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #616E88\">\/** Fold to 75-octet lines as RFC 5545 requires. *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">function<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">so_ics_fold<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">line<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">out<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">cur<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">foreach<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">preg_split<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">\/\/u<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">line<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">PREG_SPLIT_NO_EMPTY<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">as<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">ch<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strlen<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">cur<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">ch<\/span><span style=\"color: #88C0D0\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">74<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">out<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">cur<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #A3BE8C\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">cur<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;&#39;<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t\t<\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">cur<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">ch<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">\t<\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">out<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">$<\/span><span style=\"color: #D8DEE9\">cur<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">.<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s also a <strong>Subscribe<\/strong> page with RSS feeds for new events, new businesses and new listings in each category. People who just want to know what&#8217;s new can follow along in a feed reader, or have a free service email them, without us ever collecting an email address.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-subscribe.jpg\" alt=\"The Subscribe page with calendar buttons and a list of RSS feeds\" class=\"wp-image-360\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-subscribe.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-subscribe-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-subscribe-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-subscribe-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">Calendar and RSS subscriptions in one place.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udd16 Keeping events fresh without a full-time editor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The hard part of a community calendar is keeping it current. Events are scattered across the library&#8217;s calendar, event sites and flyers. So once a week, a small Python job collects new Orting events from those sources, removes duplicates, fills in the full description and saves each one as a <strong>draft<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;Unit&#93;\nDescription=Run the Shop Orting event harvest every Monday morning\n\n&#91;Timer&#93;\nOnCalendar=Mon *-*-* 07:00:00 America\/Los_Angeles\nRandomizedDelaySec=10min\nPersistent=true\n\n&#91;Install&#93;\nWantedBy=timers.target<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">Unit<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">Description<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">Run the Shop Orting event harvest every Monday morning<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">Timer<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">OnCalendar<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">Mon *-*-* 07:00:00 America\/Los_Angeles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">RandomizedDelaySec<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">10min<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">Persistent<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">true<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">&#91;<\/span><span style=\"color: #D8DEE9FF\">Install<\/span><span style=\"color: #ECEFF4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">WantedBy<\/span><span style=\"color: #ECEFF4\">=<\/span><span style=\"color: #D8DEE9FF\">timers.target<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Nothing goes live automatically. The job posts a summary to our team chat with a link to each draft, and a person reviews and approves each one. Automation does the tedious collecting, and a human makes the call. That&#8217;s how we like to run everything at Rainier IT.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf8 Topic pages, and privacy for home businesses<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Some of the most useful pages are the narrowest. &#8220;Child Care &amp; Preschools in Orting&#8221; lists the licensed centers and preschools we verified against the state&#8217;s child care licensing records.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-child-care-topic.jpg\" alt=\"The Child Care &amp; Preschools in Orting topic page with four provider cards\" class=\"wp-image-350\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-child-care-topic.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-child-care-topic-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-child-care-topic-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-child-care-topic-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">One of 14 topic pages, built around what locals search for.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Some of those providers are family child care homes, which means the &#8220;business address&#8221; is someone&#8217;s house. Those listings, and any other home-based business, say <strong>&#8220;Serves Orting and nearby&#8221;<\/strong> instead of a street address. They get no map pin, and a phone number appears only if the owner publishes it. Being helpful should never mean putting a family&#8217;s home address on the internet.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfea Listings that owners control<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every listing starts from public information. Then the owner can <strong>claim it for free<\/strong> in about two minutes: correct the hours, add photos and a logo, and get a <em>Verified by owner<\/em> badge. After that, it&#8217;s theirs to keep current.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1400\" height=\"875\" src=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-listing.jpg\" alt=\"A business listing page for 1st Chance Towing, with photo, description, contact card and map\" class=\"wp-image-356\" srcset=\"https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-listing.jpg 1400w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-listing-300x188.jpg 300w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-listing-1024x640.jpg 1024w, https:\/\/rainier-it.com\/blog\/wp-content\/uploads\/2026\/10\/shoporting-listing-768x480.jpg 768w\" sizes=\"auto, (max-width: 1400px) 100vw, 1400px\" \/><figcaption class=\"wp-element-caption\">A claimed listing, with a Verified by owner badge, contact details and a map.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Owners sign in to a stripped-down account that goes straight to their own listing. It can only edit their listing and their events, and can&#8217;t touch anyone else&#8217;s page.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f Under the hood<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Layer<\/th><th>What we used<\/th><\/tr><\/thead><tbody><tr><td>CMS<\/td><td>WordPress, with a hand-coded theme and no page builder<\/td><\/tr><tr><td>Data<\/td><td>Custom post types for businesses and events, plus a category taxonomy<\/td><\/tr><tr><td>Map<\/td><td>Leaflet + OpenStreetMap, with marker clustering<\/td><\/tr><tr><td>SEO<\/td><td>Structured data on every page (LocalBusiness, Event, ChildCare and more), XML sitemaps, canonical URLs, IndexNow pings<\/td><\/tr><tr><td>Hosting<\/td><td>Self-hosted on our own infrastructure, behind Cloudflare<\/td><\/tr><tr><td>Automation<\/td><td>A weekly systemd timer for the event harvest, with team-chat notifications for approvals<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A hand-coded theme sounds like more work than a page builder, and on day one it is. But it means pages that load fast on a phone over rural LTE, structured data written for each type of business, and no plugin stack to babysit. For a site meant to serve a town for years, that trade is easy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udf04 Why we did it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rainier IT is an Orting business. When a neighbor&#8217;s shop gets found, the whole town does a little better, and a directory that is free, honest and current is one small way to help with that. No ads, no paid placement, no &#8220;featured&#8221; listings for sale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you run an Orting business:<\/strong> find yours on <a href=\"https:\/\/shoporting.org\" target=\"_blank\" rel=\"noopener\">shoporting.org<\/a> and claim it for free. If you&#8217;re not listed yet, <a href=\"https:\/\/shoporting.org\/add-your-business\/\" target=\"_blank\" rel=\"noopener\">add your business<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>If you want something like this for your town, your organization or your own business:<\/strong> this is the kind of work we do. See our <a href=\"https:\/\/rainier-it.com\/services\/web-design\/\">web design services<\/a>, or <a href=\"https:\/\/rainier-it.com\/contact\/\">get in touch<\/a> and tell us what you&#8217;re trying to build.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How Rainier IT built Shop Orting, a free directory, map and events calendar for every business in Orting, WA, on a hand-coded WordPress theme.<\/p>\n","protected":false},"author":1,"featured_media":354,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,9],"tags":[45,46,44,43],"series":[68],"class_list":["post-361","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guides","category-best-practices","tag-local-business","tag-orting","tag-seo","tag-wordpress","series-how-we-built-it"],"_links":{"self":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts\/361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/comments?post=361"}],"version-history":[{"count":3,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts\/361\/revisions"}],"predecessor-version":[{"id":364,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/posts\/361\/revisions\/364"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/media\/354"}],"wp:attachment":[{"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/media?parent=361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/categories?post=361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/tags?post=361"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/rainier-it.com\/blog\/wp-json\/wp\/v2\/series?post=361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}