W WordPressie jest mnóstwo funkcji, za pomocą których można coś wyciągnąć z bazy danych. Jeśli chcemy wyciągnąć z bazy wpisy, korzystamy z funkcji get_posts
. Jeśli chcemy wyciągnąć pole własne, korzystamy z funkcji get_post_meta
. Na podstawie parametrów tych funkcji WordPress buduje zapytanie SQL i wysyła je do bazy danych, po czym zwraca dane. Na ogół to wystarczy.
Bywają jednak sytuacje, gdy jakaś wtyczka tworzy nową tabelę w bazie danych i coś do tej tabeli zapisuje, a my chcemy z tych danych skorzystać. Albo trzeba wysłać do bazy danych bardziej skomplikowane zapytanie i trzeba by się nieźle nagimnastykować, żeby skorzystać z funkcji WordPressa. W obu przypadkach wygodne jest skonstruowanie własnego zapytania SQL.
Aby wykonać zapytanie SQL, należy skorzystać z globalnego obiektu $wpdb
. Za pomocą jego metod bardzo łatwo jest wyciągnąć wszystkie interesujące nas dane, pod warunkiem, że znamy podstawy SQL.
Przykład zastosowania obiektu $wpdb
:
function my_custom_function($number) {
global $wpdb;
$sql = "SELECT COUNT({$wpdb->prefix}postmeta.meta_value) as city_count, {$wpdb->prefix}postmeta.meta_value FROM {$wpdb->prefix}posts INNER JOIN {$wpdb->prefix}postmeta ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}postmeta.post_id WHERE {$wpdb->prefix}postmeta.meta_key='geolocation_city' AND {$wpdb->prefix}posts.post_type='job_listing' AND {$wpdb->prefix}posts.post_status='publish' GROUP BY {$wpdb->prefix}postmeta.meta_value ORDER BY city_count DESC LIMIT %d";
$sql = $wpdb->prepare($sql, $number);
$cities = $wpdb->get_results($sql , ARRAY_A);
foreach ($cities as $city) {
echo $city['meta_value'] . ': ' . $city['city_count'];
}
}
Metoda prepare
zapobiega atakowi SQL injection. Należy jej użyć, jeśli w zapytaniu korzystamy z danych pochodzących od użytkownika. Takim danym nigdy nie należy ufać.
Metoda get_results
zwraca wyniki zapytania. W przykładzie zwracana jest tablica tablic, którą można potem odczytać np. w pętli foreach
.
Inne metody klasy wpdb
, służące do pobierania danych:
get_var
: zwraca pojedynczą wartośćget_row
: zwraca pojedynczy wierszget_col
: zwraca pojedynczą kolumnę
Więcej informacji na temat klasy wpdb
znajdziesz tu: https://developer.wordpress.org/reference/classes/wpdb/.