Как вынести wp-config.php и wp-content за пределы папки c ядром wordpress?

Суть для понимания простая, для разработки на локальной машине я хочу использовать одно ядро вордпресса для всех моих проектов - то есть тем. Сами темы я планирую хранить в другом месте на локальной машине, и каждый раз переключать "активную" тему посредством подмены путей в конфигах ядра WP при помощи галпа. Темы соответсвенно будут находиться под версионированием git'а.

Само ядро вордпресса находится в папке локального сервера C:\xampp\wordpress\www с настроенным к ней VirtualHost от апача - wordpress.local. Проекты лежат в папке C:\gulp\projects, тут находятся проекты с обычной статичной версткой и тут же я планирую размещать папки с темами для вордпресса, внутри папки с "темой" будет находиться wp-config.php и wp-content, и вот непосредственно их пути я и планирую размещать в ядре вордпресса, для того чтобы вордпресс подхватывал их и показывал мою тему с правильными конфигами к базе данных и каждый раз переключать их с помощью галпа путем подмены путей в конфигах ядра.

То есть цели мои какие - не тащить каждый раз ядро ВП внутрь папки с проектом (а таких проектов будет много), второе это отслеживать гитом изменения только в wp-config.php и wp-content, третье это работать только под одним доменом wordpress.local и переключать темы с помощью подмены путей, не хочу каждый раз вручную править конфиги апача и на каждый проект создавать новый виртуальный хост, новые папки, перезагружать апач итд. Делается это только для локальной разработки тем, то есть деплой я планирую делать "нормальным", без этих изменений и разделения с выносом папок.

Нужного рецепта в интернете, именно для себя, я к сожалению не нашел. Конкретно я уже пробовал подставить абсолютный путь для wp-content в конфигах ядра - define( 'WP_CONTENT_DIR', ‘C:\gulp\projects\test wp\wp-content’ ), но это к сожалению не сработало, при загрузке сайта появляется только белый экран. WP_DEBUG поставил на true, а для папки C:\gulp\projects в апаче я выставил Require all granted. По итогу в админку могу зайти нормально, но тему (соответсвенно и папку wp-content) ВП не видит.

Вопрос, как правильно организовать подключение внешнего файла wp-config.php и внешней папки wp-content со всем содержимым к ядру вордпресса, находящегося в другом месте на жестком диске? Какие дополнительные настройки нужно прописать в апаче? Кто сталкивался с такой задачей или кто знает как решить - делитесь опытом :)
  • Вопрос задан
  • 499 просмотров
Решения вопроса 1
neins
@neins Автор вопроса
Спустя долгое время публикую свое решение. Как оказалось вордпресс поддерживает данное решение почти из коробки и сделать все это не так уж и сложно.

Схема такая: есть папка с ядром WP и есть папки с проектами. В моем случае папка ядра это C://localhost/wordpress.local, а папка с проектом C://dev/projects/example/(static | wp).

В папке с ядром содержатся только необходимые компоненты для функционирования CMS и на эту папку мы вешаем домен wordpress.local, тут мы только слегка изменяем файл wp-config – он будет предназначен для подключения внешней папки wp-content нашего проекта и данных для подключения к БД, убираем папку wp-content из папки с ядром за ненадобностью.

Внутри папки проекта находятся две папки static и wp, в нашем случае нам нужна папка wp которая в свою очередь уже будет содержать необходимые нам папку wp-content и файлы wp-config-dev.php и wp-config.php. Данные для подключения к БД для локальной разработки будут находится в wp-config-dev, а деплоить будем wp-config.php, содержание которого не отличается от обычного файла конфига для вордпресса.

Из дополнительного необходимо в настройках виртуальных хостов расшарить нашу папку с проектами в качестве домена для константы WP_CONTENT_URL'.

Содержимое wp-config.php ядра Wordpress
<?php
$project = 'example';
define( 'WP_CONTENT_DIR', 'C://DEV/projects/'.$project.'/wp/wp-content' );
define( 'WP_CONTENT_URL', 'http://projects.folder/'.$project.'/wp/wp-content' );
include('C://DEV/projects/'.$project.'/wp/wp-config-dev.php');
if ( ! defined( 'ABSPATH' ) ) {
	define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}
require_once( ABSPATH . 'wp-settings.php' );


Содержимое wp-config-dev.php проекта Wordpress
<?php
define( 'DB_NAME', 'example' );
define( 'DB_USER', 'root' );
define( 'DB_PASSWORD', '' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
$table_prefix = 'wp_';


Файл виртуальных хостов httpd-vhosts.conf
<Directory "C://DEV/projects/*">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>

# Для WP_CONTENT_URL
<Directory "C://DEV/projects">
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>
<VirtualHost *:80>
    DocumentRoot "C://DEV/projects"
    ServerName projects.folder
    # Заклинание против CORS
    Header set Access-Control-Allow-Origin "*"
</VirtualHost>


В итоге мы отделяем ядро вордпресса от конкретного проекта – можно легко переключаться между проектами всего лишь поменяв значение переменной $project в конфиге ядра (я это делаю с помощью шелл скрипта, их уже использую в гульпе и других местах, тут уже как вам удобнее) а также версионируется и деплоится только папка с проектом(темой-плагинами-загрузками итд), ядро не тащится в гит и его также можно загрузить на хост отдельно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
https://github.com/ihorvorotnov/sonata

Давно не обновлял код, многое нужно освежить, но концепция думаю понятна.

Что важно понять - просто разложить отдельно вообще в разных местах темы и все остальное не получится, разве что симлинками. Ядро будет искать конфиг на 2 уровня вверх, некоторые пути (контент, как вы уже поняли) будут отсчитываться от рута (где конфиг).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы