<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Janie Art</title>
	<atom:link href="https://janieart.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://janieart.com</link>
	<description>More Than Websites</description>
	<lastBuildDate>Thu, 11 Dec 2025 16:45:23 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://janieart.com/wp-content/uploads/2016/11/cropped-ico-32x32.png</url>
	<title>Janie Art</title>
	<link>https://janieart.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to Fix the Divi 5 Viewport Zoom Error (Bulletproof Method)</title>
		<link>https://janieart.com/how-to-fix-the-divi-5-viewport-zoom-error-bulletproof-method/</link>
		
		<dc:creator><![CDATA[janiebug]]></dc:creator>
		<pubDate>Mon, 08 Dec 2025 18:50:57 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Problem solved]]></category>
		<category><![CDATA[Divi 5]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Speed Tests]]></category>
		<category><![CDATA[Optimization]]></category>
		<guid isPermaLink="false">https://janieart.com/?p=29672</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="et_pb_section_1 et_pb_section et_section_regular et_flex_section">
<div class="et_pb_row_2 et_pb_row et_flex_row">
<div class="et_pb_column_2 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24">
<div class="et_pb_text_4 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module"><div class="et_pb_text_inner"><p data-start="182" data-end="262"><span style="color: #e09900;"><strong data-start="521" data-end="535">Important:</strong> This method requires access to your WordPress site’s filesystem. You must be able to upload files to the <code data-start="641" data-end="666">/wp-content/mu-plugins/</code> directory via SFTP, SSH, or your hosting control panel. Users who only have access to the WordPress admin dashboard cannot use MU plugins.</span></p>
<p data-start="182" data-end="262">If you’ve been using <strong data-start="203" data-end="213">Divi 5</strong>, you might have run into this frustrating error during your speed tests:</p>
<blockquote data-start="264" data-end="327">
<p data-start="266" data-end="327">“Disabling zooming is problematic for users with low vision…”</p>
</blockquote>
<p data-start="329" data-end="531">I know I did. No matter what I tried in my child theme or <code data-start="387" data-end="402">functions.php</code>, Divi just kept printing its own viewport tag. Zooming was blocked, and Lighthouse kept flagging it as an accessibility problem.</p>
<p data-start="533" data-end="632">After some digging, I found the <strong data-start="565" data-end="600">only method that actually works</strong>  and it’s surprisingly simple.</p>
<p data-start="533" data-end="632">
<hr data-start="634" data-end="637" />
<h2 data-start="639" data-end="662"><strong data-start="642" data-end="662"></strong></h2>
<p><strong data-start="642" data-end="662"></strong></p>
<h2 data-start="639" data-end="662"><strong data-start="642" data-end="662">Why this happens</strong></h2>
<p data-start="664" data-end="815">Divi 5 now injects the viewport meta tag <strong data-start="705" data-end="735">after your theme code runs</strong>, which is why normal fixes don’t work. The problem tag usually looks like this:</p>
</div>
<div class="et_pb_code_3 et_pb_code et_pb_module"><div class="et_pb_code_inner"><div class="code-container">
  <pre><code id="myCode">
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"&gt;
  </code></pre>
  <button class="copy-btn" onclick="copyCode(this)">Copy Code</button>
</div>

<style>
.code-container {
  position: relative;
  background: #2d2d2d;
  color: #f8f8f2;
  padding: 20px;
  border-radius: 8px;
  font-family: monospace;
  overflow-x: auto;
}
.copy-btn {
  position: absolute;
  top: 10px;
  right: 10px;
  background: #6272a4;
  color: #fff;
  border: none;
  padding: 6px 12px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 0.9em;
  transition: background 0.2s;
}
.copy-btn:hover {
  background: #50fa7b;
  color: #000;
}
</style>

<script>
function copyCode(button) {
  var code = document.getElementById("myCode").innerText;
  navigator.clipboard.writeText(code).then(function() {
    button.innerText = "Copied";
    // Optional: reset back to "Copy Code" after 2 seconds
    setTimeout(function() {
      button.innerText = "Copy Code";
    }, 2000);
  });
}
</script>
</div></div>
</div>

