<?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: Murillo Rennó</title>
    <description>The latest articles on DEV Community by Murillo Rennó (@murillo_renno).</description>
    <link>https://dev.to/murillo_renno</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%2F3871878%2Fd01c087e-2ac3-4a77-9b4e-7ab0c0482569.png</url>
      <title>DEV Community: Murillo Rennó</title>
      <link>https://dev.to/murillo_renno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/murillo_renno"/>
    <language>en</language>
    <item>
      <title>Why I Built a WordPress Alt Text Generator Withou</title>
      <dc:creator>Murillo Rennó</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:08:04 +0000</pubDate>
      <link>https://dev.to/murillo_renno/why-i-built-a-wordpress-alt-text-generator-withou-2gmj</link>
      <guid>https://dev.to/murillo_renno/why-i-built-a-wordpress-alt-text-generator-withou-2gmj</guid>
      <description>&lt;h1&gt;
  
  
  Why I Built a WordPress Alt Text Generator Without AI
&lt;/h1&gt;

&lt;p&gt;Opening a WordPress media library and finding hundreds of images without alt text used to drive me crazy.&lt;/p&gt;

&lt;p&gt;It was not just a matter of organization. Missing alt attributes weaken on-page SEO, create accessibility problems, and usually reveal that image optimization was never treated as part of the publishing workflow.&lt;/p&gt;

&lt;p&gt;Fixing ten images manually is easy.&lt;/p&gt;

&lt;p&gt;Fixing hundreds or thousands of them across multiple WordPress websites is a completely different situation.&lt;/p&gt;

&lt;p&gt;I also got tired of testing plugins that looked almost identical. Many of them depended on external APIs, required paid credits, added unnecessary complexity, or tried to solve a simple problem with a much larger system.&lt;/p&gt;

&lt;p&gt;So I built my own solution.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;Webby Simple Alt Builder&lt;/strong&gt;, a WordPress plugin that generates structured alt text using information that already exists inside WordPress.&lt;/p&gt;

&lt;p&gt;No AI.&lt;/p&gt;

&lt;p&gt;No external API.&lt;/p&gt;

&lt;p&gt;No remote image processing.&lt;/p&gt;

&lt;p&gt;Just predictable rules and local data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem I Wanted to Solve
&lt;/h2&gt;

&lt;p&gt;Anyone who manages WordPress websites has probably seen at least one of these situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hundreds of images with empty alt attributes;&lt;/li&gt;
&lt;li&gt;old media libraries that were never reviewed;&lt;/li&gt;
&lt;li&gt;filenames such as &lt;code&gt;IMG_4837.jpg&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;inconsistent descriptions across similar images;&lt;/li&gt;
&lt;li&gt;plugins that require third-party services;&lt;/li&gt;
&lt;li&gt;tools that overwrite existing manual work;&lt;/li&gt;
&lt;li&gt;large libraries that cannot be processed safely in one request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, the most frustrating part was seeing a technically solid page weakened by something so basic.&lt;/p&gt;

&lt;p&gt;The content could be well written. The page title could be optimized. The heading structure could be correct. The internal links could be carefully planned.&lt;/p&gt;

&lt;p&gt;Then I would inspect the images and find empty alt attributes everywhere.&lt;/p&gt;

&lt;p&gt;It is a small field in the WordPress media library, but it has an important role in accessibility, content context, and on-page SEO.&lt;/p&gt;

&lt;p&gt;I wanted a practical way to improve that workflow without pretending that every image needed advanced computer vision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Did Not Use Artificial Intelligence
&lt;/h2&gt;

&lt;p&gt;Using AI seemed like the obvious option.&lt;/p&gt;

&lt;p&gt;An image could be sent to a model, analyzed, and returned with a detailed description.&lt;/p&gt;

