До WordPress публикация в вебе означала одно из трёх: писать HTML вручную, платить за проприетарную CMS, или разбираться с Movable Type (Perl, сложно) или b2/cafelog (PHP, автор которого исчез).
Мэтт Мулленвег использовал b2. В январе 2003 года его автор Мишель Вальдриги пропал. Мулленвег написал пост: «К счастью, b2 распространяется под GPL, значит я могу использовать кодовую базу для форка». Майк Литтл прокомментировал что готов участвовать. 27 мая 2003 года вышел WordPress 0.7.
Я установил его в августе. Это было 2500 строк PHP. Установка: распаковать, загрузить по FTP, создать базу MySQL, открыть install.php. Пять минут. Movable Type требовал настройки Perl-модулей, прав доступа на десяток директорий и ручного редактирования конфига. Разница во фрикции была принципиальной.
The Loop - основа WordPress
<?php
// WordPress Loop - версия 2003 года
// Эта конструкция стала самым копируемым PHP-кодом в истории веба
<?php query_posts('showposts=10'); ?>
<?php while (have_posts()) : the_post(); ?>
<div class="post">
<h2>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</h2>
<div class="meta">
Опубликовано <?php the_time('d.m.Y'); ?>
автором <?php the_author(); ?>
| <?php comments_popup_link('Нет комментариев', '1 комментарий', '% комментариев'); ?>
</div>
<div class="entry">
<?php the_content('Читать далее »'); ?>
</div>
</div>
<?php endwhile; ?>
Конструкция while (have_posts()) : the_post() стала самым воспроизводимым PHP-паттерном в истории веба. К 2010 году она работала примерно на 13% всех сайтов.
Схема базы данных (WordPress 0.7)
-- Оригинальная схема WordPress 0.7, MySQL 3.23+
-- До сих пор узнаваема в WordPress спустя 20 лет
CREATE TABLE wp_posts (
ID bigint(20) unsigned NOT NULL auto_increment,
post_author bigint(20) unsigned NOT NULL default '0',
post_date datetime NOT NULL default '0000-00-00 00:00:00',
post_content longtext NOT NULL,
post_title text NOT NULL,
post_status varchar(10) NOT NULL default 'publish',
post_name varchar(200) NOT NULL default '',
post_modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (ID),
KEY post_name (post_name)
) TYPE=MyISAM;
CREATE TABLE wp_options (
option_id bigint(20) unsigned NOT NULL auto_increment,
option_name varchar(64) NOT NULL default '',
option_value longtext NOT NULL,
autoload varchar(20) NOT NULL default 'yes',
PRIMARY KEY (option_id),
UNIQUE KEY option_name (option_name)
) TYPE=MyISAM;
-- wp_options - key-value хранилище конфигурации.
-- Гибкость без миграций схемы. Позже критиковалось как bottleneck.
-- В 2003 - правильное решение.
Кастомизация без плагинов: прямое редактирование шаблонов
Плагинов в 0.7 не было. Кастомизация - прямое редактирование index.php и sidebar.php:
<?php
// sidebar.php - «Последние записи» без плагинов, 2003 год
// Прямой SQL через $wpdb - единственный способ тогда
global $wpdb;
$recent = $wpdb->get_results(
"SELECT ID, post_title, post_date
FROM $wpdb->posts
WHERE post_status = 'publish'
ORDER BY post_date DESC
LIMIT 5"
);
?>
<div id="sidebar">
<h2>Последние записи</h2>
<ul>
<?php foreach ($recent as $post): ?>
<li>
<a href="<?php echo get_permalink($post->ID); ?>">
<?php echo htmlspecialchars($post->post_title); ?>
</a>
</li>
<?php endforeach; ?>
</ul>
<h2>Архивы</h2>
<ul><?php wp_get_archives('type=monthly'); ?></ul>
</div>
Плагины появились в WordPress 1.2 (май 2004). До этого - только прямая модификация файлов.
Почему это важнейшее ПО 2003 года
WordPress 0.7 выжил там, где Movable Type, b2 и десятки других блог-движков угасли, по трём причинам:
Лицензия GPL. Сообщество могло исправлять баги не дожидаясь автора. Это позволило экосистеме плагинов взорваться после версии 1.2.
Путь обновления не ломался никогда. От 0.7 до сегодняшнего дня обновление WordPress не требовало ручной миграции БД или переписывания шаблонов. Пользователи оставались, а не уходили к «следующей новинке».
Работал на shared-хостинге. PHP + MySQL + .htaccess. Тот же $8-хостинг, что был у всех.
К 2008 году WordPress - доминирующая блог-платформа. К 2012-му - доминирующая CMS. К 2023-му - 43% всех сайтов в мире. Всё это началось с 2500 строк PHP, опубликованных на SourceForge 27 мая 2003 года.