History

How WordPress plugins began: from hooks in 1.2 to one-click installs and auto-updates

History · Published 2026-10-25

Drawing of three hooks hanging from a rail above a timeline marked 1.2, 2.7, 3.7, 5.5, 6.5 and 7.0
Hooks, and the WordPress versions that changed how plugins are installed and updated. Illustration: Plain Hooks.

Every WordPress plugin, from a ten-line snippet to a full online shop, relies on a mechanism that arrived in May 2004. This is how the plugin system grew from a developer feature into the way most sites are built.

This history is written from WordPress.org's own release notes and documentation, linked throughout. The domain this site lives on published a few WordPress plugins in the mid-2000s; they are long discontinued and are not distributed here.

Before plugins: editing the code

WordPress was first released in 2003 as a fork of an earlier blogging script, b2/cafelog. In its first versions, changing how the software behaved generally meant editing its PHP files directly. Those modifications, shared on forums and personal blogs as "hacks", had an obvious problem: every upgrade overwrote them, and they had to be re-applied by hand, one file at a time.

WordPress 1.2: the hook architecture (2004)

WordPress 1.2, code-named Mingus, was released on 22 May 2004. Among its headline features, the release announcement listed a "new plugin architecture" and explained: "Plugins can now hook into nearly every action WordPress does."

That sentence describes a design still in use today. WordPress calls named hooks at defined points while it runs. There are two kinds, described in the Plugin Handbook:

A plugin is simply a PHP file with a comment header that WordPress reads, starting with Plugin Name:; the header requirements list the other fields. Because plugins live in their own folder and attach to hooks rather than rewriting core files, upgrading WordPress no longer erased customisations. The same mechanism is what the code examples on this site use, such as the phpmailer_init action in sending WordPress email through SMTP.

Themes, pages and a growing ecosystem (2005 to 2007)

WordPress 1.5 (Strayhorn, February 2005) introduced Pages and theme templates, giving designers the same kind of separation that plugins had given developers. WordPress 2.0 followed on 31 December 2005. Over these years plugins multiplied: statistics counters, spam filters, contact forms, newsletter tools and mail fixes were among the commonest, because they filled gaps that core did not cover.

Installing one was a manual job. You downloaded a ZIP file from the author's site, unpacked it, uploaded the folder to wp-content/plugins/ by FTP and activated it. Finding out about updates meant revisiting the author's site or following their blog. Many small independent sites of the time, including the one that once used this domain, published plugins this way; the same culture of hobbyist add-ons had earlier grown around instant messengers, as told in the messenger add-on era.

WordPress.org gathered plugins in a central directory, and WordPress 2.3 (Dexter, September 2007) added update notifications, so the dashboard could tell administrators when a newer version of a plugin was available there.

WordPress 2.7: installing from the dashboard (2008)

WordPress 2.7 (Coltrane, 10 December 2008) changed everyday administration. Its feature list includes a plugin browser embedded in the dashboard, one-click plugin installs, core updating, and an uninstall mechanism that lets a plugin clean up after itself when it is deleted. For the first time, a site owner could search the directory, install a plugin and keep WordPress itself up to date without touching FTP.

Further steps followed quickly: one-click theme installs in WordPress 2.8 (June 2009) and batch plugin updates in 2.9 (December 2009). "Must-use" plugins, files in wp-content/mu-plugins/ that load automatically and cannot be deactivated from the dashboard, came from WordPress MultiUser; according to the Advanced Administration handbook, the code handling them was merged into the main WordPress code in March 2009, and WordPress 3.0 (June 2010) then merged MultiUser itself into core as Multisite. Must-use plugins remain a handy place for small site-specific snippets.

Rules for the directory

As the directory became the main distribution channel, its rules shaped the ecosystem. The detailed plugin guidelines require, among other things, that plugins be compatible with the GNU General Public License, that their code be mostly human-readable, that trialware is not permitted, and that plugins may not track users without their consent. Each new plugin is reviewed before it appears, and plugins can be closed for security problems or guideline breaches.

Safer updates (2013 to 2024)

The more plugins a site ran, the more updates it needed, and an out-of-date plugin with a known vulnerability became one of the commonest ways into a hacked site. WordPress responded in stages:

VersionReleasedWhat changed for plugins
3.7October 2013Automatic background updates for maintenance and security releases of core.
5.2May 2019Site Health, protection against PHP fatal errors (a recovery mode that pauses the faulty plugin) and plugin compatibility checks.
5.5August 2020Auto-updates for plugins and themes, switchable one by one in the admin, and updating by uploading a ZIP file.
5.6December 2020Application passwords for API access.
6.5April 2024Plugin dependencies: a Requires Plugins header lists other plugins that must be installed and active first.
6.6July 2024Rollbacks when a plugin auto-update fails.

The dates and features come from the release list on WordPress.org's history page, which also records WordPress 7.0, released on 20 May 2026.

What the old plugins tell us

Looking back at the plugins of 2005 to 2008 shows what WordPress was missing at the time. Many of the most-wanted ones did jobs that core later took over, or that moved to dedicated services:

The hook system from 2004 is the thread running through all of it. A plugin written today registers actions and filters in much the same way as one written for WordPress 1.2, which is why the old idea of "hooking into nearly every action" still describes how WordPress is extended.