Как взаимодействовать с базой данных WordPress

Хотя вы уже используете много функций в WordPress для связи с базой данных, есть простой и безопасный способ сделать это непосредственно, используя $wpdb класс. Построенный на большом классе ezS’L Джастином Винсентом, $wpdb позволяет адресовать запросы к любой таблице в вашей базе данных, а также помогает обрабатывать возвращенные данные.

Поскольку эта функциональность встроена в WordPress, нет необходимости открывать отдельное соединение базы данных (в этом случае вы будете дублировать код), и нет необходимости выполнять хаки, такие как изменение набора результатов после того, как он был запрошен.

Дальнейшее чтение на SmashingMag:

В этой статье я покажу вам, как начать работу с $wpdb классом, как получить данные из базы данных WordPress и как запустить более продвинутые запросы, которые обновляют или удаляют что-то в базе данных. Методы здесь удалит некоторые из ограничений, которые вы столкнетесь с такими функциями, как get_posts() и , что позволяет адаптировать wp_list_categories() запросы к вашим конкретным потребностям. Этот метод может также сделать ваш сайт более эффективным, получая только данные, которые вам нужны — не больше, не меньше.

wordpress database
$wpdbМодульизирует класс и автоматизирует множество задач, связанных с базами данных.

Начало работы

Если вы знаете, как работают MyS’L или похожие языки, то вы будете прямо дома с этим классом, и вам нужно будет иметь в виду лишь небольшое количество имен функций. Основное использование этого класса можно лучше всего понять на примере, поэтому давайте зададим вопрос о нашей базе данных для идентифицировать идентифицировать и названия четырех последних сообщений, заказанных подсчетом комментариев (в порядке убывания).

<?php
   $posts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,4")
?>

Как вы можете видеть, это основной запрос S’L, с некоторыми PHP обернутые вокруг него. $wpdbКласс содержит метод (метод — специальное название для функций, которые находятся внутри классов), названный, который не только получит ваши get_results() результаты, но и поместит их в удобный объект. Вы могли заметить, что вместо того, чтобы использовать wp_posts для названия таблицы, я $wpdb->posts использовал, который является помощником для доступа к основным таблицам WordPress. Подробнее о том, почему использовать их позже.

$resultsТеперь объект содержит данные в следующем формате:

Array
(
   [0] => stdClass Object
      (
         [ID] => 6
         [post_title] => The Male Angler Fish Gets Completely Screwed
      )

   [1] => stdClass Object
      (
         [ID] => 25
         [post_title] => 10 Truly Amazing Icon Sets From Germany
      )

   [2] => stdClass Object
      (
         [ID] => 37
         [post_title] => Elderberry Is Awesome
      )

   [3] => stdClass Object
      (
         [ID] => 60
         [post_title] => Gathering Resources and Inspiration With Evernote
      )

)

Получение результатов из базы данных

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

получить результаты()

Это функция, которую мы рассматривали ранее. Лучше всего, когда вам нужны двумерные данные (несколько строк и столбцов). Он преобразует данные в массив, содержащий отдельные объекты для каждой строки.

