<?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: Дарья</title>
    <description>The latest articles on DEV Community by Дарья (@watch).</description>
    <link>https://dev.to/watch</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4089893%2Fbcf87760-5a1c-43fa-a360-e82145b4ee65.png</url>
      <title>DEV Community: Дарья</title>
      <link>https://dev.to/watch</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/watch"/>
    <language>en</language>
    <item>
      <title>Hreflang Mistakes That Killed My Google Traffic for 3 Weeks</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Tue, 29 Sep 2026 09:08:38 +0000</pubDate>
      <link>https://dev.to/watch/hreflang-mistakes-that-killed-my-google-traffic-for-3-weeks-32ec</link>
      <guid>https://dev.to/watch/hreflang-mistakes-that-killed-my-google-traffic-for-3-weeks-32ec</guid>
      <description>&lt;p&gt;My site serves content in English, Chinese, and Japanese. When I added hreflang tags, I expected a traffic boost. Instead, I lost 40% of my Google impressions for three weeks.&lt;/p&gt;

&lt;p&gt;Here are the four mistakes I made and how I fixed each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: Self-Referencing Tags Were Missing
&lt;/h2&gt;

&lt;p&gt;Every page needs an hreflang tag pointing to itself. I only added tags for the alternate languages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- WRONG --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"zh-Hans"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/zh/page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"ja"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/ja/page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- CORRECT --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"zh-Hans"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/zh/page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"ja"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/ja/page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without the self-referencing tag, Google treats the page as if hreflang doesn't exist at all. It's the most common mistake in every hreflang audit I've seen, and it's the one that bit me hardest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2: x-default Was Pointing to the Wrong URL
&lt;/h2&gt;

&lt;p&gt;I set &lt;code&gt;x-default&lt;/code&gt; to my homepage instead of the current page's English version. The &lt;code&gt;x-default&lt;/code&gt; tag tells Google which URL to show users whose language doesn't match any of your hreflang entries. It should point to the same page in your primary language — not to a generic homepage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- WRONG --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- CORRECT --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;hreflang=&lt;/span&gt;&lt;span class="s"&gt;"x-default"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/current-page/"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single mistake caused Google to show my Chinese pages to English-speaking users for two weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: Language Code Format Was Inconsistent
&lt;/h2&gt;

&lt;p&gt;I used &lt;code&gt;zh&lt;/code&gt; in some places and &lt;code&gt;zh-Hans&lt;/code&gt; in others. Google treats these as different languages. Pick one format and use it everywhere — in hreflang tags, in your sitemap, in your HTML lang attribute. I standardized on &lt;code&gt;zh-Hans&lt;/code&gt; for Simplified Chinese because it's more specific.&lt;/p&gt;

&lt;p&gt;The same applies to Japanese: use &lt;code&gt;ja&lt;/code&gt;, not &lt;code&gt;jp&lt;/code&gt;. Country codes and language codes are not the same thing, and mixing them up is silent — no error, just wrong behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 4: Translated Pages Had Identical Titles and Descriptions
&lt;/h2&gt;

&lt;p&gt;My Chinese and Japanese pages initially had the same English meta titles because I forgot to translate the Rank Math SEO fields. Google saw three pages with identical metadata pointing at each other via hreflang and got confused about which one to rank.&lt;/p&gt;

&lt;p&gt;After translating every title and description, Google correctly started showing the Chinese version to Chinese-language searchers and the Japanese version to Japanese searchers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Recovery
&lt;/h2&gt;

&lt;p&gt;After fixing all four issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Week 1:&lt;/strong&gt; No change (Google was recrawling)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2:&lt;/strong&gt; Impressions returned to baseline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; Impressions exceeded pre-hreflang levels by 15%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Chinese and Japanese pages started ranking independently in their respective regional searches, which was the whole point.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Verify Hreflang Now
&lt;/h2&gt;

