Добавлять дополнительные сетевые константы в wp-config.php динамически


10

При запуске с новой сетевой установкой первым шагом является установка с одного сайта, в которой есть одна дополнительная строка в wp-config.phpфайле:

define( 'WP_ALLOW_MULTISITE', true );

После этого нам нужно перейти Tools > Network Setup, ввести некоторые данные, такие как имя сети и адрес электронной почты супер-администратора, и, наконец, нажать кнопку, чтобы запустить установку.

Следующий шаг - это два шага:

  1. Добавьте дополнительные константы в ваш wp-config.phpфайл

    define( 'MULTISITE', true );
    define( 'SUBDOMAIN_INSTALL', true );
    define( 'DOMAIN_CURRENT_SITE', 'example.com' );
    define( 'PATH_CURRENT_SITE', '/' );
    define( 'SITE_ID_CURRENT_SITE', true );
    define( 'BLOG_ID_CURRENT_SITE', true );
  2. Добавьте некоторые правила в ваш .htaccessфайл.

Поскольку я не выполняю установку на одном сайте (больше нет причин для этого), я бы хотел динамически добавить эти константы в мой wp-config.phpфайл:

define( 'WP_ALLOW_MULTISITE', true );
if ( SOME_CHECK_IF_STEP-1_WAS_PASSED )
{
    define( 'MULTISITE', true );
    define( 'SUBDOMAIN_INSTALL', true );
    define( 'DOMAIN_CURRENT_SITE', 'example.com' );
    define( 'PATH_CURRENT_SITE', '/' );
    define( 'SITE_ID_CURRENT_SITE', true );
    define( 'BLOG_ID_CURRENT_SITE', true );
}

Поэтому мне не нужно wp-config.phpкаждый раз заходить и редактировать его снова.

Первое , что пришло мне на ум , чтобы проверить DB для {$wpdb->prefix}sitemetaтаблицы, но я не хочу , чтобы сделать дополнительный запрос на каждой загрузке сайта. Вторая вещь , которую я думал о том , чтобы проверить , если blogs.dirуже существует, но это не так.

Вопрос: Как я могу указать, что я уже прошел первый шаг настройки сети таким образом, что это не приводит к значительным перегрузкам или снижению производительности.


2
Вы не должны пытаться автоматизировать все: i.imgur.com/OoF9Md7.png
Коркмаз,

1
на самом деле невероятно, что процесс все тот же, в то время как все больше и больше установок WP становятся
многосайтовыми

@ ÜnsalKorkmaz Если вы видели мои настройки конфигурации, вы поймете, что это только еще один шаг вперед. Следующая вещь: wp-configгенератор Grunt .
Кайзер

Я не могу понять, почему вам нужно проверить, существует ли условие для каждой загрузки страницы, а затем определить константы. Вы используете многосайтовую настройку или нет. Если вы говорите об автоматизации установки WordPress, вы можете посмотреть что-то вроде YeoPress github.com/wesleytodd/YeoPress
kingkool68

@ kingkool68 Легко. Потому что я не хочу раскомментировать / комментировать эти константы каждый раз при настройке сетевой установки. Это не накладные расходы, и шаг просто не нужен. И нет, я не говорю об автоматизации настройки WP. Кстати: Yeoman использует Grunt для задач (о которых я упоминал выше).
Кайзер

Ответы:


1

Я не проверял это, но если вам нужно будет найти такое решение, я, вероятно, попытался бы сделать это следующим образом, добавив скрипт в if ( SOME_CHECK_IF_STEP-1_WAS_PASSED )условие, которое вы описали выше, что бы:

  • проверьте БД для {$wpdb->prefix}sitemetaтаблицы;
  • если его не существует -> вернуть false;
  • если он существует -> добавить задание WP cron для перезаписи wp-config.php-> вернуть true.

Задание WP cron переписывает, wp-config.phpчтобы полностью исключить проверку.

Таким образом, у вас будет только дополнительный запрос к БД, пока сеть не будет настроена и работа cron не сделает свое дело.

Обратите внимание, что это стоит усилий, хотя ...;)


Кстати, скрипт может изменить wp-config.phpфайл напрямую, но я полагаю, что он будет заблокирован в этот момент ...
Ален Шлессер

Эта идея работы cron смешная :) Спасибо за это. Кстати, вы можете редактировать свой ответ.
Кайзер

-1

Проверять wp-admin/network.phpи wp-admin/includes/schema.phpфайлы. Вы можете создать условие на основе WP_INSTALLING_NETWORK

Обновить:

