Chyba będę raz na jakiś czas wrzucał tutaj tip&tricks do zastosowania przy zabawach z api WordPressa. Blogów na ten temat jest wiele i nie mam zamiaru z nimi konkurować. Dlatego kryterium wrzucania będzie takie: jeśli długo szukałem jakiegoś rozwiązania i nie mogłem znaleźć, jeśli znalazłem, czuję, że mi się jeszcze przyda, a boję się, że szybko to zapomnę – wyląduje to tutaj. Taki publiczny notes ze snippetami, który być może pomoże i części z Was.

Pracuję obecnie nad pluginem do tworzenia sklepów internetowych. Wiem, że mam już WP Sprzedawcę. Ten plugin będzie sobie istniał, ale jako właśnie taki skromny, do szczególnych zastosowań. Równolegle mam zamiar wydać duży plugin, który pozwoli tworzyć sklepy internetowe na bazie WordPressa, dostosowany do polskich realiów. Ale do rzeczy.

Plugin instalując się tworzy specjalne strony: na koszyk, na wprowadzenie danych odnośnie wysyłki przez klienta… Tej ostatniej lepiej, żeby nie było w menu na stronie. Jak tego dokonać?

Domyślnie menu jest produkowane przez funkcje wp_list_pages() umieszczoną w skórce. Można do niej przekazać parametr exclude=3 co wykluczy z menu stronę o ID równym ‚3’. Czy jest jednak sposób by wp_list_pages() zawsze wykluczało jakąś stronę, tak byśmy w instrukcji instalacji naszego plugina nie musieli pisać „po zainstalowaniu otwórz wszystkie pliki skórki i zamień każde wystąpienie funkcji wp_list_pages() na …”? Takie podejście trzeba przyznać nie byłoby rzeczą wspaniałą, nie zmuszajmy użytkownika systemu CMS do grzebania w jego kodzie!

Długo szukałem i znalazłem. Niestety nie ma żadnego filter haka czy action haka na tę funkcję. wp_list_pages korzysta jednak do pobrania listy stron z funkcji get_pages(), którą już z kolei filtrować możemy.

Zatem wszystko co musimy zrobić to przefiltrować funkcję get_pages() i ze zwracanej przez nią tablicy wyciąć ten element, który zawiera obiekt o ID równym ‚3’ (brzmi złożonie, ale przeczytajcie opis funkcji, aby zrozumieć jaki rodzaj danych zwraca; jest to tablica obiektów, każdy obiekt ma pola odpowiadające nazwom kolumn z tabeli stron w bazie danych).

Na nasze nieszczęście (ale niewielkie) funkcja get_pages() używana jest nie tylko przy tworzeniu menu stron, ale na przykład także w panelu admina. Szkoda by było jakby także tam zniknęła nam nasza strona. Zatem musimy do naszej funkcji, zanim jeszcze tablica pozbawiana wykluczanej strony, dodać warunek aby pozbawianie to nie odbywało się, jeśli funkcja wywoływana jest w panelu administracyjnym WordPressa.

OK, wiemy już wszystko.

Najpierw dodajemy filtr.

add_filter('get_pages', 'usun_strone');

Następnie tworzymy naszą funkcję usun_strone(), która jako parametr otrzymuje tablice stron.

function usun_strone($pages) {

}

W bloku funkcji wstawiamy najpierw warunek sprawdzający czy to panel administracyjny i jeśli tak – przerywamy działanie funkcji zwracając tablicę stron z powrotem w niezmienionej postaci.

$to_wp_admin = ( ( defined( 'WP_ADMIN' ) && WP_ADMIN == true ) 
|| ( strpos( $_SERVER[ 'PHP_SELF' ], 'wp-admin' ) !== false ) );
if ( $to_wp_admin ) return $pages;

Jeśli jednak nie jest to Kokpit, zróbmy pętle na tablicy stron, sprawdźmy czy ID jest równe trzy i jeśli nie, dodajmy element tablicy do nowej tablicy, a potem ją zwróćmy.

$new_pages = array();
foreach ($pages as $page) {
 if ($page->ID == '3') {
  continue;
  }
 else {
  $new_pages[] = $page;
  }
 }

return $new_pages;

To wszystko.

Przy okazji mam pytanie do Was: czy jest jakiś sposób aby w bloku funkcji sprawdzić przez jaką funkcję jest dana funkcja wywołana? Ja niestety nie znam takiego, ale pomyślałem, że fajnie by było, gdyby taka możliwość była. W powyższym kodzie nie musielibyśmy sprawdzać czy get_pages() jest wywoływane w panelu admina, czy jeszcze jakoś inaczej, a zrobilibyśmy warunek „jeśli funkcja ta jest wywoływana przez wp_list_pages(), tylko wtedy usuń stronę o ID równym 3”.

Zna ktoś taki sposób? Czekam na Wasze komentarze.