&lt;p&gt;I run a monthly check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch every page in my sitemap&lt;/li&gt;
&lt;li&gt;Parse hreflang tags from the HTML&lt;/li&gt;
&lt;li&gt;Verify every page has a self-referencing tag&lt;/li&gt;
&lt;li&gt;Verify every alternate URL returns 200&lt;/li&gt;
&lt;li&gt;Verify x-default points to the English version of the same page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're running a multilingual site — especially one with visual content like &lt;a href="https://watchwalls.pro/apple-watch-series-12-wallpaper/" rel="noopener noreferrer"&gt;Apple Watch wallpapers for the Series 12&lt;/a&gt; where users search in their own language — hreflang is non-negotiable. But it has to be implemented correctly, or it does more harm than good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always include a self-referencing hreflang tag&lt;/li&gt;
&lt;li&gt;Set x-default to the current page in your primary language, not the homepage&lt;/li&gt;
&lt;li&gt;Use consistent language codes everywhere (zh-Hans, not zh)&lt;/li&gt;
&lt;li&gt;Translate SEO metadata, not just visible content&lt;/li&gt;
&lt;li&gt;Monitor impressions weekly after any hreflang change — problems are silent&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Building a multilingual WordPress site with 200+ pages taught me that internationalization is 20% translation and 80% technical SEO.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>wordpress</category>
      <category>internationalization</category>
    </item>
    <item>
      <title>How I Cut My WordPress Blog From 110KB to 60KB Per Page</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Wed, 23 Sep 2026 03:59:27 +0000</pubDate>
      <link>https://dev.to/watch/how-i-cut-my-wordpress-blog-from-110kb-to-60kb-per-page-603</link>
      <guid>https://dev.to/watch/how-i-cut-my-wordpress-blog-from-110kb-to-60kb-per-page-603</guid>
      <description>&lt;p&gt;My WordPress blog had 92 posts and every page loaded at 110KB+ of HTML. Not terrible by modern standards, but for a site about tiny watch screens, it felt ironic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Moved inline CSS to an external file.&lt;/strong&gt;&lt;br&gt;
A 4KB style block repeated in every post. Moving it to ww-article.css saved 4KB per page. 92 posts x 4KB = 368KB of duplicate CSS eliminated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Compressed images from PNG to WebP.&lt;/strong&gt;&lt;br&gt;
Cover images averaged 2MB each. Converting to WebP at quality 80 brought them to 50-150KB. Total savings: 64MB across 35 covers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Wrapped tables for mobile.&lt;/strong&gt;&lt;br&gt;
HTML tables without overflow-x break mobile layouts. Applied to 66 posts in one batch via WordPress REST API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Removed 151 dead translation pages.&lt;/strong&gt;&lt;br&gt;
Machine-translated pages with 0 users/month. Sitemap went from 400+ URLs to 88.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page HTML&lt;/td&gt;
&lt;td&gt;110KB&lt;/td&gt;
&lt;td&gt;62KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cover image&lt;/td&gt;
&lt;td&gt;2MB&lt;/td&gt;
&lt;td&gt;80KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sitemap URLs&lt;/td&gt;
&lt;td&gt;400+&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile first paint&lt;/td&gt;
&lt;td&gt;3.2s&lt;/td&gt;
&lt;td&gt;1.4s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bing started indexing faster. DuckDuckGo went from 4 sessions/week to 26.&lt;/p&gt;

&lt;p&gt;More: &lt;a href="https://watchwalls.pro/how-to-make-apple-watch-wallpaper/" rel="noopener noreferrer"&gt;watchwalls.pro/how-to-make-apple-watch-wallpaper&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>wordpress</category>
      <category>optimization</category>
    </item>
    <item>
      <title>The OLED Wallpaper Problem: Why Dark Backgrounds Save 18% Battery on Apple Watch</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Thu, 17 Sep 2026 03:38:02 +0000</pubDate>
      <link>https://dev.to/watch/the-oled-wallpaper-problem-why-dark-backgrounds-save-18-battery-on-apple-watch-31p6</link>
      <guid>https://dev.to/watch/the-oled-wallpaper-problem-why-dark-backgrounds-save-18-battery-on-apple-watch-31p6</guid>
      <description>&lt;p&gt;Every pixel on an OLED screen is its own light source. Black pixels are literally turned off — zero power draw. This changes everything about wallpaper design for Apple Watch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Battery Test