if (is_admin()){
    /* First Step */
    if (!defined( 'WP_ALLOW_MULTISITE')){
            $current_wp_config = file_get_contents(ABSPATH . 'wp-config.php');

            $my_defines = "/* First we put WP_ALLOW_MULTISITE  */\r\n" .
                    "define('WP_ALLOW_MULTISITE', true); \r\n";

            $current_wp_config = str_replace("/* That's all, stop editing", $my_defines . "/* That's all, stop editing", $current_wp_config);       
            file_put_contents(ABSPATH . 'wp-config.php', $current_wp_config);   
    }   
    /* Second Step */
    if (!defined("WP_DEFINES_IMPORTED") && defined("WP_INSTALLING_NETWORK") && $_POST){
        $current_wp_config = file_get_contents(ABSPATH . 'wp-config.php');

        $my_defines = "/* Now we define */\r\n" .
            "define('WP_DEFINES_IMPORTED', true); \r\n" .
            "define('MULTISITE', true); \r\n".
            "define('SUBDOMAIN_INSTALL', true); \r\n".
            "define('DOMAIN_CURRENT_SITE', '". get_clean_basedomain() . "'); \r\n".
            "define('PATH_CURRENT_SITE', '". parse_url(  trailingslashit( get_option( 'home' ) ), PHP_URL_PATH ) . "'); \r\n".
            "define('SITE_ID_CURRENT_SITE', 1); \r\n".
            "define('BLOG_ID_CURRENT_SITE', 1); \r\n";

        $current_wp_config = str_replace("/* That's all, stop editing", $my_defines . "/* That's all, stop editing", $current_wp_config);       
        file_put_contents(ABSPATH . 'wp-config.php', $current_wp_config);   
    }
}
  1. поместите это в папку mu-plugins.
  2. свежий wp установить
  3. перейти в админку
  4. нажмите на инструменты
  5. нажмите для настройки сети
  6. запустить настройку
  7. ???
  8. прибыль !!!

введите описание изображения здесь


Я уже проверил это. Дело в том, что wp-load.phpтянет wp-config.phpраньше, поэтому WP_INSTALLING_NETWORKне будет определен. Но даже если он будет доступен, он доступен только во время настройки сети. Что бы я сделал, чтобы оставить константы после запуска установки?
Кайзер

Нет ... вы должны использовать функцию для однократного выполнения и один раз записать свои определения в файл wp-config.php. Вы можете думать так: register_activation_hook
Ünsal Korkmaz

index.phpтянет ./wp-blog-header.php), который потом тянет wp-load.phpи оттуда wp-config.phpназывается. Обзор можно найти здесь . admin.phpсам вызывается до setup.phpи network.php(и вызывает wp-load.phpсебя в начале), так что конфигурация уже запущена.
Кайзер

И как WP_INSTALLING_NETWORKполучает define()без проверки , если это уже defined(), я бы создать Fatal Errorтам. Пожалуйста, докажите, что я не прав, и проведите тест. :)
Кайзер

2
Нет, Юсал, я нет. Я даже игнорирую тот факт, что я мог принять вышеприведенный комикс как троллинг или просто грубый. Я ищу решение. Период. Но наличие wp-config.phpфайла для записи - это угроза безопасности. Учтите, что у вас есть все важные детали. Я показал вам, что это никак не сработает (не имея доступного для записи файла конфигурации). Я ищу индикатор (который не замедляет работу системы), который я могу проверить и использовать в качестве переключателя. Все остальное не сработает.
Кайзер

-1

Если ваши настройки каждый раз одинаковы (установка субдомена), вы можете вставить весь чанк в первый шаг:

define( 'MULTISITE', true ); define( 'SUBDOMAIN_INSTALL', true ); define( 'DOMAIN_CURRENT_SITE', $_SERVER[ 'HTTP_HOST' ] ); define( 'PATH_CURRENT_SITE', '/' ); define( 'SITE_ID_CURRENT_SITE', true ); define( 'BLOG_ID_CURRENT_SITE', true );


Как вы можете видеть в вопросе, я вполне осведомлен о необходимых константах. То, что я ищу, - это надежный индикатор, если настройка уже прошла шаг 1, больше ничего. Пожалуйста, смотрите выделенный актуальный вопрос внизу. Спасибо за ваши усилия.
Кайзер

Мой ответ состоял в том, чтобы спросить, нужен ли вам индикатор вообще, а вместо этого полагаться на переменную сервера, чтобы он служил правильной DOMAIN_CURRENT_SITEконстантой, которую WordPress дает вам после завершения внутренней настройки.
Джефф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.