2017-09-27 43 views
17

Pracuję nad budowaniem wtyczki WordPress dla niestandardowej sieci wielopokładowej WordPress i mam kilka plików, które używają zmiennych URL do ładowania informacji z drugiej bazy danych (nie z bazy danych WordPress)..htaccess przepisać z wtyczką WordPress

W wersji zbudowanej poza WordPress, przechodząc do http://website.com/NAME-HERE, sprawdzi, czy jest to nazwa użytkownika w mojej bazie danych, jeśli nie, sprawdź, czy jest to grupa w mojej bazie danych i załaduj plik, który odpowiada, jeśli jest nazwa użytkownika lub grupa.

Teraz całkowicie zatracam się przy wdrażaniu tego w WordPress Multisite. O ile wiem, wtyczki nie mogą dokonać przepisywania .htaccess? Jak sprawić, by działał na wszystkich stronach sieciowych?

Jeśli nie, to w jaki sposób najlepiej to osiągnąć?

Czy muszę zamienić mój pretty.php & .htaccess przepisywanie na mój katalog główny i wskazać strony do plików znajdujących się w wtyczce? Jeśli tak, to jak działa to z wieloma tematami?

Moja jedyna inna myśl, jak na razie, może być osiągnięta z czymś takim jak RewriteMap.

W tym momencie pomyślałem, że najlepiej jest skontaktować się ze społecznością StackOverflow w celu uzyskania pomocy lub wskazówek.

.htaccess

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] 
RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA] 

ErrorDocument 404 /404.php 

pretty.php

// First check if passed pretty parameter is a username. 
if(checkIfUserByUsername($_GET['pretty'])) 
{ 
    $_GET['username'] = $_GET['pretty']; 

    include("USERNAME.php"); 

// If not a username, check to see if it's an event. 
}else if(checkIfStreamByPretty($_GET['pretty'])){ 
    $_GET['id'] = getStreamIdFromPretty($_GET['pretty']); 

    include("GROUP.php"); 
}else{ 
    // If it's none, redirect to the 404 page. 

    include("404.php"); 
} 

Chcę zapewnić większą kontekście tego, co szukam osiągnąć, tworzę stronę szablonu plików z których jeden jest dla profili, z których jeden jest dla grup, tak jak widzieliście powyżej moich .htaccess i pretty.php Jestem wtedy na górze pliku szablonu strony, a następnie używając

$user_id = getIdFromUsername($_GET['username']); 
$_GET['user_id'] = $user_id; 

Naprawdę mam problem z ustaleniem, jak to zrobić w sposób, który pozwala mu pracować z wieloma tematami. Po prostu szukam jakiegokolwiek rozwiązania w tym momencie.

+0

Nie jest jasne, co chcesz osiągnąć jako pożądany rezultat. Podziel swoje pytanie na bardziej zwięzłe pytanie o to, co naprawdę chcesz, w przeciwieństwie do napotkanych zmagań. Jeśli chodzi o edycje pliku '.htaccess', możesz wypróbować inne wtyczki, które wprowadzają zmiany w pliku' .htaccess', na przykład 'All In One WP Security & Firewall'. – fyrye

+0

jeśli przejdę do example.com/Dustin, sprawdza, czy jest to nazwa użytkownika lub grupa i wyświetla plik szablonu strony, dla którego jest. –

+0

, ale musi również działać dla utworzonych multisites więc example.com/SITE/Dustin –

Odpowiedz

5

Istnieje kilka sposobów, w jakie można się do tego podejść, jeśli rozumiem, co chcesz osiągnąć. Prawdopodobnie nie musisz używać żadnych przeróbek.

Najprostszym rozwiązaniem jest dodanie swojego kodu "pretty.php" do pliku header.php w szablonie Wordpress. Będzie on ładowany przy każdym żądaniu na frontowej stronie witryny. Jeśli potrzebujesz go do załadowania kodu tylko na określonej stronie, po prostu sprawdź, na której stronie używasz strony is_page.

na przykład w header.php:

if(is_page("groups")){ 
    if(checkIfUserByUsername($_GET['pretty'])) 
    { 
    // the rest of your code 
    } 
} 

Jeśli chcesz napisać plugin WordPress, wystarczy użyć "add_action" w swojej wtyczce:

add_action('wp_head', 'function_containing_your_code'); 

Ponownie, to ładuje się na każdej stronie, więc po prostu sprawdź, czy jesteś na stronie, na której chcesz załadować swój kod.

