# EduardoVillão > Full-stack developer with 10+ years building real products. Writing about AI, software architecture, and the mindset behind building things that matter. Personal blog and portfolio of Eduardo Villão, published in English (`/`) and Portuguese (`/pt-br/`). Topics span AI, WordPress/PHP, frontend, CSS, and product engineering. The whole site is static and self-contained. ## Posts (English) - [AI Without Standards Is Just Faster Chaos](https://eduardovillao.me/ai-without-standards-is-just-faster-chaos/): Every engineering team I talk to is using AI. Nobody’s debating that anymore. What nobody’s talking about is that every developer on the same team is using it differently. The Problem Nobody Admits Ten developers. Ten different setups. Ten different rules files. Ten different prompting habits. Same codebase, same tickets, same sprint – ten different - [Your 404 Logs Are a Security Report You’re Ignoring](https://eduardovillao.me/your-404-logs-are-a-security-report-youre-ignoring/): Most WordPress developers install a redirect plugin, set up a few 301s, and never look at their 404 logs again. If they do, it’s for SEO, fixing broken links, cleaning up crawl errors. That’s the obvious use. But there’s something else in those logs that almost everyone ignores. Your 404 logs are a real-time map - [What 150+ Feature Votes Taught Me About Building the Wrong Things](https://eduardovillao.me/what-150-feature-votes-taught-me-about-building-the-wrong-things/): I’ve been using WPFeatureLoop on two of my own plugins for just over a month. In that time, I collected over 150 votes across 11 feature requests, and it already changed what I’m building next. Here’s what the data actually looks like, and what it taught me about my own blind spots as a developer. - [In the AI Era, Soft Skills Are the Hard Skills](https://eduardovillao.me/in-the-ai-era-soft-skills-are-the-hard-skills/): The more powerful AI gets, the more human the bottleneck becomes. You open a new chat, type a vague prompt, get a mediocre response, and blame the model. The model isn’t the problem. What Actually Changed For the past decade, the most valuable thing a developer could do was execute. Write the code, ship the - [wp_add_inline_script doesn’t work in Block Themes (FSE) — Cause and Fix](https://eduardovillao.me/wp_add_inline_script-doesnt-work-in-block-themes-fse-cause-and-fix/): You call wp_add_inline_script() inside a shortcode. It works fine on classic themes. You switch to a block theme — or your user does — and suddenly: nothing. No PHP error, no warning, just a silent failure and a X is not defined in the browser console. This is a known inconsistency tracked in WordPress Trac - [How I Improved WPFeatureLoop’s Activation Rate by 80% with WordPress Playground](https://eduardovillao.me/how-i-improved-wpfeatureloops-activation-rate-by-80-with-wordpress-playground/): Most SaaS products have a gap between signup and the moment users actually get it. For WPFeatureLoop, that gap was brutal. Users would create an account, look at the dashboard, and then… nothing. The next step was installing an SDK via Composer. For a WordPress developer who just wanted to see if the tool was - [Why You Should Stop Using left and right in CSS](https://eduardovillao.me/why-you-should-stop-using-left-and-right-in-css/): Anyone who has been in programming for a while has gotten used to writing margin-left, padding-right, and rounded-l almost automatically. It’s muscle memory for any developer, and most people still write CSS like this: Or, in Tailwind: It works. It always has! But there are situations where this stops being just a detail and starts - [Masky.js: A Lightweight Alternative to Inputmask, Cleave.js, and IMask](https://eduardovillao.me/masky-js-a-lightweight-alternative-to-inputmask-cleave-js-and-imask/): Finding the right input masking library can be tricky. There are many options, each with its pros and cons. Some are feature-packed but heavy, while others are lightweight but miss critical functionalities like validation or mobile-friendly optimizations. In today’s world, where performance and user experience are top priorities, selecting the right library is crucial. A - [Exciting Updates for Form Masks for Elementor Free and PRO Versions!](https://eduardovillao.me/exciting-updates-for-form-masks-for-elementor-free-and-pro-versions/): We’re thrilled to announce the latest updates to Form Masks for Elementor, both for the Free and PRO versions. With these enhancements, we’ve taken form input control and customization to the next level. Whether you’re a Free version user or a PRO subscriber, there’s something new for you! What’s New in the PRO Version? Our - [Handle Elementor Popup Events Without jQuery](https://eduardovillao.me/handle-elementor-popup-events-without-jquery/): If you’ve ever worked with Elementor and tried to manipulate its popups programmatically, you’ve probably noticed that the official documentation provides event handling examples only with jQuery. However, if you prefer a modern and lightweight solution using Vanilla JavaScript, this guide is for you. With the MutationObserver API, you can monitor changes to the DOM - [How to Self-Host WordPress Plugins on Github and Deliver Updates](https://eduardovillao.me/how-to-self-host-wordpress-plugins-on-github-and-deliver-updates/): Managing plugin updates can be a challenge, especially if you’re not relying on the WordPress Plugin Repository. But what if you could self-host your plugins on GitHub and deliver updates seamlessly, without the need for complex libraries or third-party services? In this guide, I’ll walk you through a simple yet powerful solution that adheres to - [Action after confirm payment on WooCommerce](https://eduardovillao.me/action-after-confirm-payment-on-woocommerce/): You need start any action only payment is confirmed? If yes, this post will help you. This a simple but very efficient snippet. How to create action after payment confirmed on WooCommerce? Snippet to start specific function after payment is confirmed on WooCommerce. In this example, after payment is confirmed set the new value to - [How to add a mask to the Elementor form [FREE]](https://eduardovillao.me/elementor-form-mask/): Form Masks for Elementor create a custom control in field advanced tab for your customize your fields with masks. This plugin require the Elementor Pro (Form Widget). The masks function with filed types ‘text’ and ‘tel’. Add a mask to the Elementor form Just download the plugin in the WordPress directory and install it on - [How to center Tabs on Elementor](https://eduardovillao.me/center-elementor-tabs/): Did you ever need to use the Elementor tabs widget (or Tabs), and needed to center the tabs, but did not find these options in the widget? (unfortunately this option does not even exist in the Widget). Yeah, you’re not the only one. I have received this doubts on social networks and through our consultancy. - [How to center the Contact Form 7 submit button](https://eduardovillao.me/how-to-center-the-contact-form-7-submit-button/): This is a very common question of WordPress users: how to centralize the contact form 7 submit button? It’s easier than you think. I’ll show below. How to center the Contact Form 7 submit button To do this is very simple. You just need to create your contact form the way you want it, and ## Posts (Português) - [IA sem padrão é só caos mais rápido](https://eduardovillao.me/pt-br/ia-sem-padrao-e-so-caos-mais-rapido/): Todo time de engenharia que eu converso está usando IA. Ninguém debate mais isso. O que ninguém está falando é que cada dev no mesmo time está usando de um jeito diferente. O problema que ninguém admite Dez devs. Dez setups diferentes. Dez arquivos de regras diferentes. Dez hábitos de prompting diferentes. Mesmo codebase, mesmos - [Seus logs de 404 são um relatório de segurança que você está ignorando](https://eduardovillao.me/pt-br/seus-logs-de-404-sao-um-relatorio-de-seguranca-que-voce-esta-ignorando/): A maioria dos devs WordPress instala um plugin de redirect, configura uns 301, e nunca mais olha pros logs de 404. Isso é um erro. Seus logs de 404 são um mapa em tempo real de quem está sondando seu site e o que estão procurando. Bots escaneando arquivos de ambiente expostos, vazamento de credenciais, - [O que 150+ votos de feature me ensinaram sobre construir as coisas erradas](https://eduardovillao.me/pt-br/o-que-150-votos-de-feature-me-ensinaram-sobre-construir-as-coisas-erradas/): Estou usando o WPFeatureLoop nos meus próprios plugins há pouco mais de um mês. Nesse período, coletei mais de 150 votos em 11 feature requests, e isso já mudou o que vou construir a seguir. Aqui vai como os dados realmente são, e o que eles me ensinaram sobre meus próprios pontos cegos como desenvolvedor. - [Na Era da IA, Soft Skills São as Hard Skills](https://eduardovillao.me/pt-br/na-era-da-ia-soft-skills-sao-as-hard-skills/): Quanto mais poderosa a IA fica, mais humano o gargalo se torna. Você abre um chat novo, digita um prompt vago, recebe uma resposta medíocre e culpa o modelo. O modelo não é o problema. O Que Realmente Mudou Na última década, a coisa mais valiosa que um desenvolvedor podia fazer era executar. Escrever o - [wp_add_inline_script não funciona em Block Themes (FSE): Causa e Solução](https://eduardovillao.me/pt-br/wp_add_inline_script-nao-funciona-em-block-themes-fse-causa-e-solucao/): Você chama wp_add_inline_script() dentro de um shortcode. Funciona perfeitamente em temas clássicos. Aí você troca pra um block theme — ou seu usuário troca — e de repente: nada. Sem erro PHP, sem warning, só uma falha silenciosa e um X is not defined no console do browser. Isso é uma inconsistência conhecida, rastreada no - [Como Eu Melhorei a Taxa de Ativação do WPFeatureLoop em 80% com WordPress Playground](https://eduardovillao.me/pt-br/como-eu-melhorei-a-taxa-de-ativacao-do-wpfeatureloop-em-80-com-wordpress-playground/): A maioria dos produtos SaaS tem um gap entre o signup e o momento em que o usuário realmente entende o produto. No WPFeatureLoop, esse gap era brutal. Usuários criavam uma conta, olhavam o dashboard, e… nada. O próximo passo era instalar um SDK via Composer. Pra um dev WordPress que só queria ver se - [Por que você deveria parar de usar left e right no CSS](https://eduardovillao.me/pt-br/por-que-voce-deveria-parar-de-usar-left-e-right-no-css/): Quem já está no mundo da programação há algum tempo se acostumou a escrever margin-left, padding-right e rounded-l quase no automático. Virou muscle memory de qualquer dev e a maioria das pessoas ainda escreve CSS assim: Ou, no Tailwind: Funciona. Sempre funcionou! Mas existem situações em que isso deixa de ser só detalhe e começa - [Meu primeiro WordCamp Brasil (Rio de Janeiro)](https://eduardovillao.me/pt-br/meu-primeiro-wordcamp-brasil-rio-de-janeiro/): No final de novembro participei do WordCamp Brasil 2025, realizado no Rio de Janeiro. Foi meu primeiro WordCamp, algo que eu já tinha vontade de vivenciar há bastante tempo, então deixo aqui esse registro pessoal da experiência. A participação no evento também contou com o apoio da Extendify, empresa onde trabalho atualmente, o que tornou - [Como Auto-Hospedar Plugins do WordPress no GitHub e Entregar Atualizações](https://eduardovillao.me/pt-br/como-auto-hospedar-plugins-do-wordpress-no-github-e-entregar-atualizacoes/): Gerenciar atualizações de plugins pode ser um desafio, especialmente se você não está utilizando o repositório oficial de plugins do WordPress. Mas e se você pudesse auto-hospedar seus plugins no GitHub e entregar atualizações de forma transparente, sem a necessidade de bibliotecas complexas ou serviços de terceiros? Neste guia, apresento uma solução simples e poderosa - [Manipule Eventos de Popups do Elementor Sem jQuery](https://eduardovillao.me/pt-br/manipule-eventos-de-popups-do-elementor-sem-jquery/): Se você já trabalhou com o Elementor e tentou manipular seus popups programaticamente, provavelmente percebeu que a documentação oficial oferece exemplos de manipulação de eventos apenas com jQuery. Porém, se você prefere uma solução moderna e leve utilizando Vanilla JavaScript, este guia é para você. Com a API MutationObserver, você pode monitorar alterações no DOM - [Masky.js: Uma Alternativa Leve ao Inputmask, Cleave.js e IMask](https://eduardovillao.me/pt-br/masky-js-uma-alternativa-leve-ao-inputmask-cleave-js-e-imask/): Encontrar a biblioteca certa para mascarar inputs pode ser um desafio. Existem muitas opções disponíveis, cada uma com seus prós e contras. Algumas são repletas de recursos, mas pesadas; outras são leves, mas carecem de funcionalidades importantes, como validação ou otimizações para dispositivos móveis. No mundo atual, onde performance e experiência do usuário são prioridades, - [Como adicionar máscara nos campos do formulário do Elementor – plugin gratuito](https://eduardovillao.me/pt-br/mascara-nos-campos-do-formulario-do-elementor/): Sim, eu tenho certeza que você já ter se perguntado: por que o formulário do Elementor não tem máscaras para os campos? Comigo não foi diferente, então pra ajudar desenvolvi um plugin gratuito para te ajudar a resolver esse problema de uma vez por todas! Adicionando as máscaras ao formulário Primeiro, você precisa baixar o - [Executar ação após o pagamento ser confirmado no WooCommerce](https://eduardovillao.me/pt-br/executar-acao-apos-o-pagamento-ser-confirmado-no-woocommerce/): Ai chega aquele requisito de executar uma ação apenas após a confirmação de pagamento do pedido (através do WooCommerce, é claro), como é que faz? Há algum tempo atrás precisei fazer isso e achei aqui nas minhas anotações esses dias, então resolvi compartilhar! O WooCommerce já tem uma action prontinha pra gente utilizar, e ela - [Como centralizar o botão enviar do Contact Form 7](https://eduardovillao.me/pt-br/como-centralizar-o-botao-enviar-do-contact-form-7/): O contact form 7 é um dos plugins mais utilizados para formulário no WordPress. Ele tem um visual simples, mas tem milhares de possibilidades de customização. Alguns temas, plugins e até page builders trazem algumas opções de customização de estilo mais avançada para seus formulários. Mas, nem sempre você encontra exatamente o que gostaria. E - [Como centralizar as tabs do Elementor?](https://eduardovillao.me/pt-br/como-centralizar-as-tabs-do-elementor/): Você já precisou utilizar o widget de tabs (ou Abas) do Elementor, e precisava centralizar as tabs, mas não achou essas opções no widget? Você não é o único! Tenho recebido com certa frequência essa dúvidas, então, sem muita enrolação, vamos pra solução! Como centralizar as tabs? É simples, você vai precisar utilizar um código ## Pages (English) - [About](https://eduardovillao.me/about/): Nice to meet you, I’m Eduardo Villão! I’m a product-oriented full-stack developer with over a decade of experience building high-impact web applications. I have a strong foundation in WordPress and also work extensively with modern stacks such as React, Next.js, PHP (Symfony, Laravel), and Ruby on Rails (including Hotwire). Beyond the technical side, I focus - [Cookie Policy](https://eduardovillao.me/cookie-policy/): About this cookie policy This Cookie Policy explains what cookies are and how we use them, the types of cookies we use i.e, the information we collect using cookies and how that information is used, and how to control the cookie preferences. For further information on how we use, store, and keep your personal data ## Pages (Português) - [Sobre](https://eduardovillao.me/pt-br/sobre/): Sou Eduardo Villão, desenvolvedor full-stack orientado a produto, com mais de 10 anos construindo soluções de alto impacto em WordPress, Next.js, Symfony, IA e plataformas SaaS multi-tenant. ## Solutions Products, plugins, and open-source tools. Some commercial, some open — all born from real pains observed in practice. Pages: https://eduardovillao.me/solutions/ (EN) · https://eduardovillao.me/pt-br/solucoes/ (PT) ### PRODUCTS - [WPFeatureLoop](https://wpfeatureloop.com/): Feedback and roadmap platform for WordPress plugins. Collect votes, prioritize features, and close the loop with users directly from wp-admin. - [MatchTube](https://www.matchtube.io/): AI that finds YouTube micro-influencers with high affinity for your product. Automatic channel recommendations from your product or SaaS URL. - [Repta](https://repta.com.br/): AI-powered review monitoring for restaurants. Real-time Google and iFood rating alerts on WhatsApp, with AI-suggested replies and sentiment analytics. - [Submito](https://www.submito.com.br/): Form builder for Notion, built for Brazil. Validated CPF/CNPJ fields and automatic address lookup from CEP — clean data straight into your Notion database. - [FormRoute](https://formroute.dev/): Form backend with a single endpoint. Validates fields, filters spam at the edge, and routes submissions to email, Slack, Sheets, or webhooks — no backend to build. ### WORDPRESS PLUGINS - [MyD Delivery](https://wordpress.org/plugins/myd-delivery/): Turns your site into a complete ordering and delivery system. - [MyD Delivery Widgets](https://wordpress.org/plugins/myd-delivery-widgets/): Widgets to display your menu, order buttons, and store info. - [Order on Mobile for Woo](https://wordpress.org/plugins/woo-order-on-whatsapp/): Sends WooCommerce orders to WhatsApp. Turns checkout into a conversation. - [Shipping per Neighborhood](https://wordpress.org/plugins/shipping-per-neighborhood-for-woocommerce/): Delivery rules by neighborhood — pricing and availability per area. - [Add Class to Elementor Image](https://wordpress.org/plugins/add-class-to-elementor-image/): Custom CSS classes on Elementor's Image widget, no wrappers. - [Form Masks for Elementor](https://wordpress.org/plugins/form-masks-for-elementor/): Input masks for Elementor forms — better validation and UX. - [Extensions for Elementor Form](https://wordpress.org/plugins/extensions-for-elementor-form/): Advanced validations, fields, and behaviors for Elementor forms. ### OPEN-SOURCE TOOLS - [wp-since](https://github.com/eduardovillao/wp-since): Checks plugin compatibility with minimum WordPress core versions — functions, classes, and hooks. - [masky.js](https://www.npmjs.com/package/masky-js): Ultra-lightweight input masks. Zero dependencies, framework-agnostic, performance-first. - [wp-self-host-updater-checker](https://github.com/eduardovillao/wp-self-host-updater-checker): Lets plugins check for updates from self-hosted repositories, outside WordPress.org. - [wp-self-host-updater-generator](https://github.com/eduardovillao/wp-self-host-updater-generator): Generates update manifests for self-hosted plugins — versioning via GitHub or your own servers. ## Optional - [Full content in Markdown](https://eduardovillao.me/llms-full.txt) - [RSS — English](https://eduardovillao.me/feed.xml) - [RSS — Português](https://eduardovillao.me/pt-br/feed.xml) - [Sitemap](https://eduardovillao.me/sitemap-index.xml)