Додайте додаткові мережеві константи до 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
Ünsal Korkmaz

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

@ ÜnsalKorkmaz Якщо ви бачили моє налаштування конфігурації, ви зрозумієте, що це лише ще один крок вперед. Наступне: wp-configгенератор Grunt
кайзер

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

@ kingkool68 Легко. Тому що я не хочу коментувати / коментувати ці константи щоразу, коли я встановлюю мережеву установку. Це не накладні витрати, а крок просто зайвий. І ні, я не говорю про автоматизацію налаштування WP. Btw: Yeoman використовує Grunt для виконання завдань (про які я згадував вище).
кайзер

Відповіді:


1

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

  • перевірити БД на {$wpdb->prefix}sitemetaтаблицю;
  • якщо його не існує -> повернути помилкове;
  • якщо вона існує -> додайте WP cron завдання, щоб переписати wp-config.php-> return true.

Завдання WP cron буде переписати те, wp-config.phpщоб повністю усунути перевірку.

Таким чином, у вас є лише додатковий запит БД, поки мережа не буде налаштована і робота cron зробила свою магію.

Зауважте, що це варте зусиль, хоча ...;)


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

Ця ідея про роботу з клоном смішна :) Дякую за це. До речі, ви можете редагувати свою відповідь.
кайзер

-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.