https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head https://developer.wordpress.org/reference/functions/is_page/

Ponadto, można edytować plik .htaccess jak można edytować dowolny plik, czy użytkownik ma uprawnienia do edycji. Zakładając, że uruchamiasz serwer apache, twój plik .htaccess musi mieć uprawnienia, które pozwalają na edycję pliku i możesz edytować plik za pomocą PHP. na przykład:

$file = fopen("/path/to/.htaccess", "a+"); 
fwrite($f, "RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA]"); 
fclose($f); 

Wiele osób twierdzi, że pisanie skryptów PHP do pliku .htaccess jest niebezpieczne. Powiedziałbym, że w pewnych okolicznościach jest to prawda, ale na pewno nie zawsze. Spraw, abyś rozumiał prawa, zanim pozwolisz, aby PHP zapisywało do twojego pliku .htaccess.

+0

W każdym razie możemy rozmawiać przez Skype lub coś w tym stylu? –

+0

Mam przepisać .htaccess działa, ale dotyczy tylko mojej głównej witryny, nie wszystkie witryny w sieci. –

+0

To był kierunek, w którym się też znalazłem. Powiedziałbym, że pozwalanie wordpressowi na zapisywanie dostępu do '.htaccess' i stosowanie zmian w produkcji jest złą praktyką. Pojedynczy zły zapis spowodowałby spadek całej sieci witryn. W zależności od konfiguracji serwera i zastosowań wtyczek innych producentów edytowanie '.htaccess' może nie być pożądane. na przykład buforowanie po stronie serwera i po stronie klienta, uniemożliwiające zastosowanie nowych reguł. Może to nawet pogorszyć czas reakcji, ponieważ wiele reguł przepisywania musi być przetwarzanych dla każdego żądania. – fyrye

2

Oprócz odpowiedzi Johna Gile'a należy odświeżyć parametry Get. Możesz przeczytać o niektórych opcji odkażania: here

W Twoim pytaniu kontekstowym coś takiego jak $username = sanitize_text_field($_GET['pretty']); powinno wystarczyć. Ale przyjrzyj się dokładniej temu, co wymaga odkażenia.

Odnośnie pierwotnego pytania pierwsze podejście zaproponowane przez Johna wydaje się lepsze.

Weź pod uwagę moment, w którym dwa oddzielne żądania żądają tego samego adresu URL z tą samą nazwą użytkownika. Ponieważ odczytywanie/zapisywanie pliku jest strumieniem blokującym, jedno z żądań musi czekać na zamknięcie strumienia, a strona internetowa nie wyrenderuje, dopóki to się nie stanie.

Jeśli pominiesz to z dodatkowym strumieniem lub cokolwiek ryzykujesz, skończy się duplikatem wpisów lub, co gorsza, uszkodzonym plikiem, który może prowadzić do błędów serwera.

Edit

I'am nie całkiem pewien, co chce osiągnąć z tym include('USERNAME.php') ty tworzenie dedykowanego pliku php dla każdego użytkownika, który zarejestruje się na „sieci multi-site”? Jeśli tak jest, wydaje mi się, że podjąłeś złe decyzje podczas planowania tego.

Zwykle, gdy chcesz udostępniać, kontrolować lub zmieniać zachowanie w zależności od zasobów zewnętrznych, musisz pobrać dane w formacie danych JSON.

Teraz gdybym w butach bym utworzyć usługę REST internetową, która zwraca JSON w zależności od parametru uzyskać nazwę użytkownika i kontrolować produkcję w zależności od danych pochodzących w.

Tworzenie API jest dość skomplikowane i w zależności od twoich potrzeb używałbyś każdego narzędzia, które pasowałoby najlepiej. Osobiście cieszę się z pracy z apigility dla dość skomplikowanych rzeczy i lumen dla małych rzeczy. Możesz także utworzyć to samodzielnie, jeśli wybierzesz.

Po utworzeniu api, możesz łatwo uzyskać JSON z file_get_contents() opisanym jako here lub użyć narzędzia do odpoczynku, które można znaleźć w php.

+1

OK, jeśli używam reguły przepisywania przepisywania RewriteRule^(\ w. +) $ ./pretty.php?pretty=$1 [QSA] Jak mogę ją uruchomić dla wszystkich witryn wielostanowiskowych, nie tylko dla witryny głównej. –

Powiązane problemy