&lt;p&gt;That can be useful, especially when the goal is to understand the actual visual content of an image. However, it would also introduce several new dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API credentials;&lt;/li&gt;
&lt;li&gt;request costs;&lt;/li&gt;
&lt;li&gt;usage limits;&lt;/li&gt;
&lt;li&gt;external service availability;&lt;/li&gt;
&lt;li&gt;privacy concerns;&lt;/li&gt;
&lt;li&gt;unpredictable output;&lt;/li&gt;
&lt;li&gt;additional error handling;&lt;/li&gt;
&lt;li&gt;remote processing of website data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this plugin, I did not need creative descriptions.&lt;/p&gt;

&lt;p&gt;I needed consistency.&lt;/p&gt;

&lt;p&gt;Most of the websites I manage already contain useful context. WordPress knows the image filename, attachment title, post title, category, and the page where an image is being used.&lt;/p&gt;

&lt;p&gt;That information is often enough to generate a cleaner and more useful alt text than an empty attribute or a raw filename.&lt;/p&gt;

&lt;p&gt;A rules-based system also gives me something I value a lot: control.&lt;/p&gt;

&lt;p&gt;I can understand why a result was generated. I can reproduce it. I can adjust the rules. I do not have to wonder why an external model produced a completely different answer for the same type of image.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Plugin Uses
&lt;/h2&gt;

&lt;p&gt;Instead of visually analyzing an image, the plugin can build alt text using information already available in WordPress, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the image filename;&lt;/li&gt;
&lt;li&gt;the attachment title;&lt;/li&gt;
&lt;li&gt;the post title;&lt;/li&gt;
&lt;li&gt;the post category;&lt;/li&gt;
&lt;li&gt;an optional keyword;&lt;/li&gt;
&lt;li&gt;the selected content context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to create perfect descriptions for every possible image.&lt;/p&gt;

&lt;p&gt;The goal is to create a reliable baseline for real WordPress workflows.&lt;/p&gt;

&lt;p&gt;That distinction shaped the entire project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Plugin Does
&lt;/h2&gt;

&lt;p&gt;The current version can generate alt text automatically when an image is uploaded.&lt;/p&gt;

&lt;p&gt;It can also process older media libraries in configurable batches and provide manual suggestions for both alt text and attachment titles.&lt;/p&gt;

&lt;p&gt;Its main features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automatic generation during upload;&lt;/li&gt;
&lt;li&gt;frontend fallback when saved alt text is empty;&lt;/li&gt;
&lt;li&gt;batch processing for existing media libraries;&lt;/li&gt;
&lt;li&gt;manual ALT and title suggestions;&lt;/li&gt;
&lt;li&gt;automatic, product, service, and generic context modes;&lt;/li&gt;
&lt;li&gt;decorative image detection;&lt;/li&gt;
&lt;li&gt;maximum word controls;&lt;/li&gt;
&lt;li&gt;maximum character controls;&lt;/li&gt;
&lt;li&gt;ignored words;&lt;/li&gt;
&lt;li&gt;optional post title usage;&lt;/li&gt;
&lt;li&gt;optional category usage;&lt;/li&gt;
&lt;li&gt;optional custom keywords;&lt;/li&gt;
&lt;li&gt;media library statistics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One rule has remained unchanged since the first version:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existing alt text is never overwritten.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Preserving Existing Alt Text Matters
&lt;/h2&gt;

&lt;p&gt;This was one of the easiest decisions in the project.&lt;/p&gt;

&lt;p&gt;If an editor, developer, SEO professional, or content writer has already created an alt description manually, the plugin should not assume it can do a better job.&lt;/p&gt;

&lt;p&gt;Manual alt text may contain important context that cannot be extracted from a filename or post title.&lt;/p&gt;

&lt;p&gt;It may describe the function of an image instead of its appearance.&lt;/p&gt;

&lt;p&gt;It may also have been written specifically for accessibility.&lt;/p&gt;

&lt;p&gt;Because of that, the plugin only fills gaps.&lt;/p&gt;

