✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Rejestrowanie haków WordPress przy użyciu innej klasy

16

We wczorajszym poście mówiłem o konstruktorach wtyczek WordPress i uzasadnieniu, dlaczego hooki nie powinny znajdować się w konstruktorze.

Chociaż wspomniałem o wielu sposobach obsługi rejestracji haka, nie zawracałem sobie głowy wchodzeniem w szczegóły dla każdej z tych strategii. Jeśli o mnie chodzi, zasługują na swój własny artykuł, aby podać jak najwięcej szczegółów na temat tego, jak coś skonfigurować.

Na przykład jedna z udostępnionych przeze mnie metod mówiła:

  • Za pomocą WordPressa można stworzyć klasę, która prowadzi rejestr obiektów i hooków.

Innymi słowy, chodzi o rejestrowanie hooków WordPressa przy użyciu podejścia obiektowego, aby zmniejszyć sprzężenie i zwiększyć spójność między komponentami wtyczki.

Ale co to w ogóle oznacza? Jakie korzyści przynosi, jak jest skonfigurowany i jak jest używany?

Rejestrowanie haków WordPress

Jeśli to czytasz, prawdopodobnie znasz system zaczepów WordPressa, kolejność ich uruchamiania oraz sposób, w jaki funkcja lub klasa może rejestrować swoje funkcje w WordPressie, aby mogły wykonywać każdą pracę, której potrzebują.

Często widzimy, jak klasy robią to samodzielnie. W zależności od projektu robię to sam. Dla tych, którzy nie są zaznajomieni, ogólnie wygląda to mniej więcej tak :

<?php

add_action( 'plugins_loaded', 'acme_start' );
/**
 * Start the machine.
 * https://www.youtube.com/watch?v=ysoMOefPyRs
 */
function acme_start() {
    $plugin = new AcmeColumn();
}

Ale wszystko to można podzielić na bardziej spójne klasy, aby ostatecznie dać im jeszcze mniej odpowiedzialności (to dobrze) i zmniejszyć sprzężenie między klasą lub zestawem klas z WordPress.

Przykładowy projekt, który opiszę w tym poście.

Jednak sprzeczny z intuicją charakter tego jest taki, że będzie to wymagało co najmniej jednej innej klasy. Ale oto jak to działa.

Konfigurowanie go

Na potrzeby tego przykładu użyjemy po prostu prostej klasy, która zarejestruje pewien rodzaj akcji w WordPressie. Pomysł na architekturę działa mniej więcej tak:

  1. Istnieje główna klasa, która ma funkcję, którą chcemy podłączyć do WordPressa.
  2. Istnieje klasa odpowiedzialna za orkiestrację podpinania funkcji klasy do WordPressa.

Wystarczająco łatwe, prawda? Ale tu jest haczyk: klasa odpowiedzialna za rejestrację funkcji danej klasy w WordPressie to punkt, który wymaga decyzji projektowej.

Najpierw nazwijmy klasę HookRegistry, abyśmy mogli się do niej właściwie odwoływać. Następnie wywołajmy klasę z funkcjami, które chcemy podpiąć AcmeColumn, aby po prostu reprezentować klasę, która dodaje nową kolumnę do pulpitu nawigacyjnego strony w obszarze administracyjnym WordPressa.

Mając to na uwadze, decyzja projektowa sprowadza się do tego:

  1. Czy HookRegistery powinien wiedzieć o AcmeColumn?
  2. Czy AcmeColumn powinien wiedzieć o HookRegistry?

Wiem, że istnieją inne sposoby na zorganizowanie tego i istnieją również strategie, jak sobie z tym poradzić (jak odwrócenie kontroli) i są to tematy, które warto zbadać, ale aby zachować ten początkowy pomysł jak najprostszy, przedstawię to dla przyszły post.

Korzystanie z klasy

Biorąc pod uwagę powyższe opcje, przekażemy instancję AcmeColumn do HookRegistry podczas tworzenia instancji klas podczas początkowego procesu uruchamiania wtyczki WordPress. To może wyglądać mniej więcej tak :

<?php

add_action( 'plugins_loaded', 'acme_start' );
/**
 * Start the machine.
 * https://www.youtube.com/watch?v=ysoMOefPyRs
 */
