init commit
This commit is contained in:
28
.env.example
Normal file
28
.env.example
Normal file
@@ -0,0 +1,28 @@
|
||||
DB_NAME='database_name'
|
||||
DB_USER='database_user'
|
||||
DB_PASSWORD='database_password'
|
||||
|
||||
# Optionally, you can use a data source name (DSN)
|
||||
# When using a DSN, you can remove the DB_NAME, DB_USER, DB_PASSWORD, and DB_HOST variables
|
||||
# DATABASE_URL='mysql://database_user:database_password@database_host:database_port/database_name'
|
||||
|
||||
# Optional database variables
|
||||
# DB_HOST='localhost'
|
||||
# DB_PREFIX='wp_'
|
||||
|
||||
WP_ENV='development'
|
||||
WP_HOME='http://example.com'
|
||||
WP_SITEURL="${WP_HOME}/wp"
|
||||
|
||||
# Specify optional debug.log path
|
||||
# WP_DEBUG_LOG='/path/to/debug.log'
|
||||
|
||||
# Generate your keys here: https://roots.io/salts.html
|
||||
AUTH_KEY='generateme'
|
||||
SECURE_AUTH_KEY='generateme'
|
||||
LOGGED_IN_KEY='generateme'
|
||||
NONCE_KEY='generateme'
|
||||
AUTH_SALT='generateme'
|
||||
SECURE_AUTH_SALT='generateme'
|
||||
LOGGED_IN_SALT='generateme'
|
||||
NONCE_SALT='generateme'
|
||||
28
.gitignore
vendored
Normal file
28
.gitignore
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
# Application
|
||||
web/app/plugins/*
|
||||
!web/app/plugins/.gitkeep
|
||||
web/app/mu-plugins/*/
|
||||
web/app/themes/twentytwentyfive/
|
||||
web/app/upgrade
|
||||
web/app/uploads/*
|
||||
!web/app/uploads/.gitkeep
|
||||
web/app/cache/*
|
||||
|
||||
# WordPress
|
||||
web/wp
|
||||
web/.htaccess
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Dotenv
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
|
||||
# Composer
|
||||
/vendor
|
||||
auth.json
|
||||
|
||||
# WP-CLI
|
||||
wp-cli.local.yml
|
||||
19
LICENSE.md
Normal file
19
LICENSE.md
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (c) Roots Software LLC
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
61
README.md
Normal file
61
README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
<p align="center">
|
||||
<a href="https://roots.io/bedrock/">
|
||||
<img alt="Bedrock" src="https://cdn.roots.io/app/uploads/logo-bedrock.svg" height="100">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://packagist.org/packages/roots/bedrock">
|
||||
<img alt="Packagist Installs" src="https://img.shields.io/packagist/dt/roots/bedrock?label=projects%20created&colorB=2b3072&colorA=525ddc&style=flat-square">
|
||||
</a>
|
||||
|
||||
<a href="https://packagist.org/packages/roots/wordpress">
|
||||
<img alt="roots/wordpress Packagist Downloads" src="https://img.shields.io/packagist/dt/roots/wordpress?label=roots%2Fwordpress%20downloads&logo=roots&logoColor=white&colorB=2b3072&colorA=525ddc&style=flat-square">
|
||||
</a>
|
||||
|
||||
<img src="https://img.shields.io/badge/dynamic/json.svg?url=https://raw.githubusercontent.com/roots/bedrock/master/composer.json&label=wordpress&logo=roots&logoColor=white&query=$.require[%22roots/wordpress%22]&colorB=2b3072&colorA=525ddc&style=flat-square">
|
||||
|
||||
<a href="https://github.com/roots/bedrock/actions/workflows/ci.yml">
|
||||
<img alt="Build Status" src="https://img.shields.io/github/actions/workflow/status/roots/bedrock/ci.yml?branch=master&logo=github&label=CI&style=flat-square">
|
||||
</a>
|
||||
|
||||
<a href="https://twitter.com/rootswp">
|
||||
<img alt="Follow Roots" src="https://img.shields.io/badge/follow%20@rootswp-1da1f2?logo=twitter&logoColor=ffffff&message=&style=flat-square">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">WordPress boilerplate with Composer, easier configuration, and an improved folder structure</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://roots.io/bedrock/">Website</a> <a href="https://roots.io/bedrock/docs/installation/">Documentation</a> <a href="https://github.com/roots/bedrock/releases">Releases</a> <a href="https://discourse.roots.io/">Community</a>
|
||||
</p>
|
||||
|
||||
## Sponsors
|
||||
|
||||
Bedrock is an open source project and completely free to use. If you've benefited from our projects and would like to support our future endeavors, please consider [sponsoring Roots](https://github.com/sponsors/roots).
|
||||
|
||||
<div align="center">
|
||||
<a href="https://carrot.com/"><img src="https://cdn.roots.io/app/uploads/carrot.svg" alt="Carrot" width="120" height="90"></a> <a href="https://wordpress.com/"><img src="https://cdn.roots.io/app/uploads/wordpress.svg" alt="WordPress.com" width="120" height="90"></a> <a href="https://worksitesafety.ca/careers/"><img src="https://cdn.roots.io/app/uploads/worksite-safety.svg" alt="Worksite Safety" width="120" height="90"></a> <a href="https://www.itineris.co.uk/"><img src="https://cdn.roots.io/app/uploads/itineris.svg" alt="Itineris" width="120" height="90"></a> <a href="https://bonsai.so/"><img src="https://cdn.roots.io/app/uploads/bonsai.svg" alt="Bonsai" width="120" height="90"></a>
|
||||
</div>
|
||||
|
||||
## Overview
|
||||
|
||||
Bedrock is a WordPress boilerplate for developers that want to manage their projects with Git and Composer. Much of the philosophy behind Bedrock is inspired by the [Twelve-Factor App](http://12factor.net/) methodology, including the [WordPress specific version](https://roots.io/twelve-factor-wordpress/).
|
||||
|
||||
- Better folder structure
|
||||
- Dependency management with [Composer](https://getcomposer.org)
|
||||
- Easy WordPress configuration with environment specific files
|
||||
- Environment variables with [Dotenv](https://github.com/vlucas/phpdotenv)
|
||||
- Autoloader for mu-plugins (use regular plugins as mu-plugins)
|
||||
|
||||
## Getting Started
|
||||
|
||||
See the [Bedrock installation documentation](https://roots.io/bedrock/docs/installation/).
|
||||
|
||||
## Stay Connected
|
||||
|
||||
- Join us on Discord by [sponsoring us on GitHub](https://github.com/sponsors/roots)
|
||||
- Participate on [Roots Discourse](https://discourse.roots.io/)
|
||||
- Follow [@rootswp on Twitter](https://twitter.com/rootswp)
|
||||
- Read the [Roots Blog](https://roots.io/blog/)
|
||||
- Subscribe to the [Roots Newsletter](https://roots.io/newsletter/)
|
||||
70
composer.json
Normal file
70
composer.json
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"name": "roots/bedrock",
|
||||
"type": "project",
|
||||
"license": "MIT",
|
||||
"description": "WordPress boilerplate with Composer, easier configuration, and an improved folder structure",
|
||||
"homepage": "https://roots.io/bedrock/",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Scott Walkinshaw",
|
||||
"email": "scott.walkinshaw@gmail.com",
|
||||
"homepage": "https://github.com/swalkinshaw"
|
||||
},
|
||||
{
|
||||
"name": "Ben Word",
|
||||
"email": "ben@benword.com",
|
||||
"homepage": "https://github.com/retlehs"
|
||||
}
|
||||
],
|
||||
"keywords": [
|
||||
"bedrock", "composer", "roots", "wordpress", "wp", "wp-config"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/roots/bedrock/issues",
|
||||
"forum": "https://discourse.roots.io/category/bedrock"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "composer",
|
||||
"url": "https://wpackagist.org",
|
||||
"only": ["wpackagist-plugin/*", "wpackagist-theme/*"]
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=8.1",
|
||||
"composer/installers": "^2.2",
|
||||
"vlucas/phpdotenv": "^5.5",
|
||||
"oscarotero/env": "^2.1",
|
||||
"roots/bedrock-autoloader": "^1.0",
|
||||
"roots/bedrock-disallow-indexing": "^2.0",
|
||||
"roots/wordpress": "6.8.2",
|
||||
"roots/wp-config": "1.0.0",
|
||||
"wpackagist-theme/twentytwentyfive": "^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"roave/security-advisories": "dev-latest",
|
||||
"laravel/pint": "^1.18"
|
||||
},
|
||||
"config": {
|
||||
"optimize-autoloader": true,
|
||||
"preferred-install": "dist",
|
||||
"allow-plugins": {
|
||||
"composer/installers": true,
|
||||
"roots/wordpress-core-installer": true
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"extra": {
|
||||
"installer-paths": {
|
||||
"web/app/mu-plugins/{$name}/": ["type:wordpress-muplugin"],
|
||||
"web/app/plugins/{$name}/": ["type:wordpress-plugin"],
|
||||
"web/app/themes/{$name}/": ["type:wordpress-theme"]
|
||||
},
|
||||
"wordpress-install-dir": "web/wp"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "pint --test",
|
||||
"lint:fix": "pint"
|
||||
}
|
||||
}
|
||||
1531
composer.lock
generated
Normal file
1531
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
166
config/application.php
Normal file
166
config/application.php
Normal file
@@ -0,0 +1,166 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Your base production configuration goes in this file. Environment-specific
|
||||
* overrides go in their respective config/environments/{{WP_ENV}}.php file.
|
||||
*
|
||||
* A good default policy is to deviate from the production config as little as
|
||||
* possible. Try to define as much of your configuration in this file as you
|
||||
* can.
|
||||
*/
|
||||
|
||||
use Roots\WPConfig\Config;
|
||||
|
||||
use function Env\env;
|
||||
|
||||
// USE_ENV_ARRAY + CONVERT_* + STRIP_QUOTES
|
||||
Env\Env::$options = 31;
|
||||
|
||||
/**
|
||||
* Directory containing all of the site's files
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
$root_dir = dirname(__DIR__);
|
||||
|
||||
/**
|
||||
* Document Root
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
$webroot_dir = $root_dir . '/web';
|
||||
|
||||
/**
|
||||
* Use Dotenv to set required environment variables and load .env file in root
|
||||
* .env.local will override .env if it exists
|
||||
*/
|
||||
if (file_exists($root_dir . '/.env')) {
|
||||
$env_files = file_exists($root_dir . '/.env.local')
|
||||
? ['.env', '.env.local']
|
||||
: ['.env'];
|
||||
|
||||
$repository = Dotenv\Repository\RepositoryBuilder::createWithNoAdapters()
|
||||
->addAdapter(Dotenv\Repository\Adapter\EnvConstAdapter::class)
|
||||
->addAdapter(Dotenv\Repository\Adapter\PutenvAdapter::class)
|
||||
->immutable()
|
||||
->make();
|
||||
|
||||
$dotenv = Dotenv\Dotenv::create($repository, $root_dir, $env_files, false);
|
||||
$dotenv->load();
|
||||
|
||||
$dotenv->required(['WP_HOME', 'WP_SITEURL']);
|
||||
if (!env('DATABASE_URL')) {
|
||||
$dotenv->required(['DB_NAME', 'DB_USER', 'DB_PASSWORD']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up our global environment constant and load its config first
|
||||
* Default: production
|
||||
*/
|
||||
define('WP_ENV', env('WP_ENV') ?: 'production');
|
||||
|
||||
/**
|
||||
* Infer WP_ENVIRONMENT_TYPE based on WP_ENV
|
||||
*/
|
||||
if (!env('WP_ENVIRONMENT_TYPE') && in_array(WP_ENV, ['production', 'staging', 'development', 'local'])) {
|
||||
Config::define('WP_ENVIRONMENT_TYPE', WP_ENV);
|
||||
}
|
||||
|
||||
/**
|
||||
* URLs
|
||||
*/
|
||||
Config::define('WP_HOME', env('WP_HOME'));
|
||||
Config::define('WP_SITEURL', env('WP_SITEURL'));
|
||||
|
||||
/**
|
||||
* Custom Content Directory
|
||||
*/
|
||||
Config::define('CONTENT_DIR', '/app');
|
||||
Config::define('WP_CONTENT_DIR', $webroot_dir . Config::get('CONTENT_DIR'));
|
||||
Config::define('WP_CONTENT_URL', Config::get('WP_HOME') . Config::get('CONTENT_DIR'));
|
||||
|
||||
/**
|
||||
* DB settings
|
||||
*/
|
||||
if (env('DB_SSL')) {
|
||||
Config::define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
|
||||
}
|
||||
|
||||
Config::define('DB_NAME', env('DB_NAME'));
|
||||
Config::define('DB_USER', env('DB_USER'));
|
||||
Config::define('DB_PASSWORD', env('DB_PASSWORD'));
|
||||
Config::define('DB_HOST', env('DB_HOST') ?: 'localhost');
|
||||
Config::define('DB_CHARSET', 'utf8mb4');
|
||||
Config::define('DB_COLLATE', '');
|
||||
$table_prefix = env('DB_PREFIX') ?: 'wp_';
|
||||
|
||||
if (env('DATABASE_URL')) {
|
||||
$dsn = (object) parse_url(env('DATABASE_URL'));
|
||||
|
||||
Config::define('DB_NAME', substr($dsn->path, 1));
|
||||
Config::define('DB_USER', $dsn->user);
|
||||
Config::define('DB_PASSWORD', isset($dsn->pass) ? $dsn->pass : null);
|
||||
Config::define('DB_HOST', isset($dsn->port) ? "{$dsn->host}:{$dsn->port}" : $dsn->host);
|
||||
}
|
||||
|
||||
/**
|
||||
* Authentication Unique Keys and Salts
|
||||
*/
|
||||
Config::define('AUTH_KEY', env('AUTH_KEY'));
|
||||
Config::define('SECURE_AUTH_KEY', env('SECURE_AUTH_KEY'));
|
||||
Config::define('LOGGED_IN_KEY', env('LOGGED_IN_KEY'));
|
||||
Config::define('NONCE_KEY', env('NONCE_KEY'));
|
||||
Config::define('AUTH_SALT', env('AUTH_SALT'));
|
||||
Config::define('SECURE_AUTH_SALT', env('SECURE_AUTH_SALT'));
|
||||
Config::define('LOGGED_IN_SALT', env('LOGGED_IN_SALT'));
|
||||
Config::define('NONCE_SALT', env('NONCE_SALT'));
|
||||
|
||||
/**
|
||||
* Custom Settings
|
||||
*/
|
||||
Config::define('AUTOMATIC_UPDATER_DISABLED', true);
|
||||
Config::define('DISABLE_WP_CRON', env('DISABLE_WP_CRON') ?: false);
|
||||
|
||||
// Disable the plugin and theme file editor in the admin
|
||||
Config::define('DISALLOW_FILE_EDIT', true);
|
||||
|
||||
// Disable plugin and theme updates and installation from the admin
|
||||
Config::define('DISALLOW_FILE_MODS', true);
|
||||
|
||||
// Limit the number of post revisions
|
||||
Config::define('WP_POST_REVISIONS', env('WP_POST_REVISIONS') ?? true);
|
||||
|
||||
// Disable script concatenation
|
||||
Config::define('CONCATENATE_SCRIPTS', false);
|
||||
|
||||
/**
|
||||
* Debugging Settings
|
||||
*/
|
||||
Config::define('WP_DEBUG_DISPLAY', false);
|
||||
Config::define('WP_DEBUG_LOG', false);
|
||||
Config::define('SCRIPT_DEBUG', false);
|
||||
ini_set('display_errors', '0');
|
||||
|
||||
/**
|
||||
* Allow WordPress to detect HTTPS when used behind a reverse proxy or a load balancer
|
||||
* See https://codex.wordpress.org/Function_Reference/is_ssl#Notes
|
||||
*/
|
||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
|
||||
$_SERVER['HTTPS'] = 'on';
|
||||
}
|
||||
|
||||
$env_config = __DIR__ . '/environments/' . WP_ENV . '.php';
|
||||
|
||||
if (file_exists($env_config)) {
|
||||
require_once $env_config;
|
||||
}
|
||||
|
||||
Config::apply();
|
||||
|
||||
/**
|
||||
* Bootstrap WordPress
|
||||
*/
|
||||
if (!defined('ABSPATH')) {
|
||||
define('ABSPATH', $webroot_dir . '/wp/');
|
||||
}
|
||||
22
config/environments/development.php
Normal file
22
config/environments/development.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Configuration overrides for WP_ENV === 'development'
|
||||
*/
|
||||
|
||||
use Roots\WPConfig\Config;
|
||||
|
||||
use function Env\env;
|
||||
|
||||
Config::define('SAVEQUERIES', true);
|
||||
Config::define('WP_DEBUG', true);
|
||||
Config::define('WP_DEBUG_DISPLAY', true);
|
||||
Config::define('WP_DEBUG_LOG', env('WP_DEBUG_LOG') ?? true);
|
||||
Config::define('WP_DISABLE_FATAL_ERROR_HANDLER', true);
|
||||
Config::define('SCRIPT_DEBUG', true);
|
||||
Config::define('DISALLOW_INDEXING', true);
|
||||
|
||||
ini_set('display_errors', '1');
|
||||
|
||||
// Enable plugin and theme updates and installation from the admin
|
||||
Config::define('DISALLOW_FILE_MODS', false);
|
||||
18
config/environments/staging.php
Normal file
18
config/environments/staging.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Configuration overrides for WP_ENV === 'staging'
|
||||
*/
|
||||
|
||||
use Roots\WPConfig\Config;
|
||||
|
||||
/**
|
||||
* You should try to keep staging as close to production as possible. However,
|
||||
* should you need to, you can always override production configuration values
|
||||
* with `Config::define`.
|
||||
*
|
||||
* Example: `Config::define('WP_DEBUG', true);`
|
||||
* Example: `Config::define('DISALLOW_FILE_MODS', false);`
|
||||
*/
|
||||
|
||||
Config::define('DISALLOW_INDEXING', true);
|
||||
9
pint.json
Normal file
9
pint.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"preset": "per",
|
||||
"exclude": [
|
||||
"web/wp",
|
||||
"web/app/mu-plugins/bedrock-disallow-indexing",
|
||||
"web/app/plugins",
|
||||
"web/app/themes/twentytwentyfive"
|
||||
]
|
||||
}
|
||||
16
web/app/mu-plugins/bedrock-autoloader.php
Normal file
16
web/app/mu-plugins/bedrock-autoloader.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Plugin Name: Bedrock Autoloader
|
||||
* Plugin URI: https://github.com/roots/bedrock-autoloader
|
||||
* Description: An autoloader that enables standard plugins to be required just like must-use plugins. The autoloaded plugins are included during mu-plugin loading. An asterisk (*) next to the name of the plugin designates the plugins that have been autoloaded.
|
||||
* Author: Roots
|
||||
* Author URI: https://roots.io/
|
||||
* License: MIT License
|
||||
*/
|
||||
|
||||
namespace Roots\Bedrock;
|
||||
|
||||
if (is_blog_installed() && class_exists(Autoloader::class)) {
|
||||
new Autoloader();
|
||||
}
|
||||
0
web/app/plugins/.gitkeep
Normal file
0
web/app/plugins/.gitkeep
Normal file
0
web/app/themes/.gitkeep
Normal file
0
web/app/themes/.gitkeep
Normal file
0
web/app/uploads/.gitkeep
Normal file
0
web/app/uploads/.gitkeep
Normal file
7
web/index.php
Normal file
7
web/index.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* WordPress View Bootstrapper
|
||||
*/
|
||||
define('WP_USE_THEMES', true);
|
||||
require __DIR__ . '/wp/wp-blog-header.php';
|
||||
10
web/wp-config.php
Normal file
10
web/wp-config.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Do not edit this file. Edit the config files found in the config/ dir instead.
|
||||
* This file is required in the root directory so WordPress can find it.
|
||||
* WP is hardcoded to look in its own directory or one directory up for wp-config.php.
|
||||
*/
|
||||
require_once dirname(__DIR__) . '/vendor/autoload.php';
|
||||
require_once dirname(__DIR__) . '/config/application.php';
|
||||
require_once ABSPATH . 'wp-settings.php';
|
||||
3
wp-cli.yml
Normal file
3
wp-cli.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
path: web/wp
|
||||
server:
|
||||
docroot: web
|
||||
Reference in New Issue
Block a user