&lt;p&gt;It does not replace intentional human work.&lt;/p&gt;

&lt;p&gt;I have seen automation tools overwrite carefully written metadata simply because the tool considered its own output more consistent. I did not want that behavior anywhere near this plugin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the Main Plugin File Small
&lt;/h2&gt;

&lt;p&gt;I wanted the main plugin file to remain simple.&lt;/p&gt;

&lt;p&gt;It defines the plugin metadata, creates shared constants, loads the required classes, and starts the plugin.&lt;/p&gt;

&lt;p&gt;It does not contain the complete generation logic, admin interface, attachment handling, and settings code in one large file.&lt;/p&gt;

&lt;p&gt;The first small but important protection is this:&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="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="nb"&gt;defined&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ABSPATH'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;exit&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;p&gt;WordPress defines &lt;code&gt;ABSPATH&lt;/code&gt; during a normal application load.&lt;/p&gt;

&lt;p&gt;If someone attempts to execute the plugin file directly, the script stops immediately.&lt;/p&gt;

&lt;p&gt;This is a common WordPress security practice, but it is still worth including and understanding. Small plugins do not get a free pass on basic security.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separating Responsibilities
&lt;/h2&gt;

&lt;p&gt;The plugin loads different classes for different parts of the application:&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="k"&gt;require_once&lt;/span&gt; &lt;span class="no"&gt;WEBBY_SAC_DIR&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'includes/class-webby-smart-alt-settings.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="no"&gt;WEBBY_SAC_DIR&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'includes/class-webby-smart-alt-generator.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="no"&gt;WEBBY_SAC_DIR&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'includes/class-webby-smart-alt-attachments.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="no"&gt;WEBBY_SAC_DIR&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'includes/class-webby-smart-alt-admin.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt; &lt;span class="no"&gt;WEBBY_SAC_DIR&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'includes/class-webby-smart-alt-plugin.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Webby_Smart_ALT_Plugin&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each class has a clearer responsibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;settings&lt;/code&gt; manages plugin options;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generator&lt;/code&gt; contains the alt text generation rules;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;attachments&lt;/code&gt; handles media and attachment behavior;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;admin&lt;/code&gt; manages the WordPress dashboard interface;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plugin&lt;/code&gt; coordinates the initialization process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final line starts the main plugin instance.&lt;/p&gt;

&lt;p&gt;This structure makes the code easier to navigate and maintain.&lt;/p&gt;

&lt;p&gt;I have worked with WordPress plugins where the main file slowly became a collection of unrelated functions, hooks, HTML, SQL, and business rules. It usually starts small, then becomes difficult to understand after a few updates.&lt;/p&gt;

&lt;p&gt;I wanted to avoid that from the beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Used Constants
&lt;/h2&gt;

&lt;p&gt;The main file also defines values that are reused throughout the plugin:&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="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WEBBY_SAC_VERSION'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'1.7.5'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WEBBY_SAC_FILE'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WEBBY_SAC_DIR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;plugin_dir_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WEBBY_SAC_URL'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;plugin_dir_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WEBBY_SAC_OPTION'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'webby_sac_settings'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps file paths, version information, option names, and identifiers in one predictable place.&lt;/p&gt;

&lt;p&gt;It also prevents the same strings from being repeated across multiple classes.&lt;/p&gt;

&lt;p&gt;This may look like a minor detail, but small structural decisions become increasingly valuable as a plugin grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge of Large Media Libraries
&lt;/h2&gt;

&lt;p&gt;Generating alt text for a few images is easy.&lt;/p&gt;

&lt;p&gt;Processing thousands of attachments in a single request is not.&lt;/p&gt;