<?php
   $posts = $wpdb->get_results("SELECT ID, post_title FROM wp_posts WHERE post_status = 'future'
   AND post_type='post' ORDER BY post_date ASC LIMIT 0,4")

   // Echo the title of the first scheduled post
   echo $posts[0]->post_title;
?>

гетеряд

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

<?php
   $posts = $wpdb->get_row("SELECT ID, post_title FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,1")

   // Echo the title of the most commented post
   echo $posts->post_title;
?>

гетекол

Этот метод во многом такой get_row() же, как, но вместо захвата одной строки результатов, он получает одну колонку. Это полезно, если вы хотите получить идоты только 10 самых популярных сообщений. get_row()Например, он хранит ваши результаты в одномерном объекте.

<?php
   $posts = $wpdb->get_col("SELECT ID FROM wp_posts WHERE post_status = 'publish'
   AND post_type='post' ORDER BY comment_count DESC LIMIT 0,10")

   // Echo the ID of the 4th most commented post
   echo $posts[3]->ID;
?>

гетевар

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

<?php
   $email = $wpdb->get_var("SELECT user_email FROM wp_users WHERE user_login = 'danielpataki' ")

   // Echo the user's email address
   echo $email;
?>

Вставка в базу данных

Для выполнения вставки можно использовать метод вставки:

$wpdb->insert( $table, $data, $format);

Этот метод требует трех аргументов. В первом указывается название таблицы, в которую вы вставляете данные. Второй аргумент — это массив, содержащий столбцы и соответствующие значения в качестве пар значений ключевых значений. Третий параметр определяет тип данных ваших значений в том порядке, который вы дали им. Вот пример:

<?php
   $wpdb->insert($wpdb->usermeta, array("user_id" => 1, "meta_key" => "awesome_factor", "meta_value" => 10), array("%d", %s", "%d"));

   // Equivalent to:
   // INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES (1, "awesome_factor", 10);
?>

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

Определение формата является необязательным; все значения по умолчанию рассматриваются как строки, но включение этого в метод является хорошей практикой. Три значения, которые можно использовать, относятся %s к строкам, %d десятичным числам и %f поплавкам.

Обновление данных

К настоящему времени, вы не будете удивлены, услышав, что у нас также есть метод помощника для обновления наших данных — шокирующе, называется update() . Его использование напоминает то, что мы видели выше; но для where обработки положения нашего обновления, он нуждается в двух дополнительных параметров.

$wpdb->update( $table, $data, $where, $format = null, $where_format = null );

$tableЭти параметры и параметры должны быть вам $data $format знакомы; они такие же, как и раньше. Используя $where параметр, можно указать условия обновления. Это должен быть массив в виде пар столбцов. Если указать несколько параметров, то они будут соединены с AND логикой. $where_formatЭто так же, $format как: он определяет формат значений в $where параметре.

$wpdb->update( $wpdb->posts, array("post_title" => "Modified Post Title"), array("ID" => 5), array("%s"), array("%d") );

Другие запросы

В то время как помощники выше велики, иногда выполнение различных или более сложных запросов, чем помощники позволяют необходимо. Если вам нужно выполнить обновление со сложным where положением, содержащим несколько AND / OR логику, то вы не сможете использовать update() метод. Если вы хотите сделать что-то вроде удаления строки или установить набор символов соединения, то вам нужно будет использовать «общий» query() метод, который позволяет выполнить любой запрос.

$wpdb->query("DELETE FROM wp_usermeta WHERE meta_key = 'first_login' OR meta_key = 'security_key' ");

Защита и проверка

Я надеюсь, что я не должен сказать вам, как важно, чтобы убедиться, что ваши данные в безопасности, и что ваша база данных не может быть подделана! Проверка данных немного выходит за рамки этой статьи, но посмотрите на то, что WordPress Codex должен сказать о «Проверка данных» в какой-то момент.

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

Если вы используете query() метод или любую другую функцию, где вы пишете сырой S’L (например), get_var() вам нужно будет бежать вручную, используя prepare() метод.

$sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] );

Чтобы сделать это немного более удобоваримым, давайте переписать этот базовый формат немного.

$sql = $wpdb->prepare( "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value ) VALUES ( %d, %s, %d )", 3342, 'post_views', 2290 )
$wpdb->query($sql);

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

Класс переменные и другие методы

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

вставка()

Всякий раз, когда вы вставляете что-то в таблицу, вы, скорее всего, автоматически приравнительного ID там. Чтобы найти значение последней вставки, выполненной скриптом, можно $wpdb->insert_id использовать.

$sql = $wpdb->prepare( "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value ) VALUES ( %d, %s, %d )", 3342, 'post_views', 2290 )
   $wpdb->query($sql);

   $meta_id = $wpdb->insert_id;

num-rows()

Если вы выполнили запрос в скрипте, то эта переменная вернет количество результатов последнего запроса. Это отлично подходит для должности рассчитывает, комментарий рассчитывает и так далее.

Названия таблиц

Все имена основных таблиц хранятся в переменных, имена которых точно такие же, как их основной эквивалент таблицы. Название таблицы сообщений wp_posts (вероятно) будет храниться в $posts переменной, так что вы можете вывести его с помощью $wpdb->posts .

Мы используем это, потому что мы можем выбрать префикс для наших таблиц WordPress. В то время как большинство людей используют по wp умолчанию, некоторые пользователи хотят или нуждаются в пользовательском. Ради гибкости, эта приставка не жестко кодируется, так что если вы пишете плагин и использовать wp_postmeta в запросе, а не $wpdb->postmeta , ваш код не будет работать на некоторых веб-сайтах.

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

Обработка ошибок

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

$wpdb->show_errors();
   $wpdb->query("DELETE FROM wp_posts WHERE post_id = 554 ");

   // When run, because show_errors() is set, the error message will tell you that the "post_id" field is an unknown
   // field in this table (since the correct field is ID)

Строительство некоторых основных отслеживания с нашими новыми знаниями $wpdb

Если вы новичок во всем этом, вы, вероятно, получите то, что я собираюсь о, но может быть трудно реализовать. Итак, давайте возьмем пример простого WordPress отслеживания плагин, который я сделал для веб-сайта.

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

Структура нашего стола

Чтобы отслеживать клики и показы рекламы, я создал таблицу; Давайте назовем это «отслеживание». Эта таблица записывает действия пользователей в режиме реального времени. Каждое впечатление и щелчок записывается в свой собственный ряд в следующей структуре:

  • IDИдентификатор с автоматическим увеличением.
  • timeДата и время действия.
  • deal_idИдентификатор сделки, подключенной к действию (т.е. объявление, которое было нажата или просмотрено).
  • actionТип действия (т.е. нажмите кнопку или впечатление).
  • action_urlСтраница, на которой было инициировано действие.
  • user_idЕсли пользователь входит в систему, его идентификатор.
  • user_ipIP пользователя, используется для отсеивать любой непослушный бизнес.

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

Вставка данных в наши таблицы

Когда пользователь нажимает на объявление, оно обнаруживается, и необходимая нам информация отправляется в наш скрипт в виде $_POST массива со следующими данными:

Array
(
   [deal_id] => 643
   [action] => click
   [action_url] => http://thisiswhereitwasclicked.com/about/
   [user_id] => 223
   [user_ip] = 123.234.223.12
)

Затем мы можем вставить эти данные в базу данных с помощью нашего метода помощника, как это:

$wpdb->insert('tracking', array("deal_id" => 643, "action" => "click", "action_url" => "http://thisiswhereitwasclicked.com/about/",
"user_id" => 223, "user_ip" => "123.234.223.12"), array("%d", %s", "%s", "%d", "%s"));

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

Мы решили, что, поскольку нам не нужна статистика в режиме реального времени (ежедневная статистика достаточна), нет смысла проверять данные при каждой вставке. Данные агрегируются в новую таблицу каждый день около полуночи, с низким временем движения. Прежде чем агрегировать данные, мы заботимся, чтобы очистить его, вынимая дубликаты и так далее. Данные, конечно, бежали, прежде чем быть вставлены в таблицу, потому что мы используем функцию помощника; так что, мы в безопасности там.

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

Изъятие действий из иС, включенного в черный список

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

$sql = $wpdb->prepare("DELETE FROM tracking WHERE user_ip = %s ", '168.211.23.43');
   $wpdb->query($sql);

Вы, наверное, заметили, что я все еще избежать данных, хотя IP был получен из безопасного источника. Я хотел бы предложить избежать ваших данных ни на что. Прежде всего, правильные хакеры хороши в том, что они делают, потому что они отличные программисты и может перехитрить вас таким образом, что вы не думали бы. Кроме того, я лично сделал больше, чтобы повредить мои собственные веб-сайты, чем хакеры, так что я делаю эти вещи в качестве меры предосторожности против себя, а также.

Обновление итогов

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

$total = $wpdb->get_var("SELECT COUNT(ID) WHERE deal_id = 125 ");

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

$wpdb->update( $wpdb->postmeta, array("meta_value" => $total), array("ID" => 125), array("%d"), array("%d") );

   // note that this should be done with update_post_meta(), I just did it the way I did for example's sake

Заключительные мысли и советы

Я надеюсь, что вы получили лучшее понимание класса WordPress $wpdb и что вы сможете использовать его, чтобы сделать ваши проекты лучше. Чтобы завершить, вот несколько заключительных советов и приемов для эффективного использования этого класса.

  • Я призываю вас быть осторожными: с великой силой приходит большая ответственность. Убедитесь в том, чтобы избежать ваших данных и проверить его, потому что неправильное использование этого класса, вероятно, является основной причиной взломали веб-сайты!
  • Запрашивайте только необходимые данные. Если вы будете отображать только заголовок статьи, нет необходимости извлекать все данные из каждой строки. В этом случае, просто попросите название и ID: SELECT title, ID FROM wp_posts ORDER BY post_date DESC LIMIT 0,5 .
  • Хотя вы можете использовать query() метод для любого запроса, используя методы помощника insert (, и update get_row т.д.) лучше, если это возможно. Они более модульные и безопасные, потому что они избегают ваших данных автоматически.
  • Будьте осторожны при удалении записей из базы данных WordPress (или любой другой) базы данных. Когда WordPress удаляет комментарий, куча других действий также происходит: количество комментариев в wp_posts таблице должно быть сокращено на один, все данные в comment_meta таблице должны быть удалены, а также, и так далее. Убедитесь в том, чтобы очистить должным образом после себя, особенно при удалении вещей.
  • Посмотрите на все переменные класса и другие биты информации в официальной документации. Это поможет вам использовать класс в полной мере. Я также рекомендую взглянуть на класс ezS’L для общего использования в ваших не-WordPress проектов; Я использую его почти исключительно для всего, что я делаю.

Дальнейшее чтение

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: