<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sarp Efe</title>
    <description>The latest articles on DEV Community by Sarp Efe (@sarpefe).</description>
    <link>https://dev.to/sarpefe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3874658%2F246ddb31-7c6c-4217-aa38-08fe4dd2df98.jpg</url>
      <title>DEV Community: Sarp Efe</title>
      <link>https://dev.to/sarpefe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarpefe"/>
    <language>en</language>
    <item>
      <title>After 3 Years of Managing WooCommerce Stores, I Found the Bug Cache Plugins Can't Fix</title>
      <dc:creator>Sarp Efe</dc:creator>
      <pubDate>Tue, 21 Apr 2026 04:41:31 +0000</pubDate>
      <link>https://dev.to/sarpefe/after-3-years-of-managing-woocommerce-stores-i-found-the-bug-cache-plugins-cant-fix-463b</link>
      <guid>https://dev.to/sarpefe/after-3-years-of-managing-woocommerce-stores-i-found-the-bug-cache-plugins-cant-fix-463b</guid>
      <description>&lt;p&gt;Here's a scene I've played out dozens of times:&lt;/p&gt;

&lt;p&gt;A client DMs me. Their shop is slow. Checkout takes 4 seconds on a good day. They've already paid for WP Rocket. They've already paid for a decent managed host. They can't figure out what's wrong, and they've started to suspect WordPress is "just slow."&lt;/p&gt;

&lt;p&gt;So I log in, crack open Query Monitor, and stare at the numbers for a while.&lt;/p&gt;

&lt;p&gt;Every single time, the answer was the same. And it was never where anyone expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I kept trying first (and why it kept failing)
&lt;/h2&gt;

&lt;p&gt;For years, my debugging playbook for a slow WooCommerce site went like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install WP Rocket.&lt;/strong&gt; Page cache, preload, minify. Usually helped the homepage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the CDN.&lt;/strong&gt; Sometimes Cloudflare had a weird origin rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minify CSS/JS.&lt;/strong&gt; Autoptimize or Perfmatters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade the hosting plan.&lt;/strong&gt; The "throw money at it" phase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blame WooCommerce.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 1 fixed the homepage. Step 2 shaved TTFB for anonymous visitors. Step 3 chipped off 200ms on LCP. Step 4 rarely made a real difference once a store was above basic shared hosting. Step 5 was cope.&lt;/p&gt;

&lt;p&gt;But here's the thing. The pages clients actually cared about — &lt;strong&gt;cart, checkout, my-account, any logged-in view&lt;/strong&gt; — never got meaningfully faster.&lt;/p&gt;

&lt;p&gt;Why? Because all of those pages are per-user. They can't be cached. Every request runs the full PHP pipeline from scratch, and no amount of page cache or CDN fixes that.&lt;/p&gt;

&lt;p&gt;If your cart page is slow after installing WP Rocket, it's not WP Rocket's fault. It's not built to help there.&lt;/p&gt;




&lt;h2&gt;
  
  
  The moment it finally clicked
&lt;/h2&gt;

&lt;p&gt;One day I was profiling a site with about 38 active plugins. Real store, real traffic, around 120K monthly pageviews. The owner was about to migrate to Shopify because they "couldn't take it anymore."&lt;/p&gt;

&lt;p&gt;I ran Query Monitor on the cart page. The database queries looked fine. Templates rendered fast. Nothing obvious.&lt;/p&gt;

&lt;p&gt;Then I looked at the hook timeline.&lt;/p&gt;

&lt;p&gt;Before WordPress had even finished firing &lt;code&gt;init&lt;/code&gt;, &lt;strong&gt;35 plugins had already executed code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every. Single. Request.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Their Mailchimp integration booted on every page view, even when nobody was subscribing.&lt;/li&gt;
&lt;li&gt;Their Wordfence fired on every admin-ajax call, including the cart fragments refresh that runs every few seconds.&lt;/li&gt;
&lt;li&gt;Their Elementor Pro loaded its full runtime on a WooCommerce REST API request that had nothing to do with Elementor.&lt;/li&gt;
&lt;li&gt;Their Google Listings sync module spun up on every frontend request, even though the actual sync only runs on cron.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The total? About &lt;strong&gt;410ms of PHP execution&lt;/strong&gt; before WordPress even started pulling the cart contents.&lt;/p&gt;

&lt;p&gt;Four hundred and ten milliseconds. On every single request. Just for plugins that were doing nothing useful on that page.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why nothing else fixes this
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable part. Once I saw this, I started looking at it on every site I managed. It was always there. And every tool I was using had a blind spot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WP Rocket / WP Super Cache / LiteSpeed Cache&lt;/strong&gt; — Caches the &lt;em&gt;output&lt;/em&gt;. If you can't cache the output (cart, checkout, logged-in users), it does nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perfmatters&lt;/strong&gt; — Great for dequeuing CSS and JS per page. But the plugin itself still boots. Its PHP still runs. You save bytes, not execution time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Monitor&lt;/strong&gt; — Shows you the problem beautifully. Doesn't fix it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object cache (Redis)&lt;/strong&gt; — Helps &lt;code&gt;get_option&lt;/code&gt; lookups. Doesn't stop a plugin's &lt;code&gt;plugins_loaded&lt;/code&gt; hook from running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade hosting&lt;/strong&gt; — Gives you a faster CPU to run the same wasted code on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of them stop plugins from booting. They all accept the boot overhead as a given and optimize around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually built
&lt;/h2&gt;