&lt;p&gt;Large operations can cause:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP timeouts;&lt;/li&gt;
&lt;li&gt;high memory usage;&lt;/li&gt;
&lt;li&gt;frozen admin screens;&lt;/li&gt;
&lt;li&gt;incomplete processing;&lt;/li&gt;
&lt;li&gt;server load spikes;&lt;/li&gt;
&lt;li&gt;inconsistent results after a failed request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was especially important to me because the plugin was created for practical use, not just as a coding exercise.&lt;/p&gt;

&lt;p&gt;Some WordPress websites have been active for years. Their media libraries may contain thousands of files uploaded by different people using different naming conventions.&lt;/p&gt;

&lt;p&gt;Trying to process everything at once would be careless.&lt;/p&gt;

&lt;p&gt;That is why older images are handled in configurable batches.&lt;/p&gt;

&lt;p&gt;Smaller groups reduce the risk of resource exhaustion and make the plugin more compatible with different hosting environments.&lt;/p&gt;

&lt;p&gt;It is not the most exciting feature to describe, but it is one of the features that makes the plugin usable outside a development environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend Fallback for Empty Alt Text
&lt;/h2&gt;

&lt;p&gt;The plugin can also provide a frontend fallback when an image does not have saved alt text.&lt;/p&gt;

&lt;p&gt;This means a value can be generated during rendering without immediately updating the attachment metadata in the database.&lt;/p&gt;

&lt;p&gt;That can be useful for older websites where changing the entire media library at once is not desirable.&lt;/p&gt;

&lt;p&gt;It also provides a gradual way to improve output while reviewing existing content.&lt;/p&gt;

&lt;p&gt;However, this fallback has limits.&lt;/p&gt;

&lt;p&gt;A rules-based plugin cannot fully understand what an image visually contains. It works with the context WordPress provides.&lt;/p&gt;

&lt;p&gt;When an image contains important visual information, a manually written description is still the better option.&lt;/p&gt;

&lt;p&gt;I do not think automation should hide its own limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decorative Images Need Different Treatment
&lt;/h2&gt;

&lt;p&gt;One of the mistakes I often see is the assumption that every image must have descriptive alt text.&lt;/p&gt;

&lt;p&gt;That is not true.&lt;/p&gt;

&lt;p&gt;Purely decorative images should often use an empty alt attribute so assistive technologies can ignore them.&lt;/p&gt;

&lt;p&gt;A background shape, visual divider, decorative icon, or layout element may add no useful information to the page content.&lt;/p&gt;

&lt;p&gt;Forcing a generated phrase into every decorative image can make accessibility worse, not better.&lt;/p&gt;

&lt;p&gt;Because of this, the plugin includes decorative image detection.&lt;/p&gt;

&lt;p&gt;The purpose of automation is not to fill every field at any cost.&lt;/p&gt;

&lt;p&gt;The purpose is to make better decisions consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Simple Rules Can Be Better
&lt;/h2&gt;

&lt;p&gt;While building the plugin, I kept returning to the same question:&lt;/p&gt;

&lt;p&gt;Does this problem really need more complexity?&lt;/p&gt;

&lt;p&gt;For many websites, the answer was no.&lt;/p&gt;

&lt;p&gt;Rules-based generation offers several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the output is reproducible;&lt;/li&gt;
&lt;li&gt;the logic can be explained;&lt;/li&gt;
&lt;li&gt;unwanted words can be removed;&lt;/li&gt;
&lt;li&gt;character limits can be enforced;&lt;/li&gt;
&lt;li&gt;context can be selected;&lt;/li&gt;
&lt;li&gt;no external service is required;&lt;/li&gt;
&lt;li&gt;the same input produces a consistent result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That predictability is useful for testing and maintenance.&lt;/p&gt;

&lt;p&gt;It also makes troubleshooting much easier.&lt;/p&gt;

&lt;p&gt;When a generated result is not good, I can inspect the input and the rule that produced it. I am not trying to reverse engineer the reasoning of an external model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned While Building It
&lt;/h2&gt;

