Как вынести 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 со всем содержимым к ядру вордпресса, находящегося в другом месте на жестком диске? Какие дополнительные настройки нужно прописать в апаче? Кто сталкивался с такой задачей или кто знает как решить - делитесь опытом :)
  • Вопрос задан
  • 465 просмотров
Решения вопроса 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 уровня вверх, некоторые пути (контент, как вы уже поняли) будут отсчитываться от рута (где конфиг).
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы