WordPress

zapytanie wp — Jak uzyskać wszystkie post_id i meta_value za pomocą meta_key w tabeli wp_postmeta

  • 21 września, 2022
  • 3 min read
zapytanie wp — Jak uzyskać wszystkie post_id i meta_value za pomocą meta_key w tabeli wp_postmeta


WordPress nie zawiera żadnej funkcji umożliwiającej bezpośrednie uzyskiwanie listy identyfikatorów postów i wartości meta za pomocą klucza meta. Najbardziej bezpośrednim rozwiązaniem jest zapytanie o wszystkie posty, które mają klucz meta, a następnie uzyskanie dostępu do odpowiednich wartości meta. Chociaż możliwe jest wykonanie zapytania SQL w celu utworzenia takiej listy, potrzeba tego może być czerwoną flagą wskazującą na nieoptymalny projekt — powinieneś rozważyć inne sposoby wykorzystania systemów WordPress do osiągnięcia pożądanego rezultatu, zanim zdecydujesz się na taki rozwiązanie.

Alternatywne rozwiązania obejmują buforowanie zbiorczych wartości meta w pojedynczej opcji przejściowej lub lokalizacji i modyfikowanie operacji aktualizacji w celu wpłynięcia na oba magazyny lub użycie dedykowanej niestandardowej tabeli do przechowywania danych. „Najlepsze narzędzie do pracy” jak zawsze zależy od specyfiki twojego przypadku użycia.

W każdym razie, jeśli musisz uwzględnić dużą liczbę wpisów, powinieneś rozważyć włączenie podziału na strony w celu złagodzenia ograniczeń limitu czasu pamięci i wykonania.


Wyślij zapytanie

Najprostszym rozwiązaniem jest zapytanie o posty, które mają meta:

$query = new WP_Query( [
  'meta_key'     => 'restriction_settings',
  'meta_compare' => 'EXISTS',
] );

foreach( $query->posts as $post ) {
  $post_id  = $post->ID;
  $settings = get_post_meta( $post_id, 'restriction_settings', true );

  // ...
}

Chociaż możesz pomyśleć o ustawieniu 'fields' => 'ids' w zapytaniu w celu poprawy wydajności poprzez pobieranie tylko identyfikatorów postów, spowoduje to wyłączenie metacache postów dla zapytania, co może skutkować każdym kolejnym wywołaniem get_post_meta() powodując dodatkowe trafienie w bazie danych i obniżając ogólną wydajność zamiast ją poprawiać.

Warto przeczytać!  rozwój wtyczki - Wyślij e-mail Automatycznie Weryfikacja wygenerowanego kodu Z formularza kontaktowego 7 Wordpress?

Niestandardowe zapytanie SQL

Poniższy kod służy wyłącznie do celów demonstracyjnych i omija wszystkie konwencjonalne procedury dotyczące metadanych WordPress. Obejmuje to ignorowanie działań i filtrów, które zwykle są uruchamiane podczas uzyskiwania dostępu do metadanych postów, a także wszelkie interakcje z meta-pamięciami podręcznymi, które poprawiają wydajność operacji i zapewniają interoperacyjność z rozwiązaniami do buforowania innych firm.

Jeśli zdecydujesz się pójść tą drogą, to tak wysoce wskazane zbadać wykonanie get_metadata() i replikować jego funkcję przechwytywania i buforowania, aby jak najlepiej zapewnić kompatybilność zarówno z podstawowymi zachowaniami, jak i wtyczkami innych firm, a także optymalizować wydajność.

function wpse409692_get_meta_post_values(
  $meta_key,
  $single   = false,
  $per_page = 100,
  $page     = 1
) {
  global $wpdb;

  $query  = "
    SELECT `post_id`, `meta_value`
    FROM {$wpdb->postmeta}
    WHERE `meta_key` = %s
  ";
  $query_values = [ $meta_key ];

  if( $per_page == 0 || $per_page < -1 || $page < 1 )
    return [];

  if( $per_page > 0 ) {
    $query  .= ' LIMIT %d, %d';
    $offset = ( $page - 1 ) * $per_page;

    array_push( $query_values, $offset, $per_page );
  }

  $results = $wpdb->get_results( 
    $wpdb->prepare( $query, $query_values ),
    ARRAY_A
  );

  if( $wpdb->last_error )
    throw new WP_Error( 'wpse409692-db-error', $wpdb->last_error );

  return array_reduce(
    $results,
    function( $post_values, $result ) {
      $post_id    = $result[ 'post_id' ];
      $meta_value = maybe_unserialize( $result['meta_value'] );

      if( $single ) {
        $post_values[ $post_id ] = $meta_value;
      }
      else {
        if( !isset( $post_values[ $post_id ] ) )
          $post_values[ $post_id ] = [ $meta_value ];
        else
          $post_values[ $post_id ][] = $meta_value;
      }

      return $post_values;
    },
    []
  );
}

Użycie (pobierz pierwsze 100 par identyfikatora posta/meta-wartości):

$post_restriction_settings = wpse409692_get_meta_post_values( 'restriction_settings', true );

foreach( $post_restriction_settings as $post_id => $settings ) {
  // ...
}


Źródło

Warto przeczytać!  Jak wyświetlać reklamy tylko użytkownikom wyszukiwarki w WordPress