Делает запрос и получает данные одной колонки таблицы базы данных в виде массива.
Если запрос вернул больше чем одну колонку (столбец), то функция вернет только данные первого столбца. Можно указать отступ в параметре $column_offset, чтобы получить данные не первого столбца, а например второго: $column_offset = 1.
Если указать $query = null, то функция вернет указанную колонку из предыдущего запроса. Используя это свойство можно получить данные других колонок из уже сделанного запроса.
Возвращает
Массив. Индексный массив с данными запроса. Пустой массив, когда не удалось получить данные.
Использование
global $wpdb; $wpdb->get_col( $query, $x );
- $query(строка/null)
- Запрос который нужно выполнить. Можно установить этот параметр в значение null, тогда функция вернет результат последнего запроса.
По умолчанию: NULL (предыдущий запрос) - $x(число)
- Индекс колонки данные которой нужно вернуть.
По умолчанию: 0 (первая колонка)
Примеры
#1. Пример того как работает метод и что возвращает
Допустим у нас есть такой запрос на получение всех ревизий:
// укажем в запросе одно поле $revision_ids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_type = 'revision'" ); // укажем в запросе все поля $revision_ids = $wpdb->get_col( "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'" ); /* В обоих случаях вернется одинаковый массив. Когда указываются все поля, get_col получает только первое - это ID Array( [0] => 106 [1] => 101 [2] => 102 [3] => 103 ... ) */
#2 Использование без указания $query параметра
// сначала сделаем запрос $wpdb->query( "SELECT * FROM $wpdb->posts WHERE post_type = 'revision' LIMIT 10" ); // теперь получим данные этого запроса $revision_ids = $wpdb->get_col( null ); $revision_names = $wpdb->get_col( null, 5 ); // 5 - post_title /* Array ( [0] => 9949 [1] => 9957 [2] => 10125 [3] => 10154 [4] => 10221 [5] => 10235 [6] => 10319 [7] => 10496 [8] => 10532 [9] => 10568 ) Array ( [0] => wp_tempnam [1] => Шаблоны страницы для типов записей в WP 4.7 [2] => Политика конфиденциальности [3] => walker_nav_menu_start_el [4] => Вывод пагинации [5] => enter_title_here [6] => Smart Custom Fields - простой плагин метаполей [7] => register_post_type [8] => О сайте [9] => REST API в WordPress ) */
#3 NULL вместо пустой строки
Этот метод возвращает NULL в качестве значения поля, если в значении пустая строка (проверял на версии WP 5.1.1). Но если нам нужно получить оригинальные данные (пустую строку), можно использовать такую замену get_col():
$wpdb->query( "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'" ); $ids = wp_list_pluck( $wpdb->last_result, 'ID' );
#4 Выбор столбца из результатов запроса
Для этого примера представим, что у нас блог об автомобилях. Каждый пост описывает какой-либо автомобиль (например, Ford Mustang 1969 года). Для каждого поста предусмотрено по 3 произвольных поля: manufacturer (производитель), model(модель) и year(год выпуска). Этот пример выведет на экран заголовки постов, отфильтрованных по производителю (ford) и отсортированных по модели и году.
get_col здесь используется для того, чтобы получить массив ID всех записей, удовлетворяющих определенным критериям и отсортированных в нужном порядке. Затем через цикл foreach мы выводим заголовки по имеющимся у нас ID:
<?php $meta_key1 = 'model'; $meta_key2 = 'year'; $meta_key3 = 'manufacturer'; $meta_key3_value = 'Ford'; $postids = $wpdb->get_col($wpdb->prepare(" SELECT key3.post_id FROM $wpdb->postmeta key3 INNER JOIN $wpdb->postmeta key1 on key1.post_id = key3.post_id and key1.meta_key = %s INNER JOIN $wpdb->postmeta key2 on key2.post_id = key3.post_id and key2.meta_key = %s WHERE key3.meta_key = %s and key3.meta_value = %s ORDER BY key1.meta_value, key2.meta_value",$meta_key1, $meta_key2, $meta_key3, $meta_key3_value)); if ($postids) { echo 'List of ' . $meta_key3_value . '(s), sorted by ' . $meta_key1 . ', ' . $meta_key2; foreach( $postids as $id ){ $post = get_post(intval($id)); setup_postdata($post); ?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php } }
#5 Список постов которые имеют определенное произвольное поле (Color)
Но отсортированы они по значению другого произвольного поля (Display_Order).
$meta_key1 = 'Color'; $meta_key2 = 'Display_Order'; $postids = $wpdb->get_col($wpdb->prepare(" SELECT key1.post_id FROM $wpdb->postmeta key1 INNER JOIN $wpdb->postmeta key2 on key2.post_id = key1.post_id and key2.meta_key = %s WHERE key1.meta_key = %s ORDER BY key2.meta_value+(0) ASC", $meta_key2,$meta_key1)); if ($postids) { echo 'List of '. $meta_key1 . ' posts, sorted by ' . $meta_key2 ; foreach ($postids as $id) { $post=get_post(intval($id)); setup_postdata($post);?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php } }
Список изменений
public function get_col( $query = null, $x = 0 ) { if ( $this->check_current_query && $this->check_safe_collation( $query ) ) { $this->check_current_query = false; } if ( $query ) { $this->query( $query ); } $new_array = array(); // Extract the column values. if ( $this->last_result ) { for ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) { $new_array[ $i ] = $this->get_var( null, $x, $i ); } } return $new_array; }