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

Dodaj niestandardowy link do ekranu wszystkich postów na podstawie metadanych postów

16

TL; DR: w tym artykule opisano kod potrzebny do dodania niestandardowego linku na ekranie Wszystkie posty, który używa niestandardowego fragmentu metadanych posta.

Uwaga: kilka miesięcy temu napisałem artykuł o tym, jak dodać niestandardowy widok do ekranu Wszystkie posty. Ten artykuł nie jest taki sam, ale nie wszystkie razem różnią się. Pomyśl o tym jako o bardziej szczegółowym i być może bardziej praktycznym wdrożeniu koncepcji.


Załóżmy, że masz standardowy typ posta lub niestandardowy typ posta i zamierzasz po prostu filtrować według nagłówka, który definiujesz za pomocą mechanizmu, który pozwala na zapisywanie danych w post_metadatatabeli.

Załóżmy na przykład, że masz post i jest on częścią metadanych z:

  • a meta_keyo wartościarticle_attribute
  • a meta_valueo wartościheadline

I chcesz wykorzystać te informacje, aby dodać nowy link Nagłówki, który automatycznie odfiltruje wszystko z wyjątkiem artykułów z tymi metadanymi.

Oto jak to zrobić.

Niestandardowy link na ekranie wszystkich postów

Przed rozpoczęciem warto zauważyć, że istnieją dwa sposoby rozwiązania tego problemu:

  • Możemy najpierw dodać link u góry strony Wszystkie posty, a następnie dodać funkcję filtrowania danych po drugie,
  • Lub możemy to zrobić na odwrót, gdzie najpierw dodamy logikę zaplecza, a następnie dodamy link do strony Wszystkie posty.

Zamierzam zacząć od drugiej opcji. Nie ma powodu, dla którego miałoby się to odbywać w ten sposób. To moja preferencja.


Najpierw muszę podpiąć się pod [pre_get_posts](https://developer.wordpress.org/reference/hooks/pre_get_posts/)hak dostarczony przez WordPressa. W tym przykładzie nie będę używał żadnych klas z przestrzenią nazw ani funkcji z prefiksami (biorąc pod uwagę, że wystarczająco omówiłem tę zawartość na tej stronie), ale będę miał do tego wtyczkę demonstracyjną dołączoną na dole postu.

W każdym razie zacznę od dodania anonimowej funkcji dołączonej do wspomnianego haka:

add_action(
  'pre_get_posts',
  function (WP_Query $query) {

  }
);

Zauważ, że funkcja anonimowa akceptuje pojedynczy argument, który jest odwołaniem do bieżącego wystąpienia WP_Querydziałającego na stronie. Jeśli nie znasz tej klasy, polecam przeczytanie dowolnego z tych artykułów lub strony z zasobami dla programistów.

W funkcji muszę sprawdzić obecność meta_valuew ciągu zapytania. Jest to łatwe dzięki [filter_input](https://www.php.net/manual/en/function.filter-input.php)funkcji dostarczonej przez PHP.

add_action(
  'pre_get_posts',
  function (WP_Query $query) {
    $meta_value = 'headline';

    if (filter_input( INPUT_GET, 'meta_value') === $meta_value) {
      $query->set( 'meta_key', 'article_attribute' );
      $query->set( 'meta_value', $meta_value );
    }
  }
);

Ten zaczep będzie sprawdzał, czy headlinewartość jest kluczem dla meta_valueklucza w ciągu zapytania. Jeśli tak, dodaje a meta_keyi meta_valuedo wystąpienia, WP_Queryktóre poinstruuje WordPress, aby pobrać wszystkie posty z tylko tymi metadanymi.


Następnie muszę dodać link na górze strony Wszystkie posty, aby uruchomić tę funkcję. Aby to zrobić, użyję [views_edit-posts](https://tommcfarlin.com/add-a-custom-view/)haka. Ta funkcja zaakceptuje tablicę kotwic, która będzie wyświetlana u góry strony.

Odnoszę się do nich jako $viewsdo tego, co funkcja zaakceptuje, gdy ją odcię:

add_action(
  'views_edit-post',
  function (array $views) {

    return $views;
  }
);

Zwróć uwagę, że ważne jest, aby zwrócić tablicę z powrotem do WordPressa, aby wiedziała, co renderować, nawet jeśli nie zostanie dokonana żadna modyfikacja.

Najpierw muszę ustalić, czy aktualnie jestem na stronie niestandardowej. Jeśli tak, to muszę dodać odpowiednie atrybuty do kotwicy dodanej na górze strony:


$attributes = 'class=""';
if (filter_input(INPUT_GET, 'meta_value') === 'headline') {
  $attributes ='class="current aria-current="page"';
}

Następnie muszę dodać widok Nagłówki do strony. Będzie to wymagało użycia kilku funkcji:

  • [array_push](https://www.php.net/manual/en/function.array-push.php)za dodanie nowego linku do listy$views
  • [sprintf](https://www.php.net/manual/en/function.sprintf.php)za bezpieczne dodanie nowego ciągu
  • [add_query_arg](https://developer.wordpress.org/reference/functions/add_query_arg/)do dodawania zestawu niestandardowych argumentów zapytania do bieżącej strony.

Następna sekcja kodu będzie wyglądać tak:


array_push(
  $views,
  sprintf(
    '<a href="%1$s" %2$s>%3$s 
      <span class="count">(%4$s)</span>
     </a>
    ',
    add_query_arg([
      'post_type'   => 'post',
      'post_status' => 'all',
      'meta_value'  => 'headline',
    ], 'edit.php'),
    $attributes
    __('Headlines'),
    count(  );
);

Ale jeszcze nie skończyłem. Zauważ konkretnie, że wykonuję wywołanie [count](https://www.php.net/manual/en/function.count.php)na końcu funkcji. Dzieje się tak, abym mógł poprawnie wyświetlić liczbę postów, które mają ten atrybut.

Napiszę do tego dwie funkcje pomocnicze, a potem wrócę do sizeofwywołania.


Oto funkcja pomocnicza do znajdowania liczby wyników, które mają określony meta_keyi meta_valuektóre mamy dla tego typu postu. Zauważ, że używam [$wpdb](https://developer.wordpress.org/reference/classes/wpdb/)do bezpośredniego wywołania bazy danych i że specjalnie używam [prepare](https://developer.wordpress.org/reference%2Fclasses%2Fwpdb%2Fprepare%2F/), aby upewnić się, że robię to bezpiecznie.

function get_headline_results(): array {
  global $wpdb;
  return $wpdb->get_results( 
    $wpdb->prepare(
      "
      SELECT post_id FROM $wpdb->postmeta
      WHERE meta_key = %s AND meta_value = %s
      ",
      'article_attribute',
      'headline'
    ),
    ARRAY_A
  );
}

Zauważ, że zwraca wszystkie wyniki (nie tylko liczbę), ponieważ ta wartość zostanie chwilowo przekazana do innej funkcji.

W tym momencie moglibyśmy zatrzymać się i po prostu spojrzeć na treść zwróconą z zapytania, ale jeśli interesuje nas tylko posttyp posta, musimy to uwzględnić. Oto jeden sposób, aby to zrobić:

function filter_posts_from_pages( array $results ): array {
  $post_ids = array();

  foreach ($results as $result) {
    if ('post' === get_post_type( $result['post_type'])) {
      $post_ids[] = $result['post_id'];
    }
  }

  return $post_ids;
}

Dzięki temu możemy przywrócić tę wartość z powrotem do countfunkcji powyżej.


Ostateczna wersja bloku, który zaczęliśmy powyżej, powinna wyglądać mniej więcej tak:


array_push(
  $views,
  sprintf(
    '<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
    add_query_arg(
      array(
        'post_type'   => 'post',
        'post_status' => 'all',
        'meta_value'  => 'headlines', 
      ),
      'edit.php'
    ),
    $attributes,
    __( 'Headlines' ),
    count(
      filter_posts_from_pages( get_headline_results()) )) );

Oznacza to, że pełna wersja funkcji dodawania nowego nagłówka wygląda mniej więcej tak:

add_action(
  'views_edit-post',
  function (array $views) {

    $attributes = 'class=""';
    if (filter_input( INPUT_GET, 'meta_value') === 'headline') {
      $attributes = 'class="current aria-current="page"';
    }

    array_push(
      $views,
      sprintf(
        '<a href="%1$s" %2$s>%3$s <span class="count">(%4$s)</span></a>',
        add_query_arg(
          array(
            'post_type'   => 'post',
            'post_status' => 'all',
            'meta_value'  => 'headline', 
          ),
          'edit.php'
        ),
        $attributes,
        __( 'Headlines' ),
        count(
          filter_posts_from_pages( get_headline_results()) )) );

    return $views;
  }
);

I, jak wspomniano na początku, ta wtyczka nie ma przestrzeni nazw ani nie jest zorganizowana w sposób, w jaki zwykle piszę kod. Zamiast tego ma zademonstrować sposób na szybkie osiągnięcie czegoś – swego rodzaju prototyp.

Więc jeśli chcesz zobaczyć coś takiego w akcji, możesz sprawdzić repozytorium na GitHub. Zauważ, że w tej chwili jest to gałąź deweloperska. Pamiętaj, aby zobaczyć, [README](https://github.com/tommcfarlin/custom-metadata-filter/blob/develop/README.md)ponieważ zawiera instrukcje dotyczące dodawania danych do bazy danych dla postów, aby kotwica nagłówków faktycznie działała, a nie bezwarunkowo pokazywała wartość zerową.

Ź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