Пишем wordpress плагин. Работа с БД.

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

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

  1. Первая часть.
  2. Вторая часть.

А в этой статье я рассмотрю механизм работы с базой данных в wordpress.
Все работа с БД в wordpress`е реализована через класс wpdb. В любом месте вашего скрипта вы можете обратиться к объекту этого класса $wpdb.

Методы

$wpdb имеет методы, достаточные для выполнения любой операции.
Например, чтобы выбрать все строки результата можно использовать метод

    $wpdb->get_results($sql, ARRAY_A);

где $sql – это текст запроса, а ARRAY_A – вид результата в котором вернутся строки.
В данном случае – ассоциативный массив.

А вообще типы могут быть следующими:

  1. OBJECT – каждый элемент массива будет объектом, а все поля из таблицы станут полями этого объекта
  2. ARRAY_A - уже сказал
  3. ARRAY_N – каждая строка будет нумерованным массивом. Обращаться к полям надо будет по числовому индексу

Сразу приведу пример:

<?php

function get_mycategories() {

    global $wpdb;

    $sql = 'SELECT tt.*, t.name AS name FROM '.$wpdb->term_taxonomy.' tt, '.$wpdb->terms.' t WHERE tt.taxonomy = "category" AND t.term_id = tt.term_id';
    $result = $wpdb->get_results($sql, ARRAY_A);

    ?>
    <div class="wrap">
    <ul>
    <? foreach ($result as $cat) { ?>
        <li><?php echo $cat['name'] ?> : <?php echo $cat['count'] ?></li>
    <? } ?>
    </ul>
    </div>
    <?
}

function get_mycategories_admin_menu(){
    add_options_page('My categories', 'My categories', 8, basename(__FILE__), 'get_mycategories');
}

add_action('admin_menu', 'get_mycategories_admin_menu');

?>

Этот плагин просто выводит список всех категорий и кол-во постов в них.
Выглядит это так:

Если не нужно делать выборку, а нужно просто выполнить запрос к БД, например DELETE, INSERT или UPDATE, то можно использовать метод

    $wpdb->query($sql);

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

    $wpdb->get_row($sql, type, offset);

Здесь $sql – текст запроса, type – тип возвращаемого значения (выше писал про это), а offset – номер строки результата от начала.

Если надо выбрать вообще только одно значение из всего результата, то используйте метод:

    $wpdb->get_var($sql, col_offset, row_offset);

С $sql понятно, col_offset – номер колонки результата, row_offset – номер строки.

Для обеспечения безопасности у класса $wpdb тоже есть метод:

    $safe_string = $wpdb->escape($unsafe_string);

Этот метод делает строку $unsafe_string безопасной для передачи в $sql-запрос. То есть если там есть всякие кавычки и т.д., из-за которых можно сделать sql-инъекцию, то он их экранирует. Желательно все данные которые вводит пользователь обрабатывать этим методом перед передачей его в $sql запрос.

Поля

Вы заметили что я в запросах выше вместо называния таблиц использовал поля класса $wpdb. Это не с проста :)
Имена всех стандартных таблиц wordpress находятся в полях класса $wpdb:

  • $wpdb->posts – таблица с постами
  • $wpdb->users – пользователи
  • $wpdb->comments – комментарии
  • $wpdb->links – линки
  • $wpdb->options – опции
  • $wpdb->postmeta – метаданные постов (поля title, meta_keys, meta_descr)
  • $wpdb->usermeta – дополнительные поля пользователей (nick, уровень доступа и т.д.)
  • $wpdb->terms – таблица термов (ну короче это такие сущности абстрактные :) )
  • $wpdb->term_taxonomy – таблица типов термов
  • $wpdb->term_relationships – таблица связей (посты-категории и т.д.)

Кроме этих полей, есть поле

    $wpdb->prefix

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

Создание своих таблиц

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

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

Прежде чем создавать таблицу, нужно придумать ей имя. Пусть она будет называться hello_world.

После добавления префикса оно станет таким

    $table_name = $wpdb->prefix.’hello_world’

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

    if($wpdb->get_var(”SHOW TABLES LIKE ‘$table_name’”) != $table_name)

А уже после этого создаем свою таблицу. Например, так:

<?
      $sql = "CREATE TABLE " . $table_name . " (
      id mediumint(9) NOT NULL AUTO_INCREMENT,
      name tinytext NOT NULL,
      UNIQUE KEY id (id)
    );"
;

      require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
      dbDelta($sql);
?>

Здесь после заполнения $sql подключается библиотека upgrade.php так как в ней хранится функция dbDelta().

Можно было и просто выполнить $sql запрос через метод $wpdb->query. Но.
Функция dbDelta может не просто создавать новую таблицу, но и делать апгрейд старой таблицы до новой, если она уже была создана.

Эта функция убирает лишние поля, изменяет старые поля на новые и просто добавляет новые поля. Другими словами, она делает из старой таблицы – новую, сохраняя данные старой.

В моем случае она просто создает таблицу, но все равно… для общего развития полезно про нее знать :)

Активация и инсталляция

Каждый раз при запуске плагина проверять, есть ли уже нужная таблица или ее надо создавать как-то криво. Поэтому, для плагинов wordpress`а принято это делать только на этапе активации плагина.

Делается это функцией

    register_activation_hook(__FILE__,’ myplugin_install ‘);

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

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

Мой плагин можете скачать здесь: Мои контакты.

В нем можете сохранять контактную информацию полезных комментаторов, например.
Удачи и до встречи! :)

Популярность: 7%

Читайте также:


 #  #  #  #  #  #  #  #  #  #

14 Ответов на “Пишем wordpress плагин. Работа с БД.”

  1. Юрий Изотов
    Июль 20th, 2008

    Уважаемый Автор, у Вас в стратье “Пишем wordpress плагин hello_world. Продолжение.” срезалось куда-то продолжение :)
    Неплохие статьи. :)

  2. novice
    Июль 20th, 2008

    Стараюсь рассмотреть все возможности wordpress`а :)

  3. +Отлично! То что искал (пишу свой плагин как раз не хватало этой инфы), ждем стают про перехват актионс в плагинах.

  4. novice
    Июль 23rd, 2008

    Про перехват action`ов можешь почитать здесь : http://i-novice.net/pishem-wordpress-plagin-hello_world/.
    Возможно, в одной из следующих статей попробую составить кое-какую подборку action`ов с их описаниями :)

  5. Doofy
    Август 22nd, 2008

    novice, у тебя во второй статье не отображается конец статьи, обрывается на словах “page_title – заголовок окна для вашего плагина (тоже что и поле”, я думаю многим было бы интересно прочитать до конца. Поправь пожалуйста.

  6. novice
    Август 22nd, 2008

    Хм. Спасибо, что сказал, а то бы так и было :) Исправил.

  7. Alex
    Сентябрь 23rd, 2008

    Отличные статьи!

    А как создавать посты в вордпрессе с помощью плагина?
    К примеру: сунул ссылку на XML, а плагин по этому хмл создал посты.

  8. novice
    Сентябрь 24th, 2008

    В зависимости от способа передачи xml-файла или кода в плагин. В общих чертах весь алгоритм будет состоять из 3 шагов:

    1. 1. Париснг xml и вытаскивание из него нужных полей поста (заголовок, текст, ключевые слова, теги и т.д.)
    2. 2. Добавление этих записей в таблицу постов
    3. 3. Добавление связи “пост-категория” в таблицу связей
  9. Alex
    Сентябрь 24th, 2008

    Вот именно таблица постов меня и интересует, как она устроена?

  10. novice
    Сентябрь 24th, 2008

    Установи локально wordpress. Посмотри таблицу wp_posts. Там все довольно просто. Побольше практики ;)

  11. Seocoder
    Ноябрь 1st, 2008

    А как пропинговать пост, если записать его только в базу?!

  12. novice
    Ноябрь 1st, 2008

    Интересный вопрос. Я не нашел этого в документации. Видимо надо рыться в исходниках. :)

  13. BUDDAx2
    Март 6th, 2009

    Автор, огромное спасибо вам за материал. Так просто изложено, что сразу все понятно. Хотелось бы продолжения. Было бы круто еще про аякс почитать как в плагин всунуть.

  14. т10
    Март 15th, 2009

    прочитал эту статью…. мне вот нужно вывести результаты запроса
    в файл с одной записью (single.php)

    SELECT SUBSTRING(`post_content`, INSTR(`post_content`, “Адрес”)+13, INSTR(`post_content`, “Телефон”)-INSTR(`post_content`, “Адрес”)-13) FROM `wp_posts` where `id`=28

    я так понял нужно использовать $wpdb->posts как его подредактировать?
    (я имею ввиду твой плагин) чтобы работало и выводило результат запроса в single.php в соответвии с полем ID
    Будь очень признателен..

Оставить комментарий


Объявления:
Телевизоры форум Купить телевизор телевизоры 7.