&lt;/h2&gt;

&lt;p&gt;I ran the same Apple Watch Series 9 with three different wallpaper setups for a week each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wallpaper&lt;/th&gt;
&lt;th&gt;End-of-Day Battery&lt;/th&gt;
&lt;th&gt;Daily Drain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bright white gradient&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark blue with accents&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;True black (#000000) with neon accent&lt;/td&gt;
&lt;td&gt;49%&lt;/td&gt;
&lt;td&gt;51%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The difference between a bright wallpaper and a true black one: &lt;strong&gt;18 percentage points&lt;/strong&gt; of battery per day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Design
&lt;/h2&gt;

&lt;p&gt;When I started building wallpapers for Apple Watch, I made them like phone wallpapers — colorful, detailed, filling the whole screen. They looked great for 5 seconds and then I noticed my watch dying by 4 PM.&lt;/p&gt;

&lt;p&gt;The rules for a 41mm OLED screen are different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Dark base, bright accents.&lt;/strong&gt; Start with pure black (#000000, not dark gray #1a1a1a). Add one or two bright elements. The contrast is stunning and the battery impact is minimal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Simple compositions.&lt;/strong&gt; A detailed cityscape becomes mud on a tiny screen. One focal point works. Two is pushing it. Three is a mess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Portrait orientation from the start.&lt;/strong&gt; The Apple Watch screen is roughly 5:6 — taller than wide. Designing in square or wide format and cropping later always cuts something important.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Resolution Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Series 12/11/10 (46mm)&lt;/td&gt;
&lt;td&gt;416 x 496&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Series 12/11/10 (42mm)&lt;/td&gt;
&lt;td&gt;374 x 446&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra 2&lt;/td&gt;
&lt;td&gt;410 x 502&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Series 9/8/7 (45mm)&lt;/td&gt;
&lt;td&gt;396 x 484&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SE (44mm)&lt;/td&gt;
&lt;td&gt;368 x 448&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Colors Work Best on OLED
&lt;/h2&gt;

&lt;p&gt;Neon colors on black backgrounds create an effect that looks like the design is floating. The screen border disappears because both the bezel and the black pixels are the same color — pure dark.&lt;/p&gt;

&lt;p&gt;Best accent colors on black:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Electric cyan (#00FFFF)&lt;/li&gt;
&lt;li&gt;Neon pink (#FF1493)&lt;/li&gt;
&lt;li&gt;Bright orange (#FF6600)&lt;/li&gt;
&lt;li&gt;Acid green (#39FF14)&lt;/li&gt;
&lt;li&gt;Gold (#FFD700)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worse performers: pastels (too dim), full white backgrounds (battery drain + glare in dark rooms), gradients that start from white (the bright areas still consume power).&lt;/p&gt;

&lt;p&gt;I wrote a full guide on dark wallpaper design for Apple Watch at &lt;a href="https://watchwalls.pro/apple-watch-wallpaper-black/" rel="noopener noreferrer"&gt;watchwalls.pro/apple-watch-wallpaper-black&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What battery impact have you noticed from different wallpaper styles?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>ios</category>
      <category>performance</category>
    </item>
    <item>
      <title>ChatGPT Is My #1 Traffic Source: What That Means for SEO in 2026</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Sat, 12 Sep 2026 04:50:22 +0000</pubDate>
      <link>https://dev.to/watch/chatgpt-is-my-1-traffic-source-what-that-means-for-seo-in-2026-2dkj</link>
      <guid>https://dev.to/watch/chatgpt-is-my-1-traffic-source-what-that-means-for-seo-in-2026-2dkj</guid>
      <description>&lt;p&gt;Six months ago, Google was my primary traffic source. Today it is ChatGPT.&lt;/p&gt;

&lt;p&gt;My Apple Watch wallpaper site gets about 70 sessions per week:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Sessions/week&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DuckDuckGo&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bing&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Facebook&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Happened to Google
&lt;/h2&gt;

&lt;p&gt;Duplicate hreflang tags across 195 translated pages caused a deindexation event in July 2026. Fixed within a week, but Google still shows 7 pages indexed out of 82.&lt;/p&gt;

&lt;p&gt;ChatGPT crawled my site, liked the content, and started recommending it — no hreflang required.&lt;/p&gt;

&lt;h2&gt;
  
  
  How ChatGPT Finds Content
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Direct answers.&lt;/strong&gt; Quick Answer boxes at the top get cited most.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured content.&lt;/strong&gt; Tables, lists, clear H2 headings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specificity.&lt;/strong&gt; Narrow topics outperform broad overviews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness.&lt;/strong&gt; New articles get ChatGPT traffic within days.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Changed
&lt;/h2&gt;

&lt;p&gt;No special tricks. Just clear structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick Answer box at top&lt;/li&gt;
&lt;li&gt;Table of Contents with anchors&lt;/li&gt;
&lt;li&gt;FAQ sections with schema&lt;/li&gt;
&lt;li&gt;Narrow topics over broad guides&lt;/li&gt;
&lt;li&gt;Data tables and comparisons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI assistants have different ranking criteria than Google. You need clear, structured answers — not backlinks.&lt;/p&gt;

&lt;p&gt;More on content structure: &lt;a href="https://watchwalls.pro/blog/" rel="noopener noreferrer"&gt;watchwalls.pro/blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Building a Dynamic XML Sitemap That Scales Beyond Plugin Limits</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Mon, 07 Sep 2026 04:47:06 +0000</pubDate>
      <link>https://dev.to/watch/building-a-dynamic-xml-sitemap-that-scales-beyond-plugin-limits-1b47</link>
      <guid>https://dev.to/watch/building-a-dynamic-xml-sitemap-that-scales-beyond-plugin-limits-1b47</guid>
      <description>&lt;p&gt;When your WordPress site hits 50+ posts, your SEO plugin's sitemap starts dropping pages. I found out the hard way — my site had 75 posts, but only 49 showed up in &lt;code&gt;post-sitemap.xml&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plugin Ceiling
&lt;/h2&gt;

&lt;p&gt;Rank Math Free generates sitemaps automatically. But it has an undocumented limit on entries per sitemap file. Post #50 pushes post #1 out. No warning, no error — just silent removal.&lt;/p&gt;

&lt;p&gt;I only noticed because Google Search Console showed "Discovered - currently not indexed" for pages that &lt;em&gt;used&lt;/em&gt; to rank. They'd been quietly removed from the sitemap weeks earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PHP Solution
&lt;/h2&gt;

&lt;p&gt;Instead of fighting the plugin, I built a supplementary sitemap that catches everything the plugin misses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type: application/xml; charset=utf-8'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/wp-load.php'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_posts&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'post_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'post_status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'posts_per_page'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Fetch existing plugin sitemap URLs&lt;/span&gt;
&lt;span class="nv"&gt;$xml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&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="nf"&gt;home_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/post-sitemap.xml'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;preg_match_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/&amp;lt;loc&amp;gt;([^&amp;lt;]+)&amp;lt;\/loc&amp;gt;/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$matches&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_flip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$matches&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_permalink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&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="o"&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;$existing&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_the_modified_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;url&amp;gt;&amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$mod&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;&amp;lt;/url&amp;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="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/urlset&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why not just increase the plugin limit?&lt;/strong&gt; Rank Math Free doesn't expose that setting. The Pro version does, but I didn't want to pay for one config option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why check against the existing sitemap?&lt;/strong&gt; To avoid duplicates. Google handles duplicate URLs gracefully, but clean sitemaps build more crawler trust. The &lt;code&gt;array_flip&lt;/code&gt; trick makes the lookup O(1) instead of searching an array on every iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;posts_per_page =&amp;gt; -1&lt;/code&gt;?&lt;/strong&gt; Because we need every published post, not just the first 10. Yes, this loads all posts into memory. For 75 posts it's fine. For 10,000 you'd want pagination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Drop the PHP file in your WordPress root (alongside &lt;code&gt;wp-config.php&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add it to &lt;code&gt;robots.txt&lt;/code&gt;: &lt;code&gt;Sitemap: https://yoursite.com/ww-sitemap.php&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Submit in Google Search Console alongside your main sitemap&lt;/li&gt;
&lt;li&gt;It regenerates dynamically on every request — no cron needed&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Results After 2 Weeks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Before: 49 URLs in sitemap, 26 posts invisible to Google&lt;/li&gt;
&lt;li&gt;After: All 75 posts discoverable&lt;/li&gt;
&lt;li&gt;Bing indexed the missing pages within 48 hours via IndexNow&lt;/li&gt;
&lt;li&gt;Google... is still thinking about it (6 weeks and counting)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full story of how this fit into a larger indexation recovery effort is on my site: &lt;a href="https://watchwalls.pro/apple-watch-wallpaper-guide/" rel="noopener noreferrer"&gt;watchwalls.pro/apple-watch-wallpaper-guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Has anyone else hit plugin sitemap limits? Curious what solutions you found.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Used AI to Generate 500+ Apple Watch Wallpapers (And What I Learned About Tiny Screens)</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Wed, 02 Sep 2026 05:54:26 +0000</pubDate>
      <link>https://dev.to/watch/how-i-used-ai-to-generate-500-apple-watch-wallpapers-and-what-i-learned-about-tiny-screens-4ho8</link>
      <guid>https://dev.to/watch/how-i-used-ai-to-generate-500-apple-watch-wallpapers-and-what-i-learned-about-tiny-screens-4ho8</guid>
      <description>&lt;p&gt;Most wallpaper generators are built for phones and desktops. Nobody thinks about the 374×446 pixel screen on your wrist. So I built one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Resizing
&lt;/h2&gt;

&lt;p&gt;I tried generating Apple Watch wallpapers with Midjourney, DALL-E, and Stable Diffusion. Every single image came out at 1024×1024 or 16:9. Cropping a square image to a ~5:6 portrait rectangle means losing 40% of the composition.&lt;/p&gt;

&lt;p&gt;After 50+ attempts of "generate, download, crop, upload to watch, realize it looks terrible, repeat" — I decided to build the pipeline differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Works for Tiny Screens
&lt;/h2&gt;

&lt;p&gt;Three rules I learned after generating 500+ watch wallpapers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Simple compositions beat complex ones.&lt;/strong&gt;&lt;br&gt;
A detailed cityscape that looks amazing on an iPhone becomes an unreadable smudge on a 41mm watch. One focal point, dark background, high contrast — that's the formula.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Dark backgrounds save battery (literally).&lt;/strong&gt;&lt;br&gt;
Apple Watch uses OLED. Pure black pixels (#000000) are physically turned off — no light, no power drain. A wallpaper with a dark base and one bright element gives you the best of both worlds: looks great AND saves 10-15% battery per day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Portrait orientation from the start.&lt;/strong&gt;&lt;br&gt;
Don't generate square or landscape and crop later. Set your canvas to 374×446 (or 416×496 for the larger model) from the beginning. The AI fills the space differently when you give it a tall, narrow canvas versus a square.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Resolution Table Nobody Publishes
&lt;/h2&gt;

&lt;p&gt;Every Apple Watch model has slightly different pixel dimensions. I spent way too long figuring these out:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Series 10 (42mm)&lt;/td&gt;
&lt;td&gt;1.74"&lt;/td&gt;
&lt;td&gt;374 × 446&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Series 10 (46mm)&lt;/td&gt;
&lt;td&gt;1.96"&lt;/td&gt;
&lt;td&gt;416 × 496&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ultra 2&lt;/td&gt;
&lt;td&gt;1.93"&lt;/td&gt;
&lt;td&gt;410 × 502&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Series 9 (41mm)&lt;/td&gt;
&lt;td&gt;1.7"&lt;/td&gt;
&lt;td&gt;352 × 430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Series 9 (45mm)&lt;/td&gt;
&lt;td&gt;1.9"&lt;/td&gt;
&lt;td&gt;396 × 484&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SE (40mm)&lt;/td&gt;
&lt;td&gt;1.57"&lt;/td&gt;
&lt;td&gt;324 × 394&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SE (44mm)&lt;/td&gt;
&lt;td&gt;1.78"&lt;/td&gt;
&lt;td&gt;368 × 448&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Best AI Prompts I Found
&lt;/h2&gt;

&lt;p&gt;These consistently produce good results for watch-sized screens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;"dark nebula with purple and blue swirls, centered bright star, portrait orientation, dark background"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"single koi fish swimming in dark water, top-down view, minimal"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"geometric gold lines on matte black background, abstract, portrait"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"underwater coral reef, dark ocean background, bioluminescent glow"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"northern lights over dark mountain silhouette, portrait orientation"&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is always including "dark background" and "portrait orientation" in your prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tool
&lt;/h2&gt;

&lt;p&gt;I packaged all of this into &lt;a href="https://watchwalls.pro" rel="noopener noreferrer"&gt;WatchWalls AI&lt;/a&gt; — it generates wallpapers at the exact resolution for your watch model. No cropping, no guessing. Describe what you want, pick your model, get a wallpaper.&lt;/p&gt;

&lt;p&gt;Full guide on generating AI wallpapers for Apple Watch: &lt;a href="https://watchwalls.pro/apple-watch-ai-wallpaper/" rel="noopener noreferrer"&gt;watchwalls.pro/apple-watch-ai-wallpaper&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your experience with AI-generated wallpapers for small screens? Curious if anyone has found prompts that work even better.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>ios</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a PHP Sitemap That Fixed My Google Indexation Problem</title>
      <dc:creator>Дарья</dc:creator>
      <pubDate>Sat, 22 Aug 2026 15:40:37 +0000</pubDate>
      <link>https://dev.to/watch/i-built-a-php-sitemap-that-fixed-my-google-indexation-problem-2g58</link>
      <guid>https://dev.to/watch/i-built-a-php-sitemap-that-fixed-my-google-indexation-problem-2g58</guid>
      <description>&lt;p&gt;My WordPress site has 65 posts, but Rank Math's sitemap was only showing 49. The remaining 16 posts were invisible to Google. Here's how I fixed it with a 30-line PHP file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Rank Math Free limits &lt;code&gt;post-sitemap.xml&lt;/code&gt; to a fixed number of entries. When I published post #50, it silently pushed post #1 out of the sitemap. Google eventually deindexed the missing pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: &lt;code&gt;ww-sitemap.php&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;I created a PHP file in my WordPress root that generates a sitemap dynamically from the database, excluding any URLs already in Rank Math's sitemap (to avoid duplicates):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type: application/xml; charset=utf-8'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/wp-load.php'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_posts&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'post_type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'post'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'post_status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'posts_per_page'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="c1"&gt;// Get existing sitemap URLs to avoid duplicates&lt;/span&gt;
&lt;span class="nv"&gt;$xml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&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="nf"&gt;home_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/post-sitemap.xml'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;preg_match_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/&amp;lt;loc&amp;gt;([^&amp;lt;]+)&amp;lt;\/loc&amp;gt;/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$xml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;array_flip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$posts&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_permalink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$post&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="o"&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;$existing&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_the_modified_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;url&amp;gt;&amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;&amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$mod&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;&amp;lt;/url&amp;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="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/urlset&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I submitted &lt;code&gt;ww-sitemap.php&lt;/code&gt; in Google Search Console alongside the existing &lt;code&gt;sitemap_index.xml&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Before: 49 URLs in sitemap, 16 posts invisible to Google&lt;/li&gt;
&lt;li&gt;After: All 65 posts discoverable&lt;/li&gt;
&lt;li&gt;Bing picked up the missing pages within 48 hours via IndexNow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Always verify your sitemap contains all your pages — don't assume the plugin handles it&lt;/li&gt;
&lt;li&gt;Dynamic PHP sitemaps are a valid fallback when plugin settings aren't accessible&lt;/li&gt;
&lt;li&gt;Submit supplementary sitemaps in GSC — you can have multiple&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Site: &lt;a href="https://watchwalls.pro" rel="noopener noreferrer"&gt;watchwalls.pro&lt;/a&gt; — an Apple Watch wallpaper resource where I discovered this problem.&lt;/p&gt;

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