1. What is WordPress?

WordPress is a dynamic website engine (CMS).

Request flow:

Browser

Nginx

PHP-FPM

WordPress

MariaDB

Generated HTML

Browser

Unlike a static site, WordPress generates pages on demand.

Example:

GET /about

WordPress:

SELECT *
FROM wp_posts
WHERE post_name='about';

Then builds HTML and returns it.


2. Dynamic vs Static Websites

Static Website (Quartz)

Markdown

Build

HTML Files

Nginx

Request:

/about

Nginx simply serves:

about/index.html

No code execution.

Dynamic Website (WordPress)

/about

PHP executes

Database query

HTML generated

Advantages:

  • Easy editing

  • User accounts

  • Comments

  • Admin dashboard

Disadvantages:

  • More CPU

  • More security concerns

  • More moving parts


3. WordPress Architecture

Core

Main application.

wp-admin/
wp-content/
wp-includes/
index.php
wp-config.php

Do not modify core files.

Themes

Control appearance.

Think:

Theme ≈ Frontend/UI

Responsible for:

  • Layout

  • Colors

  • Fonts

  • Navigation

Plugins

Add functionality.

Think:

Plugin ≈ Extension Module

Examples:

  • SEO

  • Contact Forms

  • Caching

  • E-Commerce

Database

Stores:

  • Pages

  • Posts

  • Users

  • Settings

  • Comments

Main tables:

wp_posts
wp_users
wp_comments
wp_options

4. Installation Architecture

Server:

Ubuntu
 ├── Nginx
 ├── PHP-FPM
 ├── MariaDB
 └── WordPress

WordPress requires:

MariaDB

Database:

CREATE DATABASE brewnbloom;

PHP-FPM

Executes PHP.

Example:

/run/php/php8.3-fpm.sock

Nginx

Important config:

location / {
    try_files $uri $uri/ /index.php?$args;
}

This sends unknown URLs to WordPress routing.


5. HTTPS Troubleshooting Lesson

Problem:

brewnbloom.net

showed AES site instead of WordPress.

Root cause:

HTTPS configuration still pointed to previous site.

Important lesson:

HTTP config ≠ HTTPS config

Always inspect:

sudo nginx -T

WordPress was actually working after fixing the SSL server block.


6. WordPress Users vs Database Users

Very important distinction.

Database User

Stored in:

wp-config.php

Example:

define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'StrongPassword');

Purpose:

WordPress ↔ MariaDB

WordPress User

Stored in:

wp_users

Purpose:

Browser ↔ WordPress

Example:

admin

These are completely separate accounts.


7. Reset WordPress Password via SQL

Find users:

SELECT ID, user_login, user_email
FROM wp_users;

Reset password:

UPDATE wp_users
SET user_pass = MD5('NewPassword')
WHERE user_login = 'admin';

Then login:

https://brewnbloom.net/wp-login.php

8. WordPress Email Architecture

WordPress itself does not send SMTP.

Flow:

WordPress

PHP mail()

sendmail

SMTP Server

Internet

Current server status:

sendmail_path configured

but:

/usr/sbin/sendmail

does not exist.

Result:

Email silently fails

Future solution:

  • SMTP Plugin

  • Gmail SMTP

  • Brevo SMTP

  • Zoho SMTP

Do not run a mail server unless necessary.


9. Posts vs Pages

Posts

Blog/news content.

Examples:

New Coffee Menu
Valentine Promotion
Flower Workshop

Characteristics:

  • Date

  • Author

  • Categories

  • Tags

Think:

Posts ≈ News Feed

Pages

Permanent content.

Examples:

Home
About
Contact
Menu

Characteristics:

  • No date relevance

  • No categories

  • Hierarchical

Think:

Pages ≈ Company Information

10. Internal Storage

Both Posts and Pages live in:

wp_posts

Difference:

post_type

Example:

Hello World      → post
About Us         → page

Mental model:

Page = Post + post_type='page'

11. First Published Pages

Created:

/about-brew-bloom/
/ve-brew-bloom/

Request lifecycle:

URL

WordPress Router

Database Query

Theme

Generated HTML

This is the core WordPress request flow.


Key Mental Models

WordPress = PHP Application + Database + Admin Dashboard
Theme = Frontend
Plugin = Extension Module
wp-config.php = Application Configuration
wp_users = Login Accounts
wp_posts = Content Storage
Nginx → PHP → WordPress → MariaDB

If these mental models are clear, WordPress is no longer a black box but simply another web application stack.