Category: WordPress Plugins

  • Semantic search using AI, for Framer sites

    Framer’s built-in search component matches substrings. A visitor types “sustainable sneakers”, your product is called “eco-friendly trainers”, the results panel is empty. The page loads fine, the visitor leaves, and nothing in your analytics tells you what happened.

    Swapping that out for a semantic layer is a small amount of specific work. This is what it looks like on a Framer site.

    Why substring search quietly loses sales

    Substring match is cheap, instant, and only ever finds exactly the words the author happened to write. It cannot see synonyms. It cannot see translations. It cannot see intent. On a small marketing site that is fine, because people mostly navigate. On a site with any kind of catalogue – products, articles, case studies, talks – it starts to leak.

    Semantic search fixes exactly that gap: it compares the meaning of the query to the meaning of each item, by turning both into vectors with an embeddings model. Cosine similarity between those vectors is your score. It does not replace keyword match – you still want “Model 3” to pin exactly – but it is what you reach for when the visitor speaks their own language, not yours.

    The three pieces

    You need three small things working together:

    • An indexer that reads your Framer CMS, turns each item into an embedding, and stores it somewhere you can query.
    • A search endpoint that takes a user query, embeds it, and returns the top matches by cosine similarity.
    • A Code Component on your Framer site that talks to that endpoint and renders the results.

    None of these are large. The whole thing lives in a few hundred lines.

    Indexing the CMS

    Framer exposes CMS collections as JSON at a public URL – the same one the site uses to render itself. You read it, feed each item’s text through an embeddings model, and store the resulting vector against the item’s id. Do this on a schedule, or on a webhook if your workflow has one.

    Pick a small embeddings model – text-embedding-3-small is 1536 dimensions, costs almost nothing, and is more than accurate enough for a marketing-site catalogue. Store the vectors anywhere you can list and compare them: a single JSON file in R2, a Supabase table with pgvector, a KV namespace keyed by item id. For sites below a few thousand items the simplest thing – a flat array in memory – will outperform anything fancier.

    The search endpoint

    At query time you embed the incoming query with the same model, score it against every stored vector, sort, return the top few. Cosine similarity reduces to a dot product when both vectors are L2-normalised, which is the first micro-optimisation worth doing.

    The threshold is the one knob you will revisit. Too low and unrelated items start creeping in. Too high and the search feels empty. For a marketing catalogue, somewhere between 0.30 and 0.45 usually lands.

    The Code Component

    Framer lets you drop a React component onto the canvas. For search, you want a debounced input, an AbortController so stale responses do not overwrite fresh ones, and a small results panel that renders whatever shape you returned.

    Two details that matter more than they look. Debounce at ~200ms: anything less and you pay for every keystroke, anything more and the search feels sluggish. And abort in-flight requests on every new keystroke, otherwise a slow response for “sus” will land after “sustainable sneakers” and briefly overwrite the correct results.

    Where this breaks

    Semantic search is not a free upgrade. Three things to be honest about.

    Exact matches still matter. If someone types a SKU or a product name verbatim, you want that result pinned first, not ranked 0.78 behind something fuzzier. Keep a keyword pre-pass; only fall back to vectors when it returns nothing – or use both, and merge, with keyword matches on top.

    Latency compounds. The embeddings call for the query is a network round-trip. If your endpoint lives on the other side of the planet, 150ms feels like a long time. Co-locate the endpoint with the visitor if you can; cache popular queries if you cannot.

    CMS drift. Nothing is worse than semantic search that confidently returns an item that no longer exists. Your indexer has to run often enough that deletes and renames propagate – or the endpoint has to re-validate hits against the live collection before returning them.

    The shortcut

    The snippets above are the whole pattern – if you want to own it end to end, that is all you need. If you do not, I have packaged exactly the three pieces into AI Search for Framer, on the Framer Marketplace. You install it, point it at your CMS collection, and it handles the indexer, the embeddings endpoint, and the Code Component that renders the results. One threshold slider is the only knob, and it reindexes automatically when the CMS changes.

    Either way, the thing worth internalising is the shape: embeddings turn “words your visitors use” and “words you wrote” into vectors in the same space, cosine similarity scores how close they are, and everything else is plumbing.

  • AI isn’t just agents: my talk at WordPress Day for AI 2026

    On October 24, 2026, Portugal hosted its first WordPress event dedicated entirely to AI. I was one of six featured speakers and had a 15-minute slot on the technical track to argue a quiet point: agents are not the only shape AI takes in WordPress — and vector embeddings deserve a lot more airtime than they get. Here’s the talk, the slides, the recording, and why I think this is where most WordPress site owners should start.

    The event

    WordPress Day for AI Faro 2026 ran on Saturday, October 24, 2026 at the AP Eva Senses hotel in Faro, Portugal. It was organised by Ruben Martins, Alvaro Gois, Marco Almeida, Fellyph Cintra and Jose Freitas — and, as The Repository reported, it was the first WordPress event in Portugal built entirely around artificial intelligence. Two parallel tracks, around a hundred attendees, one day.

    I was one of six featured speakers on the WPFolks lineup, alongside Sofia Correia, Lucas Catao de Moraes, Marcel Schmitz, Filipa Freitas and Jamie Marsland — a mix of WordPress agency perspective, developer tooling, and the broader “what does AI actually mean for publishing” conversation.

    My talk: AI isn’t just agents

    My session ran from 12:30 to 12:45 on the technical track. Fifteen minutes is tight, but it was enough to make one argument: the “AI in WordPress” conversation has become dominated by chatbots and agents, and that’s leaving a huge, boring, extremely useful piece of the stack out of the picture.

    Vector embeddings are the opposite of a chatbot. There’s no persona, no streaming reply, no “please wait while I think”. You take a piece of text, turn it into a 1,536-number vector that encodes its meaning, and from then on you can compare meanings mathematically. That’s it. From that one primitive, you unlock a lot:

    • Semantic search on your WordPress site. A visitor types “cheap trainers for the gym” and finds your “Nike Pegasus running shoes under 90€” page — not just posts that happen to contain the exact word trainers.
    • Content discovery that actually works. “Related posts” that are related by meaning, not just by category.
    • Smarter product recommendations. Suggestions that follow intent instead of SKU codes.
    • Multilingual retrieval for free. The same vector space understands “running shoes” and “sapatilhas de corrida” are the same thing.

    None of this needs an agent. None of it streams. It costs a fraction of a cent per piece of content indexed, and it runs sub-30 milliseconds once it’s wired up.

    Why I keep coming back to this

    Agents are impressive. They’re also hard to make reliable, expensive to run at scale, and overkill for most of the places WordPress site owners actually want “a bit of AI”. A vector-embeddings pipeline sits quietly in that 90%: a one-time index of your content, and from then on it just answers queries fast.

    I spent the last year building AI Search — the plugin I demoed on stage — to make this accessible to WordPress site owners without needing to touch an embedding API or a vector database. If you’re curious about the engineering behind it, I’ve written about it in depth at AI Search: WordPress Search with AI Embeddings.

    If you’re a WordPress developer or a shop owner reading this: this is where I’d point your attention first, before you build an agent.

    Resources

  • Do the slow work after the page is sent: WordPress’s shutdown hook

    Last month I added a search log to my WordPress plugin: every time the AI layer surfaced a product that plain keyword matching had missed, I wanted a row in a table saying so. Useful feature. Also a great way to make every single search on someone’s store slower, if you write it the obvious way.

    The fix is a WordPress hook that does not get talked about enough: shutdown.

    The problem with the obvious version

    You are already inside the search filter, you have the data, so you write the row there:

    It works. It is also bookkeeping that the shopper is paying for with their time. One INSERT is a millisecond or two, which sounds like nothing until you remember that this runs on every search, that the database might be on another host, and that your “one small write” has a way of becoming three writes and a lookup six months later.

    The visitor needs the search results. They do not need your analytics.

    What the shutdown hook actually is

    shutdown is the last action WordPress fires. Core registers it as a PHP shutdown function, so it runs at the very end of the request – after the template has rendered, after the response has been handed off. It fires on normal page loads, on AJAX, on REST requests, and even when something calls wp_die().

    That makes it the natural home for work that must happen during a request but that nobody is waiting for.

    Why it feels instant: fastcgi_finish_request()

    On PHP-FPM – which is what most decent hosting runs – PHP can tell the web server “I am done, send it” and keep executing. WordPress core and various plugins call fastcgi_finish_request() at the end of a request, so by the time your shutdown callback runs, the browser has already received the page and started rendering it.

    Be honest with yourself about what that means, though. The visitor is not waiting, but the PHP worker still is. You have moved the cost off the perceived page load and onto your pool of workers. That is a very good trade for a single INSERT. It is a terrible trade for something that takes two seconds, because under traffic you will run out of workers and the queue will bite you in a much less obvious way.

    On old mod_php or CGI setups the connection may not be closed early at all, so the technique degrades to “same total time, tidier code”. Nothing breaks – it just stops being a performance win.

    The pattern, in three moves

    This is the actual code from AI Search 1.31.0, trimmed for reading. First, register the hook where you register the others:

    Second, during the request you only collect. No queries, no writes – just put what you know on the object and carry on:

    Third, the callback that actually writes. Note the early return and the null: this thing must be safe to call when there is nothing to do, and safe to call twice.

    That is the whole trick. The search path does zero database work for logging; the row still lands on every relevant request; and the shopper never waits for it.

    When you should not reach for it

    • Anything the response depends on. Obvious when written down, easy to forget at 11pm. If the page needs the result, it cannot happen after the page.
    • Anything slow. Calling an external API, resizing images, sending mail through a slow SMTP server – all of these hold a worker hostage. That is what WP-Cron, or a real queue, is for.
    • Anything that needs to output. Headers are long gone. No redirects, no cookies, no printing. If you echo something here you will either see it glued to the end of your page or nowhere at all.
    • Anything that must not be lost. A fatal error, a killed worker or an aggressive timeout can end the request before your callback runs. For a search log that is fine. For an order, it is not.

    Small gotchas worth knowing

    $wpdb is still perfectly alive at this point, so queries work normally. Object cache writes, on the other hand, are mostly pointless: nothing else in this request will read them. And if you use a persistent object cache, remember that other requests may already be serving cached output that does not know about your write – so do not use shutdown to fix up something the current page displayed incorrectly.

    Also, keep the callback idempotent. In unusual flows (some AJAX handlers, some error paths) you can end up with the shutdown sequence running more than once. Nulling the pending payload after reading it, as above, is the cheapest possible insurance.

    The result in practice

    In AI Search this powers the Insights tab: store owners can see which searches the AI actually rescued – the queries where semantic matching surfaced products that keyword matching had missed – without the logging costing their shoppers anything. Same feature, same data, moved a few milliseconds to the right in the request lifecycle.

    It is a small technique. But “does this actually need to block the response?” is a question worth asking about half the code in a typical plugin, and shutdown is the tool for the times when the answer is no.

  • Don’t paste your passwords into Claude (do this instead)

    Last week I gave an AI agent admin access to a live WordPress site – on purpose, and without ever showing it my password. Here’s what I learned about doing this properly, including the two things that went wrong and the one time the AI refused to do what I asked. All of it is a lesson.

    The setup

    I’ve been using Claude Code to work on AI Search, my WordPress plugin, and on its marketing site. At some point the natural next step was obvious: I wanted the agent to edit the site directly – rewrite pages, create content, manage settings – instead of me copy-pasting everything it produced.

    That means giving an AI credentials to a production website. Most people do this the worst possible way: they paste their admin password straight into the chat. Please don’t. Here’s the thing about a chat conversation: you don’t control where that text goes, how long it’s retained, or what other tooling sees it. A password pasted into any chat – AI or otherwise – should be considered burned.

    What we did instead

    1. An Application Password, not my real password. WordPress has had Application Passwords built in since 5.6, and they’re made exactly for this. They only work over the REST API – they can’t be used to log into wp-admin – and each one is a separate credential you can revoke without touching your real password. One click in Users → Profile → Application Passwords and the agent’s access is gone, while yours is untouched.

    2. A local file, outside any git repository. The agent needs to read the credential somehow. We put it in a plain text file on my desktop – deliberately outside every project folder – so there was zero chance of it being committed to a repository. If a secret is anywhere near a git repo, sooner or later it ends up in one. The file’s location was mentioned in chat; its contents never were.

    3. Least privilege, named access. Name the application password after who’s using it (“claude”), so when you look at your access list in six months you know exactly what it is and whether it should still exist. And give the underlying user only the role the job needs – an Editor role is enough for content work; save Administrator for when settings genuinely need changing.

    4. Revoke when the work pauses. An unused credential is pure risk. When the project goes quiet, revoke it. Making a new one next time costs thirty seconds.

    What went wrong (and taught me things)

    The CDN ate the Authorization header. Our first attempts failed with a misleading “not logged in” error. The password was fine – the hosting CDN was stripping the Authorization header before it ever reached WordPress. The diagnosis was interesting in itself: a wrong password should produce a different error than a missing one, and it didn’t, which told us WordPress never saw the credential at all. The fix was passing the credential under a custom header name that the CDN leaves alone, restored server-side by a small snippet. Lesson: when API auth fails mysteriously, suspect the infrastructure between you and the application before suspecting the password.

    The stale password. Later, everything worked except authentication – headers arriving, HTTPS detected, and still rejected. The application password in the file simply wasn’t the one in WordPress anymore. Regenerating it fixed everything in a minute. Lesson: application passwords are shown once; if there’s any doubt about a copy-paste, don’t debug – regenerate.

    The time the AI said no

    At one point I asked the agent to clean up a leftover diagnostic endpoint. The code snippet that contained it was locked to its author (me), so the agent couldn’t edit it directly – and when it tried to route around that restriction from a different snippet, its own safety layer stepped in and blocked the action, telling it to stop and explain the situation to me instead.

    Which it did. I made the one-line edit myself in thirty seconds.

    I want to highlight this because it’s the opposite of a failure. An agent that will happily engineer its way around access controls is an agent you can’t trust with credentials at all. The boundary held, the human was informed, and the work still got done – with the right person doing the sensitive part. That’s exactly the division of labour you want.

    The checklist

    If you’re going to let an AI agent work on your WordPress site – and honestly, it’s worth it – do it like this:

    • Never paste real passwords into any chat. Anywhere. Ever.
    • Use Application Passwords (or scoped API tokens on other platforms). They’re revocable, auditable, and can’t open wp-admin.
    • Keep the credential in a local file outside your repositories, and reference the file, not the secret.
    • Name the credential after its user and grant the minimum role that does the job.
    • Expect infrastructure weirdness – CDNs and security layers love to strip auth headers. Test with a deliberately wrong credential: if the error doesn’t change, your password isn’t the problem.
    • Revoke on pause, regenerate on doubt.
    • Prefer agents with working guardrails. The refusal is a feature. If your agent never says “I shouldn’t do this – you do it”, that’s not convenience, that’s exposure.

    The result of all this? Over a few days, the agent shipped three plugin releases, rebuilt the marketing site, built a live demo, and translated the entire admin into three languages – and at no point did it know my password, and at any moment I could cut its access with one click. That’s the deal you want: full productivity, revocable trust.

    I build and customize AI-powered search for WordPress and WooCommerce. If you’re thinking about this kind of setup for your own project, let’s talk.

  • Your Search Bar Is Your Back Door: And Here’s How to Lock It

    Last Saturday I spoke at WordCamp Europe 2026 in Kraków about a topic that’s been on my mind for a while: the WordPress search endpoint as a DDoS attack vector.

    The talk was called “The Hidden DDoS Threat in WordPress: Abusing the Search Endpoint“ and the response was incredible (thank you very much!!). However, some feedback came after the talk, and it pushed me to build something better.

    You can see the session here: https://europe.wordcamp.org/2026/session/the-hidden-ddos-threat-in-wordpress-abusing-the-search-endpoint/

    What the talk covered

    The core idea is simple. Every WordPress site has a search endpoint (/?s=). Unlike your regular pages, search queries bypass CDN and cache entirely. Every single search request hits your database directly with a LIKE ‘%query%’ full table scan.

    An attacker doesn’t need a botnet. Just flood /?s= with random strings and your database is on its knees.

    During the talk, I showed a live benchmark comparing DDoS attacks on cached pages versus the search endpoint. Same number of requests. Completely different results. The cached pages didn’t even make the server sweat. The search endpoint brought it down.

    Photo by Claudio Schwarz

    The solution approach and the feedback

    In the talk, I proposed using wp_create_nonce() as a first line of defense. The idea was straightforward: generate a nonce on page load, require it for search requests, and block anything without it. Bots don’t load pages, so they never get the nonce.

    The point I was making is that WordPress has had tools to mitigate this since 2006. We just don’t use them, however some people raised a valid point:

    I can JUST USE the nonce and use it in my DDoS LIKE IN THE BROWSER!
    random hacker saying correct things

    They’re right. And I appreciate that feedback. The nonce approach raises the bar and stops the simplest and automated attacks. But it’s not bulletproof. A determined attacker can work around it. So let me prepare something and bring a solution that will meet the expectations. I was so frustrated with myself that I basically started to think about a solution in Krakow yet.

    Introducing WP Search Shield

    WP Search Shield is a WordPress plugin that protects your search endpoint with two layers of defense that work together.

    Layer 1: Single-use tokens

    Instead of a WordPress nonce that lasts hours, WP Search Shield generates a unique token on every page load. This token can only be used once. The moment it’s used for a search request, it’s deleted from the database and a new one is issued.

    This means:

    • An attacker extracts the token from your HTML? It works once. That’s it.
    • They want to search again? They need to load the full page again to get a new token.
    • At that point, they’re just a regular user. DDoS over.

    Layer 2: IP rate limiting

    Even if someone finds a way to rotate tokens quickly, they’re still limited to a configurable number of searches per time window. Default is 10 searches per 60 seconds per IP.

    After that? 429 Too Many Requests.

    How they work together

    AttackWithout pluginWith plugin
    Bot hits /?s=random directlyHits database403 — No token
    Bot extracts token, sends 1000 requestsAll hit databaseFirst works, rest get 403
    Bot refreshes token each timeAll hit databaseRate limited after 10
    Real user searches normallyWorksWorks seamlessly

    The plugin handles everything automatically. It injects tokens into search forms, patches fetch() and XMLHttpRequest for REST API calls, and rotates tokens after each search. Zero configuration needed.

    It works with your existing stack

    WP Search Shield is built on WordPress transients. If you’re running Redis or Memcached (which you should be), token validation and rate limiting happen in memory. No extra database queries. No external services.

    It protects both traditional search (/?s=) and REST API search (/wp-json/wp/v2/search).

    Try it yourself

    The plugin is open source and available on GitHub:

    check it here: github.com/samuelsilvapt/wp-search-shield

    Install it, activate it, done. It works out of the box with sensible defaults.

    If you want to customize it, everything is configurable via filters:

    You can also hook into blocked requests for monitoring:

    The bigger picture

    This plugin isn’t a replacement for a CDN or a WAF. It’s a targeted fix for a specific problem that those tools can’t solve.

    Your CDN caches static content beautifully. Your object cache speeds up repeated queries. But search queries are unique by nature. They can’t be cached. And that’s exactly what attackers exploit.

    WP Search Shield closes that gap.

    chilling in a random cafe in kraków while working on the plugin

    Thank you, WCEU

    To everyone who came to the talk, asked questions, and challenged the nonce approach: thank you. You made this better. But I want to say something beyond the technical stuff.

    I reconnected with old friends I hadn’t seen in years. I made new ones over coffee, over beers, over late-night conversations about everything but WordPress. I created memories that I know I’ll carry for a long time.

    There’s something special about this community. It’s not just about work, code or plugins or themes. It’s about people who genuinely care about each other and push each other to grow. I felt that in every conversation, every handshake, every “great talk” from someone in the hallway.

    And kraków, you were unforgettable.

  • Is AI Search plugin close to Production-Ready?

    Remember when I first wrote about building an AI-powered WordPress search with embeddings? Back then, I was excited about the concept, but I was aware there was a thin line between a proof-of-concept and something you’d want to run on a real site.

    Well, a few months and several user complaints later, I’ve learned a lot about what it takes to make AI search actually work in production. Here’s what I’ve been fixing and why.

    Reality Check

    When I first shipped AI Search, I was focused on the cool tech like embeddings, cosine similarity, semantic understanding. The code worked, but I made some classic engineer mistakes:

    On a site with 50 posts? No problem. On a site with 5,000 posts? Users started complaining about 10-second page loads.

    The Service Registration Problem

    The biggest issue was embarrassingly simple. I was calling our external embedding service during __construct(), which meant every single page load triggered an API call:

    Users were getting 20-second page loads because my plugin was trying to register with our service on every request, and my service wasn’t online for months (for some reason).

    The fix: Move registration to only happen when users actually save their settings (only admin page consuming). Revolutionary, I know.

    The Search Performance Issue

    Remember that numberposts => -1 from earlier? That was pulling every post into memory, calculating embeddings for all of them, just to return maybe 10 results. On larger sites, this was doing thousands of similarity calculations per search.

    I had to rethink the entire approach:

    • Added result caching (search results are cached for 5 minutes)
    • Limited the scope of posts we process
    • Added early exit conditions

    The difference? Search went from 3-8 seconds to sub-second on most sites.

    Cache Management: Learning from Users

    One thing I didn’t anticipate was how much users would want control over their embedding data.

    So I built a proper cache management interface. Three levels of control:

    1. Clear cache only – Safe, embeddings regenerate automatically
    2. Clear post embeddings – Nuclear option, requires manual regeneration
    3. Clear everything – Start fresh (with appropriate warnings)

    Plus real-time stats showing exactly what’s cached and how much space it’s using.

    Similarity Threshold Refactoring

    In my original post, I mentioned needing a similarity threshold but didn’t really dive into the practical implications. Turns out, this was more important than I thought.

    Initially, I had the range set to 0.0-1.0 with 0.01 precision. But users kept getting irrelevant results with lower thresholds. After analyzing actual usage patterns:

    • Values below 0.5 rarely returned useful results
    • Users needed finer control for their specific content types
    • The difference between 0.750 and 0.753 can be significant for some use cases

    New approach: 0.5-1.0 range with 0.001 precision. Much better real-world results.

    What’s Actually Next

    I’m not done. The roadmap includes:

    • Search analytics – Understanding what people search for
    • Better content support – Custom fields, taxonomies, media
    • API endpoints – For headless setups and external integrations
    • Background processing – For sites with massive content volumes

    The Real Takeaway

    The technical implementation of embeddings and cosine similarity was the easy part. The hard part was making it work reliably for real users on real sites with real constraints.

    If you’re building AI-powered features, spend as much time thinking about edge cases, performance, and user control as you do about the actual AI. Your users will thank you.

    The current version (1.7.0) is what I should have shipped originally. it works, it’s fast, and it gives users the control they need. Sometimes you have to ship the MVP to learn what the actual product should be.

  • PHP 8.0 – 4 new features in this latest version

    PHP 8.0 – 4 new features in this latest version

    New PHP major versions are always very expected by PHP developers, we already know good things coming when a new release is announced. This time we have a lot of performance improvements and new features that improve our code, using modern programming methods in a badass old-school language.

    Besides those new features and recommendations, I strongly recommend we use them only for environments that we can expect and have sure that 8.0 is running. In some cases, we can use polyfills instead. If you’re a plugin developer, it’s too soon to start using the new features of this version.

    Nullsafe operator

    I really love clean and efficient code, so I’m not a fan of the classic if/else statements (why we shouldn’t use them? Read more here). However, there is always a time when we need to use a simple if/then, and the best way to do that is using an inline if statement Like this:

     $today_exists = time() ? true : false;

    Clean, useful and works like a charm. I can’t know how many times I’ve tried to check a null value of a class method (for example), giving a “then” statement in the same line. Simple – it wasn’t possible, and the solution was based into split the statement into two or more lines.

    The good news is called Nullsafe operator. PHP 8 now provides a null validation without any errors, so the following example now is pretty possible:

    $today_exists = $this->get_time()?->$this->is_true();

    str_contains() function

    With this new function, we no longer need to use the strpos() function. This last one is more recognized by developers to be used to verify if a string contains a word, like this:

    $today_exists = ( false !== strpos( 'Today is the day', 'Today' ) );

    Yes, that’s what we had to do to check if a string contains X word 🙂

    Checking the documentation, it’s really strange to see str_contains() only is available from 8.0. In this link, you can also find a pollyfill alternative.

    New match() expression

    That’s a good one for clean code. Imagine we have a switch case expression, but optimized to be used without breaks, and organized as a class sintax. I’m particullary interested into starting to use this new approach, check some examples in the documentation.

    $food = 'cake';
    
    $return_value = match ($food) {
        'apple' => 'This food is an apple',
        'bar' => 'This food is a bar',
        'cake' => 'This food is a cake',
    };
    
    var_dump($return_value);

    Enums

    Exactly like other languages (e.g. javascript), enums provides us to call a function and have a definite number of cases on the args. The result is a more stable code. This one will be available in the 8.1 release only, but it’s a great example of what it’s happening with PHP – giving to the developers great native features we can use like a modern programming language.

    I’m looking forward to use these features on my code, and I’m confident that will be possible soon – PHP 8.0 has been launched in November 2020, so please read more about WordPress and 8.0 compatibility before starting to code.

  • How to add a Full-Screen Menu to your WordPress website

    If you have a personal/commercial website and if you want to improve that website with an additional menu without replacing the current menu, just keep reading.

    (more…)
  • Are you thinking of selling WordPress Plugins / Themes at Envato Market?

    Envato is an attractive marketplace for plugin/theme developers who want to start their careers selling WordPress material. Envato is a nice solution – it gives visibility, marketing and there are a lot of people searching things there every day.

    On this post, I will talk a little about my first experience at Evanto.

    (more…)
  • Add to Google Calendar Button – Contact Form 7 (CF7)

    Hi folks! My first plugin for WordPress is available now on WP plugin repository!

    Install, test and try to hack.
    Don’t forget to give me a review 🙂