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ć.
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 ) {
// ...
}