Dynamicznie dodawaj dodatkowe stałe sieciowe do wp-config.php


10

Rozpoczynając od nowej instalacji sieciowej, pierwszym krokiem jest instalacja z jedną witryną, która zawiera jeden dodatkowy wiersz w wp-config.phppliku:

define( 'WP_ALLOW_MULTISITE', true );

Następnie musimy przejść do Tools > Network Setup, wprowadzić pewne szczegóły, takie jak nazwa sieci i e-mail superadministratora, a następnie nacisnąć przycisk, aby uruchomić instalację.

Następny krok, który wyskakuje, to właściwie dwa kroki:

  1. Dodaj dodatkowe stałe do wp-config.phppliku

    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. Dodaj kilka reguł do swojego .htaccesspliku.

Ponieważ nie wykonuję instalacji pojedynczej witryny (już bez tego powodu), chciałbym dynamicznie dodawać te stałe do mojego wp-config.phppliku:

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 );
}

Więc nie muszę za wp-config.phpkażdym razem wchodzić i edytować go ponownie.

1-ci rzeczą, która przyszła mi do głowy było sprawdzenie DB na {$wpdb->prefix}sitemetastole, ale nie chcę robić dodatkowego obciążenia kwerendy na każdej stronie. 2-cia rzecz myślałem o to, by sprawdzić, czy blogs.dirjuż istnieje, ale nie jest to przypadek.

Pytanie: Jak mogę wskazać, że już przeszedłem pierwszy etap konfiguracji sieci w sposób, który nie ma dużego obciążenia lub zmniejsza wydajność.


2
Nie powinieneś próbować zautomatyzować wszystkiego: i.imgur.com/OoF9Md7.png
Ünsal Korkmaz

1
to w rzeczywistości niewiarygodne, proces jest nadal ten sam, a coraz więcej instalacji WP staje się
wielostronne

@ ÜnsalKorkmaz Jeśli widziałeś moją konfigurację konfiguracji, zrozumiesz, że jest to tylko jeden krok do przodu. Następna rzecz: wp-configgenerator Grunt .
kaiser

Nie rozumiem, dlaczego trzeba sprawdzić, czy istnieje warunek dla każdego ładowania strony, a następnie zdefiniować stałe. Prowadzisz konfigurację wielostanowiskową, czy nie. Jeśli mówisz o automatyzacji konfiguracji WordPress, możesz zajrzeć do czegoś takiego jak YeoPress github.com/wesleytodd/YeoPress
kingkool68

@ kingkool68 Easy. Ponieważ nie chcę odkomentować / komentować tych stałych za każdym razem, gdy konfiguruję instalację sieciową. To nie jest narzut, a krok po prostu jest niepotrzebny. I nie, nie mówię o automatyzacji konfiguracji WP. Btw: Yeoman używa Grunta do zadań (o których wspomniałem powyżej).
kaiser

Odpowiedzi:


1

Nie testowałem tego, ale gdybyś musiał znaleźć takie rozwiązanie, prawdopodobnie spróbowałbym to zrobić w następujący sposób, dodając skrypt do if ( SOME_CHECK_IF_STEP-1_WAS_PASSED )opisanego powyżej stanu, który:

  • sprawdź DB dla {$wpdb->prefix}sitemetatabeli;
  • jeśli nie istnieje -> zwróć false;
  • jeśli istnieje -> dodaj zadanie WP cron do przepisania wp-config.php-> return true.

Zadanie WP cron przepisałoby polecenie, wp-config.phpaby całkowicie wyeliminować sprawdzanie.

W ten sposób masz tylko dodatkowe żądanie DB, dopóki sieć nie zostanie skonfigurowana, a zadanie cron wykona swoją magię.

Pamiętaj, że jest to warte wysiłku, chociaż ...;)


BTW, skrypt możewp-config.php bezpośrednio zmienić plik, ale przypuszczam, że w tym momencie zostałby zablokowany ...
Alain Schlesser

Ten pomysł na crona jest zabawny :) Dzięki za to. Przy okazji możesz edytować swoją odpowiedź.
kaiser

-1

Sprawdź wp-admin/network.phpi wp-admin/includes/schema.phppliki. Możesz utworzyć warunek na podstawie WP_INSTALLING_NETWORK

Aktualizacja:

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. umieść to w folderze mu-plugins.
  2. świeża instalacja wp
  3. przejdź do panelu administracyjnego
  4. kliknij na narzędzia
  5. kliknij, aby skonfigurować sieć
  6. uruchom instalację
  7. ???
  8. zysk!!!

wprowadź opis zdjęcia tutaj


Już to sprawdziłem. Chodzi o to, że wp-load.phpwciąga się wp-config.phpwcześniej, więc WP_INSTALLING_NETWORKnie zostanie zdefiniowany. Ale nawet gdyby był dostępny, jest dostępny tylko podczas konfiguracji sieci. Co mam zrobić, aby pozostawić stałe po uruchomieniu instalacji?
kaiser

Nie .. powinieneś użyć funkcji, aby wykonać raz i zapisać definicje w pliku wp-config.php. Można to pomyśleć jak register_activation_hook
Ünsal Korkmaz,

index.phpściąga ./wp-blog-header.php), który następnie ściąga wp-load.phpi stamtąd wp-config.phpjest nazywany. Opis można znaleźć tutaj . admin.phpsam jest wywoływany przed setup.phpi network.php(i wywołuje wp-load.phpsię na początku), więc config już działa.
kaiser

I jak WP_INSTALLING_NETWORKsię define()okazuje bez sprawdzania, czy już jest defined(), stworzyłbym Fatal Errortam. Proszę, udowodnij mi, że się mylę i przetestuj. :)
Kaiser

2
Nie, nie jestem. Ignoruję nawet fakt, że mógłbym potraktować powyższy komiks jako trolling lub po prostu niegrzeczny. Szukam rozwiązania. Kropka. Ale posiadanie zapisywalnego wp-config.phppliku stanowi zagrożenie bezpieczeństwa. Pomyśl, że masz tam wszystkie ważne szczegóły. Pokazałem ci, że nie ma sposobu, aby to działało (bez zapisywalnego pliku konfiguracyjnego). To, czego szukam, to wskaźnik (który nie spowalnia systemu), który mogę sprawdzić i użyć jako przełącznika. Wszystko inne nie będzie działać.
kaiser

-1

Jeśli konfiguracja jest taka sama za każdym razem (instalacja subdomeny), możesz być w stanie wkleić cały fragment w pierwszym kroku:

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 );


Jak widać w pytaniu, jestem w pełni świadomy potrzebnych stałych. To, czego szukam, to niezawodny wskaźnik, jeśli konfiguracja przeszła już krok 1, nic więcej. Proszę zobaczyć wyróżnione aktualne pytanie na dole. Dziękuję za wasze ciężkie wysiłki.
kaiser

Moją odpowiedzią było zakwestionowanie, czy w ogóle potrzebujesz wskaźnika, ale raczej poleganie na zmiennej serwera, aby podać poprawną DOMAIN_CURRENT_SITEstałą, którą daje WordPress po zakończeniu wewnętrznej konfiguracji.
Geoff
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.