&lt;p&gt;The biggest lesson was that not every modern feature needs to begin with AI.&lt;/p&gt;

&lt;p&gt;Artificial intelligence is useful when the problem genuinely requires interpretation.&lt;/p&gt;

&lt;p&gt;It makes sense when the application needs to identify objects, understand visual relationships, or describe details that do not exist anywhere in the website data.&lt;/p&gt;

&lt;p&gt;But many WordPress problems are workflow problems.&lt;/p&gt;

&lt;p&gt;They require better defaults, safer automation, and clearer rules.&lt;/p&gt;

&lt;p&gt;Building this plugin also forced me to think about questions that are easy to ignore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When should automation act?&lt;/li&gt;
&lt;li&gt;When should it do nothing?&lt;/li&gt;
&lt;li&gt;Which content should be preserved?&lt;/li&gt;
&lt;li&gt;How should large libraries be processed?&lt;/li&gt;
&lt;li&gt;What happens when the available context is poor?&lt;/li&gt;
&lt;li&gt;How can the plugin remain understandable to non-technical users?&lt;/li&gt;
&lt;li&gt;Which features are genuinely useful, and which ones only make the settings screen longer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The actual string generation was not the hardest part.&lt;/p&gt;

&lt;p&gt;The hardest part was deciding where the plugin should stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Want to Improve Next
&lt;/h2&gt;

&lt;p&gt;I still have several ideas for future versions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WP-CLI support;&lt;/li&gt;
&lt;li&gt;additional composition rules;&lt;/li&gt;
&lt;li&gt;more context options;&lt;/li&gt;
&lt;li&gt;improved batch processing;&lt;/li&gt;
&lt;li&gt;more detailed reporting;&lt;/li&gt;
&lt;li&gt;better manual review tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am interested in adding features, but I do not want the plugin to become one of the bloated tools that originally frustrated me.&lt;/p&gt;

&lt;p&gt;Its main principle should remain the same:&lt;/p&gt;

&lt;p&gt;Use local WordPress data to create predictable alt text without unnecessary dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Find the Plugin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Webby Simple Alt Builder&lt;/strong&gt; is available for free in the official WordPress plugin directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://et.wordpress.org/plugins/webby-simple-alt-builder/" rel="noopener noreferrer"&gt;Webby Simple Alt Builder on WordPress.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also maintain a project page with additional information and documentation on the Webby website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webbypropaganda.com.br/webby-simple-alt-builder/" rel="noopener noreferrer"&gt;Webby Simple Alt Builder documentation&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I built Webby Simple Alt Builder because I was tired of finding the same problem across WordPress websites.&lt;/p&gt;

&lt;p&gt;Hundreds of empty alt attributes.&lt;/p&gt;

&lt;p&gt;Unoptimized media libraries.&lt;/p&gt;

&lt;p&gt;Plugins that added external dependencies to solve something that could often be handled with existing data.&lt;/p&gt;

&lt;p&gt;The plugin does not pretend to understand every image.&lt;/p&gt;

&lt;p&gt;It does not replace a thoughtful human description.&lt;/p&gt;

&lt;p&gt;It does not send files to an external service and hope for a good response.&lt;/p&gt;

&lt;p&gt;It uses the context WordPress already has, follows predictable rules, and preserves existing work.&lt;/p&gt;

&lt;p&gt;For this particular problem, that was exactly the solution I wanted.&lt;/p&gt;

&lt;p&gt;Sometimes the best improvement is not adding more intelligence.&lt;/p&gt;

