To start WordPress development we can take a Docker image.
Dockerfile:
FROM wordpress:php8.2-apache
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
RUN install-php-extensions xdebug
# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# Modify PHP settings using sed
# max_execution_time - This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser.
# max_input_time - This sets the maximum time in seconds a script is allowed to parse input data, like POST and GET.
# post_max_size - Sets max size of post data allowed. This setting also affects file upload.
# memory_limit - This sets the maximum amount of memory in bytes that a script is allowed to allocate.
RUN sed -i 's/upload_max_filesize = .*/upload_max_filesize = 30720M/' /usr/local/etc/php/php.ini && \
sed -i 's/max_input_time = .*/max_input_time = -1/' /usr/local/etc/php/php.ini && \
sed -i 's/memory_limit = .*/memory_limit = -1/' /usr/local/etc/php/php.ini && \
sed -i 's/post_max_size = .*/post_max_size = 30720M/' /usr/local/etc/php/php.ini && \
sed -i 's/max_execution_time = .*/max_execution_time = 86400/' /usr/local/etc/php/php.ini
# I use this to avoid the error "413 Request Entity Too large"
RUN echo "LimitRequestBody 0" > /etc/apache2/conf-available/custom.conf && a2enconf custom
# Setting up xDebug for PHP
RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
echo "xdebug.client_host=192.168.1.13" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
I use the next docker-compose.yml:
services:
wordpress:
container_name: project.wp
build: .
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DEBUG: 1
WORDPRESS_CONFIG_EXTRA: |
define( 'FS_METHOD', 'direct' );
define( 'DISABLE_WP_CRON', true );
depends_on:
- db
volumes:
- ./volumes/wordpress:/var/www/html
db:
container_name: project.db
image: mysql:5.7
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./volumes/db:/var/lib/mysql
phpmyadmin:
container_name: project.phpmyadmin
image: phpmyadmin
ports:
- "81:80"
environment:
- PMA_HOST=db
- PMA_USER=wordpress
- PMA_PASSWORD=wordpress
- UPLOAD_LIMIT=3000M
depends_on:
- db
We can choose a specific WP version (wordpress:php7.4-apache, for example).
Command:
docker compose up
The default owner of the files in the image is www-data. We should change the owner of the wp-content (or of the whole wordpress folder):
sudo chown andrew -R volumes/wordpress/
And leave possibility for the www-data to update files:
sudo chmod g+rw * -R volumes/wordpress/
Docker images
MySQL:
mysql:5.7
mysql:8.0.35
WordPress:
wordpress:php8.2-apache
wordpress:php8.1-apache
wordpress:php8.0-apache
wordpress:php7.4-apache
Update options
If you need to find and update some options quickly, you can directly access the /wp-admin/options.php path.
Plugins for development
| Name | Description |
|---|---|
| open_in_new Query Monitor | Great developer tools panel for WordPress. |
| open_in_new Debug Bar | Adds a debug menu to the admin bar that shows query, cache, and other helpful debugging information. |
| open_in_new Debug Bar Console | Adds a PHP/MySQL console to the debug bar. |
| open_in_new Debug Bar Shortcodes | Adds a new panel to the Debug Bar that displays the registered shortcodes for the current request. |
| open_in_new Debug Bar Constants | Adds three new panels to the Debug Bar that display the defined constants. |
| open_in_new Debug Bar Post Types | Adds a new panel to the Debug Bar that displays detailed information about the registered post types. |
| open_in_new Debug Bar Cron | Adds information about WP scheduled events. |
| open_in_new Debug Bar Actions and Filters Addon | Adds two more tabs in the Debug Bar to display hooks (actions and filters). |
| open_in_new Debug Bar Transients | Adds information about WordPress Transients to a new panel in the Debug Bar. |
| open_in_new Debug Bar List Script & Style Dependencies | Adds information to view the loaded scripts and styles. |
| open_in_new Debug Bar Remote Requests | Debug Bar plugin that will log and profile remote requests made through the HTTP API. |
Download ZIP file with all these plugins:
Query Monitor - v3.15.0
Debug Bar - v1.1.4
Debug Bar Console - v0.3
Debug Bar Shortcodes - v2.0.3
Debug Bar Constants - v2.0.0
Debug Bar Post Types - v2.0.0
Debug Bar Cron - v0.1.3
Debug Bar Actions and Filters Addon - v1.5.5
Debug Bar Transients - v0.5
Debug Bar List Script & Style Dependencies - v1.1.2
Debug Bar Remote Requests - v0.1.2
Backups and migrations
For the development purpose, it’s always a good idea to restore the client’s WordPress project on a local environment. To do it, we have several options.
All-in-One WP Migration plugin
There’s a good plugin for this: All-in-One WP Migration. Link
.
It the size of a backup is large, we can simply put a *.wpress file into the /wp-content/ai1wm-backup without
importing it through the web interface.
You can check the PHP version in the backup (package.json file) before downloading an appropriate Docker WP image.
Duplicator plugin
Another good option is the Duplicator plugin.
UpdraftPlus
open_in_new https://updraftplus.com - WordPress Backup and Migration Plugin.
Manual migration
To manually do a migration, we need to copy the WordPress project’s files and copy the database. So there are two tasks.
Andrew Dorokhov