<div class="et_pb_text_5 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module"><div class="et_pb_text_inner"><p data-start="934" data-end="1061">The issue is with <code data-start="952" data-end="971">maximum-scale=1.0</code> and <code data-start="976" data-end="994">user-scalable=no</code>. They prevent users from zooming — which is bad for accessibility.</p>
<p data-start="934" data-end="1061">
<hr data-start="1063" data-end="1066" />
<h2 data-start="1068" data-end="1108"><strong data-start="1071" data-end="1108"></strong></h2>
<h2 data-start="1068" data-end="1108"><strong data-start="1071" data-end="1108">The fix I used: a Must-Use Plugin</strong></h2>
<p data-start="1110" data-end="1257">Instead of fighting Divi, I created a <strong data-start="1148" data-end="1166">tiny MU-plugin</strong>. “MU” stands for <em data-start="1184" data-end="1194">Must-Use</em> — these plugins run <strong data-start="1215" data-end="1230">before Divi</strong> and can’t be overridden.</p>
<p data-start="1259" data-end="1277">Here’s what I did:</p>
<p data-start="1282" data-end="1360">1.  went to <code data-start="1292" data-end="1317">/wp-content/mu-plugins/</code> (created the folder if it didn’t exist).</p>
<p data-start="1364" data-end="1417">2. Created a new file called <code data-start="1390" data-end="1414">force-viewport-fix.php</code>.</p>
<p data-start="1421" data-end="1438">3. Pasted this code:</p>
</div></div>
</div>
</div>

<div class="et_pb_row_3 et_pb_row et_flex_row">
<div class="et_pb_column_3 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24">
<div class="et_pb_code_4 et_pb_code et_pb_module"><div class="et_pb_code_inner"><div class="reusable-code-module">
  <!-- Hidden raw code storage -->
  <textarea class="raw-code" style="display:none;">
<?php
/*
Plugin Name: Force Viewport Fix
Description: Ensures accessible viewport tag overrides Divi 5.
*/

// Remove Divi's viewport tag
add_action('wp_head', function() {
    remove_action('wp_head', 'et_add_viewport_meta');
}, 0);

// Add correct viewport tag
add_action('wp_head', function() {
    echo '<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes">&#8216; . &#8220;\n&#8221;;
}, 1);
  </textarea>

  <!-- Displayed code -->
  <pre><code class="code-content"></code></pre>
  <button class="copy-btn">Copy Code</button>
</div>

<style>
.reusable-code-module {
  position: relative;
  margin-bottom: 20px;
}
.reusable-code-module pre {
  padding: 20px;
  border-radius: 8px;
  background: #2d2d2d;
  color: #f8f8f2;
  font-family: monospace;
  overflow-x: auto;
}
.reusable-code-module .copy-btn {
  position: absolute;
  top: 10px;
  right: 10px;
  background: #6272a4;
  color: #fff;
  border: none;
  padding: 6px 12px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 0.9em;
  transition: background 0.2s;
}
.reusable-code-module .copy-btn:hover {
  background: #50fa7b;
  color: #000;
}
</style>

<script>
document.querySelectorAll('.reusable-code-module').forEach(function(module){
  var codeEl = module.querySelector('.code-content');
  var rawCode = module.querySelector('.raw-code').value;
  var button = module.querySelector('.copy-btn');

  // Display code safely (escape for HTML)
  codeEl.textContent = rawCode;

  // Copy button
  button.addEventListener('click', function(){
    navigator.clipboard.writeText(rawCode).then(function(){
      button.innerText = "Copied";
      setTimeout(function(){ button.innerText = "Copy Code"; }, 2000);
    });
  });
});
</script>
</div></div>