&lt;p&gt;Sometimes it is removing unnecessary complexity.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>php</category>
      <category>html</category>
    </item>
    <item>
      <title>What Carries More Weight in AI Recommendations: Schema, Testimonials, or Topical Authority?</title>
      <dc:creator>Murillo Rennó</dc:creator>
      <pubDate>Fri, 10 Apr 2026 13:52:37 +0000</pubDate>
      <link>https://dev.to/murillo_renno/what-carries-more-weight-in-ai-recommendations-schema-testimonials-or-topical-authority-1ehf</link>
      <guid>https://dev.to/murillo_renno/what-carries-more-weight-in-ai-recommendations-schema-testimonials-or-topical-authority-1ehf</guid>
      <description>&lt;p&gt;What Carries More Weight in AI Recommendations: Schema, Testimonials, or Topical Authority?&lt;/p&gt;

&lt;p&gt;As AI-driven search and recommendations become more common, a question keeps coming up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually matters more?&lt;/strong&gt;&lt;br&gt;
Schema markup, Testimonials / reviews, Topical authority&lt;/p&gt;

&lt;p&gt;From what I’ve been observing in practice, the typical order looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Topical authority&lt;/li&gt;
&lt;li&gt;Schema markup&lt;/li&gt;
&lt;li&gt;Testimonials / social proof&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And there’s a technical reason behind this.&lt;/p&gt;

&lt;p&gt;Topical authority usually comes first&lt;/p&gt;

&lt;p&gt;AI systems like Google AI Overviews, ChatGPT, and Perplexity are moving toward semantic understanding, not just keyword matching. They try to identify which sites consistently demonstrate expertise on a topic. &lt;/p&gt;

&lt;p&gt;This usually happens when a site has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Broad topic coverage&lt;/li&gt;
&lt;li&gt;Clear content structure&lt;/li&gt;
&lt;li&gt;Internal linking between related pages&lt;/li&gt;
&lt;li&gt;Consistent terminology&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When these signals are present, the domain is more likely to be interpreted as a trusted source.&lt;/p&gt;

&lt;p&gt;Schema helps AI interpret content&lt;/p&gt;

&lt;p&gt;Schema markup doesn’t create authority, but it reduces ambiguity.&lt;/p&gt;

&lt;p&gt;Using structured data (like JSON-LD) helps AI systems understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entities&lt;/li&gt;
&lt;li&gt;Services&lt;/li&gt;
&lt;li&gt;Relationships&lt;/li&gt;
&lt;li&gt;Location context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes content easier to parse, especially when combined with strong topical authority.&lt;/p&gt;

&lt;p&gt;Testimonials act as validation&lt;/p&gt;

&lt;p&gt;Testimonials and reviews tend to work as trust validation signals.&lt;/p&gt;

&lt;p&gt;This becomes more relevant in queries like:&lt;/p&gt;

&lt;p&gt;"best agency"&lt;br&gt;
"recommended company"&lt;br&gt;
"who should I hire"&lt;/p&gt;

&lt;p&gt;In these cases, AI systems often consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review volume&lt;/li&gt;
&lt;li&gt;Average rating&lt;/li&gt;
&lt;li&gt;Consistency of feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A practical example&lt;/p&gt;

&lt;p&gt;I’ve noticed this happening with my own agency.&lt;br&gt;
&lt;a href="https://webbypropaganda.com.br/" rel="noopener noreferrer"&gt;Webby Propaganda&lt;/a&gt; tends to appear more frequently in local AI recommendations, and one factor seems to be the number of positive reviews compared to competitors.&lt;/p&gt;

&lt;p&gt;Locally, we have more testimonials and a &lt;a href="https://share.google/bko5Nl234uSsPqSwg" rel="noopener noreferrer"&gt;higher rating&lt;/a&gt;, which likely strengthens trust signals for recommendation systems.&lt;/p&gt;

&lt;p&gt;This doesn’t replace topical authority or schema, but it works as an additional trust layer.&lt;/p&gt;

&lt;p&gt;As AI-driven recommendations evolve, visibility increasingly comes from the combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topical authority&lt;/li&gt;
&lt;li&gt;Structured data (schema)&lt;/li&gt;
&lt;li&gt;Consistent social proof&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>wordpress</category>
      <category>web</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