&lt;p&gt;Honestly, at first I tried to solve this the manual way. I'd write &lt;code&gt;mu-plugin&lt;/code&gt; code per client that would unhook a specific plugin on a specific request class. It worked, but it was bespoke for every site, fragile, and nobody else on my team could maintain it.&lt;/p&gt;

&lt;p&gt;After the fifth client, I got tired of it and built a real tool.&lt;/p&gt;

&lt;p&gt;The idea is embarrassingly simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before WordPress loads its plugins, look at the incoming request. Decide which plugins are actually relevant to this request. Don't load the rest.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jetpack doesn't need to boot on a cart AJAX refresh. FluentSMTP only needs to boot when an email is being dispatched. Your backup plugin doesn't need to live in memory during a REST API call for product stock.&lt;/p&gt;

&lt;p&gt;So you look at the request class — frontend guest GET, frontend logged-in, REST API, admin-ajax, admin, cron — and you skip the plugins that aren't needed.&lt;/p&gt;

&lt;p&gt;That's the whole thesis.&lt;/p&gt;

&lt;p&gt;I shipped it as &lt;a href="https://accelerator.for-wordpress.org" rel="noopener noreferrer"&gt;Accelerator&lt;/a&gt;. The current version (v0.2.0.1) ships with a library of rules for 207 of the most common WordPress plugins, so you don't have to figure out the matrix by hand. There's a setup wizard that scans your site, suggests which plugins can be safely unloaded on which request classes, and runs everything in &lt;strong&gt;Shadow Mode&lt;/strong&gt; first — meaning it measures the gain for 24 hours &lt;em&gt;without&lt;/em&gt; actually changing anything, so you can see the impact before you commit.&lt;/p&gt;

&lt;p&gt;On my own production site, the frontend guest GET p50 went from &lt;strong&gt;715ms to 271ms&lt;/strong&gt;. A 62% reduction, 444ms absolute. Measured, not estimated — the tool ships with a telemetry dashboard that tracks before/after per request class.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;This isn't for every WordPress site. If I were writing a pure marketing post I'd leave this out, but I'm not, so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your site runs fewer than ~10 plugins, the gain is marginal. You don't have enough boot overhead to matter.&lt;/li&gt;
&lt;li&gt;If you're on WordPress.com, you can't install custom plugins, so it's moot.&lt;/li&gt;
&lt;li&gt;If your real bottleneck is the database (10,000-product WooCommerce store on overloaded MySQL), this won't help you there. Different problem.&lt;/li&gt;
&lt;li&gt;If you're on oversold shared hosting, upgrade the host first.&lt;/li&gt;
&lt;li&gt;If you're shopping for "the cheapest performance plugin," it's not built for that segment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool works best on WooCommerce stores running 20-40 active plugins. Which, in practice, is most of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I wish someone had told me three years ago
&lt;/h2&gt;

&lt;p&gt;If you're managing a WooCommerce store and WP Rocket hasn't been enough, stop stacking more cache layers. The plugins you've accumulated over the years are quietly loading on every single request. That's the tax you're paying.&lt;/p&gt;

&lt;p&gt;You have three options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit and prune aggressively.&lt;/strong&gt; Go through every plugin. Ask "is this running on every request? Does it need to?" Remove the ones you can. This is the free option. It's also the most painful, and it has a floor — at some point you &lt;em&gt;do&lt;/em&gt; need those plugins, just not on every request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write per-site code to unhook them conditionally.&lt;/strong&gt; This is what I did for years. It works. It doesn't scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use a tool that does this systematically.&lt;/strong&gt; Whether it's mine or not, the category exists now. Look for anything that talks about "conditional plugin loading" or "request-class awareness." Don't accept substitutes that only cache output — that's a different layer and it doesn't reach the pages that matter.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Whichever route you take, the important thing is to stop blaming WordPress for a problem that lives one layer above it.&lt;/p&gt;




&lt;p&gt;If you're curious about the tool, &lt;a href="https://accelerator.for-wordpress.org" rel="noopener noreferrer"&gt;Accelerator is here&lt;/a&gt;. It's in closed beta right now. If you're running a WooCommerce store with a heavy plugin stack and you want to help me stress-test it on a real site, reply in the comments or email me at &lt;code&gt;sarp@for-wordpress.org&lt;/code&gt;. I'm manually onboarding testers and I'll walk you through the setup.&lt;/p&gt;

