Один из возможных подходов заключается в использовании одного из вспомогательных методов в классе WPDB для выполнения более точного мета-запроса. Однако использование некоторых из этих функций заключается в том, что вы обычно не получаете простой массив данных и обычно вынуждены делать ненужные ссылки на свойства объекта, даже если вы вызываете только один столбец или строку.
Конечно, не все функции одинаковы, и целенаправленное упоминание относится к методу WPDB , get_col
который возвращает простой плоский массив запрашиваемых данных, я специально упомяну это, потому что следующий пример вызовет этот метод ,
WordPress - WPDB Выбор столбца данных
$ wpdb-> get_col ()
Вот пример функции, которая запрашивает в базе данных все сообщения с выбранным типом сообщения, статусом сообщения и с определенным мета-ключом (или настраиваемым полем для менее технически мыслящих).
function get_meta_values( $key = '', $type = 'post', $status = 'publish' ) {
global $wpdb;
if( empty( $key ) )
return;
$r = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = %s
AND p.post_status = %s
AND p.post_type = %s
", $key, $status, $type ) );
return $r;
}
Так, например, если вы хотите выяснить, какие записи имеют мета-ключ рейтинга , для фильмов типа поста и хотите сохранить эту информацию в переменной, примером такого вызова будет:
$movie_ratings = get_meta_values( 'rating', 'movies' );
Если вы хотите сделать только вывод данных на экран, функция взрыва PHP может быстро разделить этот простой массив на строки данных.
// Print the meta values seperate by a line break
echo implode( '<br />', get_meta_values( 'YOURKEY' ));
Вы также можете использовать возвращенные данные, чтобы определить, сколько сообщений имеют эти мета значения, например, выполнив простой цикл по возвращаемым данным и создав массив значений.
$movie_ratings = get_meta_values( 'rating', 'movies' );
if( !empty( $movie_ratings ) ) {
$num_of_ratings = array();
foreach( $movie_ratings as $meta_value )
$num_of_ratings[$meta_value] = ( isset( $num_of_ratings[$meta_value] ) ) ? $num_of_ratings[$meta_value] + 1 : 1;
}
/*
Result:
Array(
[5] => 10
[9] => 2
)
// ie. there are 10 movie posts with a rating of 5 and 2 movie posts with a rating of 9.
*/
Эта логика может применяться к различным видам данных и расширяться для работы любым количеством различных способов. Поэтому я надеюсь, что мои примеры были полезны и достаточно просты для подражания.