Ukrywanie treści w WordPressie
Dostałem zlecenie od Pani Całki, coby na jej blogu, a w sumie na naszym wspólnym, ukryć komentarze i niektóre wpisy, bo się ludziska buntują, że ich prywatność jest naruszana. Abstrahując od zasadności tych żądań, przystąpiłem do główkowania – jak to zrobić? Oczywiście, na myśl najpierw przyszły mi wtyczki. Okazało się jednak, że trudno o wtyczkę, która spełniałaby moje wymagania. Mimo poszukiwań moich i jednego z kolegów z grupy, nie natrafiłem na coś, co by mnie w pełni usatysfakcjonowało. Postanowiłem sam pogrzebać w kodzie WP w nadziei, że może coś mi się uda wykombinować. Obawiałem się już, że będę musiał pobawić się SQL-em, ale okazało się, że niezbadane listingi WP przyniosły błyskawiczne i proste rozwiązanie.
Otóż wystarczy ująć fragment kodu strony między magiczne struktury warunkowe (magiczne, bo nie rozumiem, jak one są parsowane) i voilà:
<?php if ( $user_ID ) : ?>
<p>Akapit widoczny dla zalogowanych.</p>
<?php else : ?>
<p>Akapit widoczny dla niezalogowanych.</p>
<?php endif; ?>
Kod nie działał na wszystkich stronach, co, jak stwierdziłem, wynikało ze specyficznego traktowania zasięgu zmiennych w PHP:
Można tu zauważyć różnicę w stosunku do języka C, gdzie zmienne globalne są zawsze dostępne wewnątrz definicji funkcji, o ile nie zostały nadpisane przez lokalną definicję zmiennej. Może to spowodować taki problem, że ktoś może nieodwracalnie zmienić wartość zmiennej globalnej. W PHP zmienne globalne muszą być jawnie określone jako globalne wewnątrz funkcji, w której mają być użyte, do czego używamy słowa kluczowego global.
Czasami musiałem więc dodać przed wyżej zaprezentowanymi instrukcjami polecenie:
<?php global $user_ID; ?>
Ukrycie komentarzy stało się więc banałem, wystarczyło wyedytować comments.php i single.php. Aby ukryć komentarze, a raczej ich część, wykorzystałem jeden z ficzerów WP, który pozwala na podzielenie posta na dwie części: widoczną na stronie głównej i stronie pojedynczego wpisu oraz tę, która jest widoczna tylko na stronie wpisu. Zmieniłem tu znowu single.php:
<?php if ( $user_ID ) : ?>
<div class="entry">
<?php the_content('TRUE'); ?>
<?php link_pages('<p><strong>Pages:</strong> ', '</p>', 'number'); ?>
</div>
<?php else : ?>
<div class="entry">
<?php $more=0; the_content('Zaloguj się, by zobaczyć więcej.'); ?>
</div>
<?php endif; ?>
$more=0 było potrzebne, bo domyślne na stronie pojedynczego wpisu, fukncja the_content() zwraca obie części wpisu.
Później zadbałem o to, by niezalogowani nie mieli dostępu do archiwum i wyszukiwarki wpisów (te moje pomysły to trochę mi trącą stylem ugly hack, więc im mniej ficzerów dostępnych dla obcych, tym mniej potencjalnych backdoorów), edytując m.in. archive.php. Na koniec musiałem, niestety, pogrzebać w silniku, m.in. po to, by feedy nie zdradziły zbyt wiele.
Jak na razie wszystko działa bez zarzutu, tj. tak, jak chcę. Czy nie będzie włamu? Chyba nikomu nie będzie się chciało próbować…

wtorek, 3 października 2006 @ 23:14
O rany – kawałek kodu php – jak dawno ja tego nie widziałem – już lata. Będe musiał w końcu do tego wrócić ;D – bo teraz to niewiele niestety pamiętam