&lt;p&gt;Happy to answer technical questions about the approach in the comments — especially if you've hit this bottleneck and solved it a different way. I want to hear it.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webperf</category>
      <category>woocommerce</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Replaced a $30/Month Live Chat Tool with a Telegram Bot on WordPress</title>
      <dc:creator>Sarp Efe</dc:creator>
      <pubDate>Sun, 12 Apr 2026 09:33:23 +0000</pubDate>
      <link>https://dev.to/sarpefe/i-replaced-a-30month-live-chat-tool-with-a-telegram-bot-on-wordpress-bpk</link>
      <guid>https://dev.to/sarpefe/i-replaced-a-30month-live-chat-tool-with-a-telegram-bot-on-wordpress-bpk</guid>
      <description>&lt;p&gt;Every WordPress live chat tool I looked at cost money. A lot of it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tidio: $29/month&lt;/li&gt;
&lt;li&gt;LiveChat: $24/month per agent
&lt;/li&gt;
&lt;li&gt;Crisp: $25/month&lt;/li&gt;
&lt;li&gt;Intercom: don't even ask&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a solo developer just launching a WordPress plugin shop, I was going to spend more on the chat tool than I'd make in my first month of sales.&lt;/p&gt;

&lt;p&gt;So I looked at what these tools actually do.&lt;/p&gt;

&lt;p&gt;A visitor types a message → it goes to their server → their server pings my phone → I reply → it goes back through their server → visitor sees it.&lt;/p&gt;

&lt;p&gt;That's it. That's the whole service. $300/year for a relay.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alternative
&lt;/h2&gt;

&lt;p&gt;Telegram's Bot API does the same thing. For free.&lt;/p&gt;

&lt;p&gt;So I built a WordPress plugin that connects directly to it — no relay server, no third-party storage, no monthly fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visitor sends a message on your WordPress site&lt;/li&gt;
&lt;li&gt;Plugin sends it to your Telegram bot via Bot API&lt;/li&gt;
&lt;li&gt;You get an instant Telegram notification on your phone&lt;/li&gt;
&lt;li&gt;You reply in Telegram&lt;/li&gt;
&lt;li&gt;Visitor sees your reply on the site in real time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the whole flow. Nothing in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Implementation
&lt;/h2&gt;

&lt;p&gt;For anyone curious about the internals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Webhook-based&lt;/strong&gt; — not polling. Telegram sends events to your server instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypted token storage&lt;/strong&gt; — bot token encrypted with AES-256-CBC using your WordPress secret key before database storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local conversation history&lt;/strong&gt; — all chats stored in your own WordPress database, full history in WP admin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unlimited agents&lt;/strong&gt; — add your whole team to a Telegram group, no per-seat pricing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No external dependency&lt;/strong&gt; except Telegram API itself
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified webhook handler&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle_webhook&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'php://input'&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$chat_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'chat'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="nv"&gt;$text&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'text'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

        &lt;span class="c1"&gt;// Store message, notify admin via Telegram&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;store_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$chat_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$text&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;notify_admin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$chat_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$text&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What It Can't Do
&lt;/h2&gt;

&lt;p&gt;Being honest here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No AI chatbot or automated responses&lt;/li&gt;
&lt;li&gt;No proactive messaging (you can't initiate conversations)&lt;/li&gt;
&lt;li&gt;Requires a Telegram account&lt;/li&gt;
&lt;li&gt;No fancy analytics dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need AI responses or have a large support team with complex routing, a dedicated tool is worth the cost.&lt;/p&gt;

&lt;p&gt;But if you're a solo developer or small team who just needs to answer customer questions quickly — Telegram is already on your phone, notifications are instant, and the setup takes 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;I've been running this on my own site for months. It works. The notification is faster than most dedicated tools. I haven't paid a single monthly fee.&lt;/p&gt;

&lt;p&gt;I packaged it as a plugin called WP-TG Live Support Chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://tglivechat.for-wordpress.org" rel="noopener noreferrer"&gt;https://tglivechat.for-wordpress.org&lt;/a&gt; — you can actually send a message and see the flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product page:&lt;/strong&gt; &lt;a href="https://for-wordpress.org/product/wp-tg-live-support-chat-plugin-turn-telegram-into-your-free-live-chat-helpdesk/" rel="noopener noreferrer"&gt;https://for-wordpress.org/product/wp-tg-live-support-chat-plugin-turn-telegram-into-your-free-live-chat-helpdesk/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Point
&lt;/h2&gt;

&lt;p&gt;Before paying for any SaaS tool, ask what it's actually doing.&lt;/p&gt;

&lt;p&gt;A lot of them are sitting between two free APIs, charging you monthly for the connection. Sometimes the middleware is worth it — great UI, reliability guarantees, dedicated support. &lt;/p&gt;

&lt;p&gt;But sometimes you can build the connection yourself in a weekend and own it forever.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you replaced a SaaS tool with something you built yourself? What was it?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>telegram</category>
      <category>webdev</category>
      <category>php</category>
    </item>
  </channel>
</rss>
