Статьи

Расширенные запросы WordPress, часть 2

В последнем посте мы также рассмотрим базовую схему базы данных WordPress, запросы и как начать получать информацию из базы данных WordPress. Мы также взглянули на класс WordPress wpdb, который позволяет невероятно легко запускать запросы к базе данных. Если вы не читали последнюю статью, обязательно ознакомьтесь с ней, поскольку эта серия основана на ней.

В этом посте мы рассмотрим, как отслеживать любые ошибки, возникающие при выполнении наших запросов, и различные способы извлечения данных из базы данных WordPress.


Одна из самых неприятных вещей в программировании – это иметь дело с различными ошибками и предупреждениями, которые возникают при работе над нашими проектами. Но они неизбежное зло, верно? Они предупреждают нас о том, когда мы сделали что-то не так, чтобы наши пользователи не испытывали это.

Дело в том, что они не ограничиваются только кодом приложения, таким как PHP, или кодом на стороне клиента, таким как JavaScript. Базы данных также могут генерировать ошибки. Поскольку в настоящее время мы работаем с базами данных, имеет смысл включить ведение журнала SQL.

Благодаря объекту wpdb действительно легко переключаться между сообщениями об ошибках при работе с запросами к базе данных в WordPress.

Убедитесь, что вы объявили переменную wpdb как глобальную, а затем просто вызовите следующую функцию:

1
2
3
4
<?php
global $wpdb;
$wpdb->show_errors();
?>

Простой рабочий пример просмотра ошибки SQL генерируется следующим кодом. Добавьте это к любому из файлов PHP вашей темы (index.php или single.php будет легко), а затем загрузите страницу в браузере:

1
2
3
4
5
<?php
global $wpdb;
$wpdb->show_errors();
$result = $wpdb->get_results(‘SELECT * FROM $wpdb->post’);
?>

Полезно, не правда ли?

Если вы закончили разработку и тестирование и готовы к развертыванию, вы можете отключить создание отчетов об ошибках, вызвав hide_errors ().


Когда дело доходит до чтения данных из базы данных, можно вытянуть всю строку в массив, пройтись по массиву, пока не найдете нужное значение, а затем продолжить работу. Дело в том, что есть лучшие способы извлечения значений как с точки зрения ясности кода, так и производительности.

Чтобы извлечь одно значение, нет необходимости извлекать всю строку. Вместо этого вы хотите запросить только одно значение. WordPress API предоставляет функцию get_var () специально для этой цели.

Например, скажем, что вы хотите получить заголовок самого последнего сообщения. Для этого запрос должен будет отозвать одну запись, упорядоченную по самой последней дате.

1
2
3
4
5
<?php
global $wpdb;
$last_title = $wpdb->get_var(“SELECT post_title FROM $wpdb->posts WHERE post_status = ‘publish’ ORDER BY post_date DESC”);
echo $last_title;
?>

Полегче, а?

Ясно, что код показывает, что вы только пытаетесь получить определенную переменную (или значение), и вам не нужно тратить циклы на накладные расходы, циклически проходя по коллекции или извлекая больше информации, чем вам действительно нужно.


С другой стороны, скажем, что вы действительно хотите получить всю строку (также называемую записью) данных. Возможно, вы хотите сделать какой-то тип отображения всей информации, связанной с чем-то в базе данных, или вам нужно изучить несколько значений, связанных с одной записью.

Подобно функции get_var (), WordPress также предоставляет функцию get_row (), которая используется именно для этой цели: она извлекает одну строку данных и возвращает ее в одном из трех форматов – объект, ассоциативный массив или численно индексированный массив.

Для целей этого примера мы собираемся извлечь результаты в ассоциативный массив, где значение доступно путем отключения имени столбца.

В соответствии с нашим предыдущим примером, допустим, что мы хотим получить всю информацию, относящуюся к последнему сообщению. Обратите внимание, что мы добавляем ARRAY_A в качестве второго параметра – это контролирует, как возвращаются результаты:

1
2
3
4
<?php
global $wpdb;
$last_post = $wpdb->get_row(“SELECT * FROM $wpdb->posts WHERE post_status = ‘publish’ ORDER BY post_date DESC”, ARRAY_A);
?>

Отсюда мы можем распечатать определенные значения:

1
2
3
<?php
echo $last_post[‘post_title’];
?>

Распечатать весь массив:

1
<?php print_r($last_post);

Или даже просмотреть результаты:

1
2
3
4
5
<?php
foreach($last_post as $post) {
    echo $post;
}
?>

Выдвижение всей строки идеально, когда вам нужно получить несколько частей информации или всю информацию, связанную с одной строкой.


Конечно, иногда получение строки совсем не то, что мы ищем. Возможно, мы создаем страницу архивов и ищем простой способ вернуть все заголовки сообщений для данного блога.

В этом случае вы хотите получить весь столбец. Точно так же WordPress предоставляет функцию get_col () именно для этого.

Итак, как упомянуто выше, давайте попытаемся отбросить все фрагменты записей, существующие в системе:

1
2
3
4
<?php
global $wpdb;
$post_titles = $wpdb->get_col(“SELECT post_title FROM $wpdb->posts WHERE post_status = ‘publish’ ORDER BY post_date DESC”);
?>

Результаты возвращаются в числовом индексированном массиве, так что мы можем циклически просматривать или получать к ним доступ с помощью их числовых ключей:

1
<?php echo $post_titles[0];

Очевидно, что получение значений, строк и столбцов из базы данных WordPress не очень сложно; Однако бывают случаи, когда мы стремимся отбросить различные результаты. Кроме того, всегда будут времена, когда нам нужно перебирать информацию, чтобы отображать ее на экране.

Для этого WordPress предоставляет универсальную функцию get_results (), которая идеально подходит для этой ситуации. В частности, функция get_results () вернет массив, в котором каждая строка находится по индексу в массиве.

Предположим, что мы хотим отобразить заголовки и дату публикации для всех сообщений, которые в настоящее время запланированы для запуска, но на самом деле не опубликованы, а затем отобразить их информацию на экране:

1
2
3
4
5
6
7
8
9
<?php
global $wpdb;
$scheduled_posts = $wpdb->get_results(“SELECT post_title, post_date FROM $wpdb->posts WHERE post_status = ‘future’ ORDER BY post_date DESC”, ARRAY_A);
 
foreach($scheduled_posts as $post) {
    echo $post[‘post_title’];
    echo $post[‘post_date’];
}
?>

get_results () обеспечивает удивительную гибкость, особенно когда вы связываете его с выполнением более сложных запросов, таких как объединение с другими таблицами.


Наличие такого вида доступа и гибкости с базой данных WordPress действительно выводит разработку тем и плагинов на новый уровень. Взяв это и смешав его с пользовательскими типами записей, таксономиями и другими аспектами WordPress, можно создать действительно мощные инструменты.

Но мы не ограничены чтением данных. В следующем посте мы рассмотрим, как мы можем манипулировать данными, которые уже существуют в базе данных, и как мы можем вводить новые собственные значения.