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

Wyszukaj metadane postów w obszarze administracyjnym WordPress

27

Po dłuższym czasie pracy z WordPressem prawdopodobnie w pewnym stopniu pracowałeś z metadanymi posta. Być może po prostu czytałeś metadane z bazy danych, a może zarówno zapisywałeś, jak i czytałeś z tabeli bazy danych.

Może to być naprawdę potężny interfejs API, gdy potrzebujesz powiązać określone informacje z twoimi postami (lub, jeśli jesteś jeszcze bardziej abstrakcyjny, z twoimi modelami).

To powiedziawszy, co się dzieje, gdy chcesz uwzględnić informacje z tabeli metadanych, ale nie masz wygody wtyczek, takich jak SearchWP lub Relevanssi?

Ponadto załóżmy, że przypadek użycia dotyczy tylko administratorów i dotyczy tylko obszaru administracyjnego WordPress. Oznacza to, że chcesz przeszukiwać swoje posty z poziomu ekranu Wszystkie posty, ale chcesz również uwzględnić metadane postów w kryteriach wyszukiwania.

Co wtedy?

Wyszukaj metadane posta

Po wyjęciu z pudełka, za każdym razem, gdy szukasz postów w obszarze administracyjnym WordPress, wyszuka on frazę w tytule posta, fragmencie posta i treści posta, a następnie zwróci te wyniki.

Aby więc rozszerzyć wyszukiwanie o metadane wpisu, musimy zaktualizować uruchomione zapytanie tak, aby zawierało tabele metadanych wpisu. Ale jest w tym coś więcej. W szczególności, aby uzyskać największą elastyczność i najlepsze wrażenia użytkownika, będziesz chciał:

  • wstawiaj fragmenty frazy, aby nie szukało czegoś dosłownie w artykule,
  • i oczywiście prawidłowo obsłużyć przypadek, w którym nie wprowadzono żadnego hasła wyszukiwania, aby ekran Wszystkie posty nadal mógł być wyświetlany w standardowym formacie.

Oznacza to, że nie tylko musimy zmodyfikować zapytanie wyszukiwania, aby zawierało klucz meta i wartość meta, ale także musimy odpowiednio zmienić znaczenie całych fraz, aby móc użyć LIKEoperacji zamiast INoperacji lub =operacji.

Wyszukaj metadane postów w obszarze administracyjnym WordPress

Niektóre z rzeczy, które warto wiedzieć przed przeczytaniem reszty tego artykułu, to:

Ostatecznie będziemy potrzebować dwóch hooków z dwoma niestandardowymi funkcjami. A ponieważ nie mogę podać pełnego przykładu tego, jak to może wyglądać w twoim przypadku użycia, kod musi być nieco uogólniony.

Podłączanie do wyszukiwania

W poniższym skrócie zobaczysz trzy rzeczy:

  1. Weryfikacja, że ​​użytkownik znajduje się w obszarze administracyjnym i znajduje się na stronie edycji.
  2. Użytkownik wprowadził wyszukiwanie.
  3. Wyszukiwana fraza została przekonwertowana na tablicę, zmieniona i dodana do właściwości meta zapytania wystąpienia WP_Query.

Zobacz poniżej :

<?php
add_filter('pre_get_posts', function ($query) {

    // Make sure we're in the admin, an administrator, and on the edit page.
    if (!is_admin() || !current_user_can('manage_options') || 'edit' !== get_current_screen()->base) {
        return;
    }

    // Determine if the user is running a search.
    $search = filter_input(INPUT_GET, 's', FILTER_SANITIZE_STRING);
    if (empty($search)) {
        return;
    }

    $query->set(
        'meta_query',
        [
            [
                'key'     => 'headline_notes',
                'value'   => esc_sql(preg_replace('/s+?/', '%', $search)), // For flexible search, make sure to replace all white space with % for LIKE.
                'compare' => 'LIKE',
            ],
        ]
    );
});

Zakładając, że wszystkie powyższe są prawdziwe, spowoduje to zaktualizowanie zapytania uruchomionego w bazie danych WordPress przed wyrenderowaniem następnej strony, tak aby wyniki zawierały informacje o metadanych.

Aktualizacja klauzuli WHERE

Zanim jednak skończymy, musimy również upewnić się, że zaktualizowaliśmy uruchomione zapytanie.

Domyślnie zapytanie jest budowane przy użyciu ANDoperacji, co uniemożliwia nam poprawne przeglądanie tytułów postów, fragmentów, treści i metadanych; jednak zapytanie musi zostać zaktualizowane, aby używało ORoperacji.

Dosłownie oznacza to, że będzie wyglądać w tytule, treści, fragmencie lub metadanych.

Zdecydowałem się użyć wyrażenia regularnego w mojej implementacji, ale Twoja implementacja może działać z zastępowaniem podciągów. W związku z tym jest trochę skomentowane, aby zapewnić największą elastyczność.

<?php
add_filter( 'posts_where', function($where, $query) {

    // Determine if 'headline_notes' appears in the WHERE clause.
    $position = strpos($where, 'acme_meta_key');
    if (false === $position) {
        return $where;
    }

    // Look for the 'AND' clasue and replace it with 'OR' in the WHERE clause.
    $regularExpress = '//mi'; // Your regular expression.
    $replacement = ''; // Your string to replace.

    return preg_replace(
        $regularExpression,
        $replacement,
        $where
    );
}, 10, 2);

To aktualizuje WHEREklauzulę, która jest uruchamiana w celu zakończenia pracy ustawionej w początkowej części artykułu, w której dodajemy metadane.

Są inne sposoby

Zwróć uwagę, że istnieje kilka niezwykle elastycznych sposobów pracy z WP_Query, aby uzyskać potrzebne wyniki. Twoja implementacja będzie się różnić w zależności od tego, co robisz.

Rozważ więc ten jeden z wielu sposobów, które można wykorzystać; wiedz jednak, że jeśli masz:

  1. jeden klucz,
  2. wartość (lub wartość, którą można podzielić na tablicę),
  3. i chcesz wyszukiwać metadane obok tradycyjnej treści postu

Wtedy to zadziała.

Ź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