<div class="et_pb_text_6 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module"><div class="et_pb_text_inner"><p data-start="1883" data-end="1899">And that was it.</p>
<hr data-start="1901" data-end="1904" />
<h2 data-start="1906" data-end="1925"><strong data-start="1909" data-end="1925"></strong></h2>
<h2 data-start="1906" data-end="1925"><strong data-start="1909" data-end="1925"></strong></h2>
<h2 data-start="1906" data-end="1925"><strong data-start="1909" data-end="1925">Why it works</strong></h2>
<ul data-start="1927" data-end="2119">
<li data-start="1927" data-end="1959">
<p data-start="1929" data-end="1959">MU-plugins always load first</p>
</li>
<li data-start="1960" data-end="2011">
<p data-start="1962" data-end="2011">We remove Divi’s viewport with an output buffer</p>
</li>
<li data-start="2012" data-end="2059">
<p data-start="2014" data-end="2059">Then we insert a clean, accessible viewport</p>
</li>
<li data-start="2060" data-end="2119">
<p data-start="2062" data-end="2119">Divi can’t override it, so Lighthouse no longer complains</p>
</li>
</ul>
<p>&nbsp;</p>
<hr data-start="2121" data-end="2124" />
<h2 data-start="2126" data-end="2158"><strong data-start="2129" data-end="2158"></strong></h2>
<h2 data-start="2126" data-end="2158"><strong data-start="2129" data-end="2158"></strong></h2>
<h2 data-start="2126" data-end="2158"><strong data-start="2129" data-end="2158">The viewport tag you want</strong></h2>
</div></div>

<div class="et_pb_code_5 et_pb_code et_pb_module"><div class="et_pb_code_inner"><div class="reusable-code-module">
  <!-- Hidden raw code storage -->
  <textarea class="raw-code" style="display:none;">
&lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes&gt;
  </textarea>

  <!-- Displayed code -->
  <pre><code class="code-content"></code></pre>
  <button class="copy-btn">Copy Code</button>
</div>

<style>
.reusable-code-module {
  position: relative;
  margin-bottom: 20px;
}
.reusable-code-module pre {
  padding: 20px;
  border-radius: 8px;
  background: #2d2d2d;
  color: #f8f8f2;
  font-family: monospace;
  overflow-x: auto;
}
.reusable-code-module .copy-btn {
  position: absolute;
  top: 10px;
  right: 10px;
  background: #6272a4;
  color: #fff;
  border: none;
  padding: 6px 12px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 0.9em;
  transition: background 0.2s;
}
.reusable-code-module .copy-btn:hover {
  background: #50fa7b;
  color: #000;
}
</style>

<script>
document.querySelectorAll('.reusable-code-module').forEach(function(module){
  var codeEl = module.querySelector('.code-content');
  var rawCode = module.querySelector('.raw-code').value;
  var button = module.querySelector('.copy-btn');

  // Display code safely (escape for HTML)
  codeEl.textContent = rawCode;

  // Copy button
  button.addEventListener('click', function(){
    navigator.clipboard.writeText(rawCode).then(function(){
      button.innerText = "Copied";
      setTimeout(function(){ button.innerText = "Copy Code"; }, 2000);
    });
  });
});
</script>
</div></div>

<div class="et_pb_text_7 et_pb_text et_pb_bg_layout_light et_pb_module et_flex_module"><div class="et_pb_text_inner"><p data-start="2244" data-end="2351">This lets users zoom normally,  which is essential for people with low vision or anyone using small screens.</p>
<hr data-start="2353" data-end="2356" />
<h2 data-start="2358" data-end="2379"><strong data-start="2361" data-end="2379"></strong></h2>
<h2 data-start="2358" data-end="2379"><strong data-start="2361" data-end="2379"></strong></h2>
<h2 data-start="2358" data-end="2379"><strong data-start="2361" data-end="2379">Final thoughts</strong></h2>
<p data-start="2381" data-end="2556">Divi 5 is amazing, but the locked viewport tag was a huge headache. This MU-plugin solution is simple, effective, and keeps your site accessible  no hacks, no ignored code.</p>
<p data-start="2558" data-end="2608">If you’ve been stuck like I was,  this is your fix.</p>
<p data-start="2558" data-end="2608">
</div></div>

<div class="et_pb_image_1 et_pb_image et_pb_module et_flex_module"><span class="et_pb_image_wrap"><img fetchpriority="high" decoding="async" src="https://janieart.com/wp-content/uploads/2025/12/ascore.png?_t=1765229465" title="ascore" width="978" height="530" srcset="https://janieart.com/wp-content/uploads/2025/12/ascore.png 978w, https://janieart.com/wp-content/uploads/2025/12/ascore-300x163.png 300w, https://janieart.com/wp-content/uploads/2025/12/ascore-768x416.png 768w" sizes="(max-width: 978px) 100vw, 978px" class="wp-image-29813" /></span></div>
</div>
</div>
</div>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