function acme_start() {

  $registry    = new HookRegistry();

  $acme_column = new AcmeColumn( $registry );
  $acme_column->start();
}

Następnie, gdy nadejdzie czas, aby AcmeColumn  zarejestrował swoją funkcję w WordPressie, wywołamy HookRegistry i poinstruujemy go, aby to zrobił.

Po pierwsze, AcmeColumn :

<?php

class AcmeColumn {

    private $registry;

    public function __construct( $registry) {
        $this->registry = $registry;
    }

    public function start() {
        $registry->add_hook( 'filter', 'manage_edit-page_columns', $this, 'add_page_column' );
    }

    public function add_page_column( $page_columns) {

        $page_columns['template'] = 'Acme Column';
        return $page_columns;
    } 
}

Następnie rejestr haków :

<?php

class HookRegistry {

  public add_hook( $type, $name, $object, $method) {

    $type = strtolower( $type );
    if ('filter' !== $type || 'action' !== $type) {
      return new WP_Error( '1', 'No proper hook type defined.' );
    }
  }

  private function add_filter( $name, $object, $method) {
    add_filter( $name, array( $object, $method) );
  }

  private function add_action( $name, $object, $method) {
    add_action( $name, array( $object, $method) );
  }
}

Opcjonalnie możemy również prowadzić listę różnych klas i hooków, które zostały zarejestrowane. Może to być przydatne, ale nie musi, w zależności od implementacji, więc udostępniam wyłącznie jako „oto coś, co możesz chcieć zrobić".

A to mogłoby wyglądać tak (przy użyciu prostej tablicy asocjacyjnej):

<?php

class HookRegistry {

  private $registry;

  public function __construct() {
    $this->registery = array(); 
  }

  public add_hook( $id, $type, $name, $object, $method) {

    $type = strtolower( $type );
    if ('filter' !== $type || 'action' !== $type) {
      return new WP_Error( '1', 'No proper hook type defined.' );
    }

    if ('filter' === $type) {
      $this->add_filter( $name, $object, $method );
    } else {
      $this->add_action( $name, $object, $method );
    }

    $hook_info = array(
      $type,
      $name,
      $object,
      $method,
    );
    $this->registry[ $id ] = $hook_info;
  }

  private function add_filter( $name, $object, $method) {
    add_filter( $name, array( $object, $method) );
  }

  private function add_action( $name, $object, $method) {
    add_action( $name, array( $object, $method) );
  }
}

Zauważ, że w powyższej klasie, teraz akceptuje $id jako parametr. Istnieje wiele sposobów identyfikowania informacji trafiających do rejestru, z których najłatwiejszym jest samodzielne utworzenie identyfikatora.

Jeśli jednak chciałbyś użyć czegoś takiego jak nazwa haka lub nazwa klasy, to też by zadziałało. Pamiętaj tylko, że ponieważ jest to tablica asocjacyjna, może utrzymywać tylko jedną wartość na klucz, więc możesz skończyć z wyrzuceniem poprzednich danych, jeśli nie będziesz ostrożny.

Niezależnie od tego jest to coś, co uważam za opcjonalne, ale jeśli jest zaimplementowane, ważne jest, aby upewnić się, że masz odpowiednie funkcje do pobrania instancji obiektu za pomocą klucza.

Jeden z wielu

Podobnie jak w przypadku wszystkiego, co dotyczy tego rodzaju pracy, możliwe jest przeprojektowanie lub przeorientowanie tego w sposób, który działa inaczej lub odpowiada Twoim potrzebom. Celem nie jest pokazanie ostatecznego wzorca, jak coś zrobić, ale sposób podejścia i dostosowania go (podobnie jak każdy wzorzec projektowy).

Co więcej, ma to na celu upewnienie się, że nasze klasy zachowują obowiązki, do których zostały stworzone, jednocześnie umożliwiając im zarejestrowanie się w WordPressie w razie potrzeby. Tym razem jednak klasa nie musi tego robić sama.

Zamiast tego przekazuje odpowiedzialność klasie, która ma wyłączną odpowiedzialność za rejestrację wspomnianych podpięć. Więc chociaż wprowadza więcej klas, zwiększa spójność i zmniejsza sprzężenie.

Zapewnia to korzyści w zakresie konserwacji, testowania i ogólnego projektowania.

Źródło nagrywania: tommcfarlin.com

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów