Tworzysz stronę internetową i potrzebujesz pomocy?

Kilka dni temu zwrócił się do mnie z zapytaniem jeden z czytelników, czy mógłbym pomóc przy stronie opartej o platformę WordPress – zadanie z pozoru banalne, bo trzeba skasować jeden katalog z zawartością, oraz utworzyć nowy, i wgrać do niego odpowiedni plik.

Ale był też haczyk – brak dostępu do systemu plików. Zarówno przez protokół FTP czy SCP, jak i przez jakikolwiek menedżer plików w formie webowej…

Zarządzanie plikami bezpośrednio z WordPressa

Pech chciał, że z dotychczasowym administratorem strony (i zarządzający kontem hostingowym) kontakt się – tak jakby – urwał kilka dni temu (nie, prawdopodobnie to nie ten sam administrator co w 2be/Adweb ;-)), a na koncie hostingowym coś poszło nie tak, i…

W każdym razie trzeba było skasować jeden katalog – powiedzmy, że był to katalog:

wp-content/uploads/backup-12345678/

A w nim potencjalnie kilka giga tymczasowych plików…

W normalnej sytuacji zalogowałbym się do serwera po FTP/SCP, i najzwyczajniej w świcie skasował stwarzający problemy katalog, w raz z całą zawartością – w tym przypadku nie było takiej możliwości, nie było też szans na szybkie uzyskanie loginu i hasła do panelu zarządzani kontem.

Kasowanie plików i katalogów za pomocą PHP

Na szczęście czytelnik posiadał login i hasło do panelu zarządzania WordPressem, i miał wystarczające uprawnienia by możliwe było zmodyfikowanie plików szablonu/motywu (a już np. zarządzanie wtyczkami miał wycięte/zablokowane), i właśnie ten element postanowiłem wykorzystać.

Tak więc szybko przeszedłem do edytora plików związanych z wybranym/aktywnym motywem:

  • Ustawienia > Wygląd > Edytor

Moim celem w takich przypadkach zazwyczaj jest plik header.php, gdyż kod w nim umieszczony wywoływany jest przy każdym wczytaniu strony, a więc wykona się bez większych kombinacji.

I tak na samym końcu postanowiłem dodać linijkę, dzięki której wybrany katalog zostanie skasowany wraz z zawartością:

<?php array_map('unlink', glob("wp-content/uploads/backup-12345678/*")); ?>

By ew. dodatkowo się zabezpieczyć przed wykonaniem kodu podczas wizyty na stronie przypadkowego użytkownika, można ograniczyć jego wywołanie np. tylko do zalogowanych użytkowników:

<?php
if ( is_user_logged_in() ) {
     array_map('unlink', glob("wp-content/uploads/backup-12345678/*"));
}
?>

Na koniec wystarczy zapisać plik, i wejść na stronę, by wywołał się dodany przez nas kod, a tym samym katalog zniknął z naszego konta/dysku.

Pamiętajcie, by po wywołaniu kodu (jednorazowym wejściu na stronę) skasować dodane linijki, czyli przywrócić plik header.php do pierwotnej/oryginalnej zawartości.

Tworzenie katalogów, wgrywanie plików z pomocą PHP

Ale by nie było, że w ten sposób możemy podejmować tylko i wyłącznie działania destrukcyjne, to korzystając z okazji pokaże jak w ten sam sposób – korzystając tylko z innego kodu – utworzyć katalog, lub wgrać plik.

A by nie była to sucha pisanina, to jako wzór posłuży mi opisany niedawno sposób na monitorowanie stanu strony za pomocą szablonu własnej strony, więc naszym celem będzie utworzenie katalogu „page-templates” w katalogu z motywem:

wp-content/themes/nazwa-motywu/page-templates

Podstawowy kod, za pomoca którego utworzymy katalog może wyglądać tak:

<?php mkdir('wp-content/themes/nazwa-motywu/page-templates'); ?>

Choć w przypadku WordPressa możemy/warto skorzystać z innego polecenia:

<?php wp_mkdir_p('/wp-content/themes/nazwa-motywu/page-templates'); ?>

Dodatkową zaletą jest to, że jednym poleceniem możemy utworzyć wiele zagnieżdżonych podkatalogów, bez konieczności tworzenia jednego po drugim:

<?php wp_mkdir_p('/wp-content/themes/nazwa-motywu/page-templates/web/insider/pl'); ?>

Gdy już mamy utworzony niezbędny katalog, możemy przystąpić do wgrywania pliku – do wyboru mamy co najmniej 2 drogi:

  • Utworzenie nowego, pustego katalogu i późniejszą edycję
  • Wgranie pliku gotowego z zewnętrznej lokalizacji

Plik – do późniejszej edycji za pomocą np. edytora szablonów/motywów – utworzymy za pomocą polecenia:

<?php touch('/wp-content/themes/nazwa-motywu/page-templates/wordpress-status.php'); ?>

Możemy też przygotować gotowy plik, który następnie umieszczamy w innej lokalizacji, i pobieramy/dodajemy go bezpośrednio do naszej strony:

<?php file_put_contents('/wp-content/themes/nazwa-motywu/page-templates/wordpress-status.php', fopen('https://webinsider.pl/przykladowy-plik-zrodlowy.txt', 'r')); ?>

Jak być może zauważyliście – plik źródłowy ma rozszerzenie „txt” zamiast „php”, dzięki czemu zostanie wyświetlony/pobrany w całości, a nie wykonany.

Oczywiście przedstawione tutaj przykłady nie wyczerpują tematu, ale tym wpisem chciałem Wam tylko zasygnalizować kierunek, np. gdybyście znaleźli się w podobnej sytuacji…

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Tworzysz stronę internetową i potrzebujesz pomocy?
Patryk
Kurs "WordPress: Pierwsze kroki" (na dobry początek)