Własne linki na stronie z wtyczkami

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:

Wtyczka z linkami standardowymi

Ale niektóre wtyczki dodają swoje własne linki, może to wyglądać tak:

Wtyczka z własnymi linkami

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:

Własne odnośniki na stronie wtyczek

HTML wygenerowany przez nasz kod wygląda tak:

HTML wygenerowany przez WordPress dla dodatkowych linków na stronie wtyczek