Nierzadko spotykamy się z taką sytuacją, że na stronie administracyjnej z listą wtyczek, widzimy jakieś wtyczki, które mają więcej odnośników niż przewiduje standard, czyli np. „Deactivate” (w przypadku aktywnej wtyczki) lub „Activate” / „Delete” w przypadku wtyczki, którą mamy w katalogu /plugins/ ale nie jest aktywna. Wygląda to mniej więcej tak:
Ale niektóre wtyczki dodają swoje własne linki, może to wyglądać tak:
Jak zrobić takie odnośniki?
Okazuje się, że nie tak trudno. Na nasze potrzeby stworzymy sobie wtyczkę testową, niespecjalnie zaawansowaną, chodzi o pokazanie samego procesu.
Zaczniemy od tego, że będziemy potrzebować nazwy naszej wtyczki w postaci katalogu i nazwy pliku głównego. Z poziomu pliku głównego można to bardzo łatwo uzyskać, w ten sposób:
$pluginBaseName = plugin_basename( __FILE__ );
W naszym przypadku zawartość zmiennej $pluginBaseName będzie wyglądała tak:
plugin-template/plugin-template.php
Oczywiście w Twoim przypadku może to wyglądać inaczej, to tylko przykład. Ja sobie, zgodnie z pojedynczą odpowiedzialnością, stworzyłem klasę do wyświetlania takich plików:
class PluginLinks { public function __construct(string $pluginBaseName) { } }
Jak to zazwyczaj bywa w przypadku WordPress, musimy użyć akcji, aby podpiąć nasz kod w odpowiednim momencie. Akurat w tym przypadku, te akcje są różne dla różnych wtyczek, stąd potrzeba użycia naszego $pluginBaseName. Właściwą akcję zapiszemy tak:
add_action('plugin_action_links_' . $pluginBaseName, ...
Oczywiście musimy akcję odnieść do jakiejś metody w naszej klasie. W tym wypadku wygląda to tak, że dostaniemy tablicę i tablicę musimy zwrócić. Tworzymy więc metodę:
public function filterLinks(array $links): array { return $links; }
Mając metodę, możemy w konstruktorze klasy przypisać ją do akcji:
public function __construct(string $pluginBaseName) { add_action('plugin_action_links_' . $pluginBaseName, [$this, 'filterLinks']); }
A co zrobimy w tej metodzie, tak właściwie? Dodamy linki, po prostu jako kod html:
public function filterLinks(array $links): array { $links[] = '<a href="#">Link</a>'; return $links; }
To wystarczy 🙂 Oczywiście możemy przypisać klasę czy ID do znacznika odnośnika <a>, możemy tam wstawić cokolwiek chcemy, będzie to zamknięte w znaczniku <span> Musimy jednak pamiętać, że jak dodamy zwykły tekst, to kolor tekstu zostanie odziedziczony po klasie .row-actions, a jest to #ddd czyli dosyć jasny szary.
Znacznikowi <span> również możemy nadać klasę. Ale dla każdego inną, bowiem jeżeli nadamy klucz nienumeryczny w tablicy $links, zostanie wykorzystany jako klasa.
Zróbmy więc wersję końcową naszego kodu i zobaczmy, co z niego wyniknie:
class PluginLinks { public function __construct(string $pluginBaseName) { add_action('plugin_action_links_' . $pluginBaseName, [$this, 'filterLinks']); } public function filterLinks(array $links): array { $links['class_test1'] = '<a href="#" id="link_test1">' . __('Test link 1', 'text_domain') . '</a>'; $links['class_test2'] = '<a href="#" id="link_test2">' . __('Test link 2', 'text_domain') . '</a>'; return $links; } }
Wygląda to tak:
HTML wygenerowany przez nasz kod wygląda tak: