Взаимодействие с базой данных в WordPress. Класс $wpdb.

Помню, когда я только начинал использовать WordPress, я подключался к базе данных напрямую, то есть коннектился через mysql_connect() и всё такое, ну и нубство 🙂

Итак, приступим.

Перед тем, как использовать любой из перечисленных ниже методов, необходимо глобализовать $wpdb.

global $wpdb;

Произвольный SQL-запрос

$wpdb->query('query');

Проще простого, ведь так? А теперь Пример 1:

$wpdb->query(
    "
    DELETE FROM $wpdb->posts 
    WHERE post_type = 'revision'
    "
);
// удаляем все ревизии постов

Пример 2.
используйте $wpdb->prepare, чтобы защититься от SQL-инъекций:

$id = 15; $key = "first_name"; $value = "Михаил";
 
$wpdb->query( $wpdb->prepare( 
    "
        INSERT INTO $wpdb->usermeta
        ( user_id, meta_key, meta_value )
        VALUES ( %d, %s, %s )
    ", 
    $id, 
    $key, 
    $value 
) );
// %s значит строка, %d - значит число
// добавляем имя пользователю с ID=15

Пример 3.
также в качестве второго параметра можно использовать и массив:

$wpdb->query( $wpdb->prepare( 
    "
        INSERT INTO $wpdb->usermeta
        ( user_id, meta_key, meta_value )
        VALUES ( %d, %s, %s )
    ",
    array(
        $id, 
        $key, 
        $value 
    )
) );

Обращение к таблицам MySQL, префикс таблиц

Обратиться к стандартным таблицам в базе WordPress очень легко — ведь для этого предназначены переменные класса:

  • $commentmeta
  • $comments
  • $links
  • $options
  • $postmeta
  • $posts
  • $terms
  • $term_relationships
  • $term_taxonomy
  • $usermeta
  • $users

Как это будет выглядеть на деле:

$wpdb->query("DELETE FROM $wpdb->posts WHERE id = '1'");

Ок, а как быть с таблицами плагинов, или теми, которые сами мы и создали?

$wpdb->query("DELETE FROM ".$wpdb->prefix."posts WHERE id='1'")

Как использовать SELECT?

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

1. get_results

Первый метод больше всего похож на обычный запрос SELECT.

$wpdb->get_results('query', output_type);
  • output_type — тип вывода данных
    • OBJECT — объект (по умолчанию),
    • OBJECT_K — ассоциативный массив, в котором в качестве ключей будут использоваться значения в первой колонке, дубликаты будут проигнорированы,
    • ARRAY_A — нумерованный массив состоящий из ассоциативных массивов, в качестве индексов которых будут использоваться названия колонок,
    • ARRAY_N — нумерованный двумерный массив;

Пример 1.
выводим заголовки всех опубликованных страниц:

$pages = $wpdb->get_results( 
    "
    SELECT post_title, post_content 
    FROM $wpdb->posts
    WHERE post_status = 'publish' 
    AND post_type = 'page'
    "
);
/* вытаскивает из базы данных заголовки и содержимое
всех опубликованных страниц */
if( $pages ) {
    foreach ( $pages as $page ) {
        echo $page->post_title;
    }
}
// выводим заголовки

Пример 2.
пример с использованием функции setup_postdata, то есть в итоге получается некий аналог WP_Query().

$pages = $wpdb->get_results( 
    "
    SELECT * 
    FROM $wpdb->posts
    WHERE post_status = 'publish' 
    AND post_type = 'page'
    "
);
if ( $pages ) {
    foreach ( $pages as $post ) {
        setup_postdata( $post );
        ?>
        <h1>
            <a href="<?php the_permalink(); ?>">
                <?php the_title(); ?>
            </a>
        </h1>
        <?php
    }
    else
    {
        ?>
        <h1>Ничего не найдено</h1>
        <?php
    }
}
/* В случае если на блоге есть опубликованные страницы,
выводим заголовок со ссылкой на саму страницу */

2. get_var

Переходим ко второму методу, get_var, в отличие от get_results, он позволяет вывести одно значение, причем это может быть сумма значений или количество строк.

$wpdb->get_var('query',column_offset,row_offset);
  • column_offset — (целое) номер по порядку нужной колонки (по умолчанию 0)
  • row_offset — (целое) номер по порядку нужного ряда (по умолчанию 0)

Пример первый.
выводим дату регистрации какого-то конкретного пользователя:

$date = $wpdb->get_var(
    "
    SELECT user_registered
    FROM $wpdb->users
    WHERE user_login = 'truemisha'
    "
);
echo $date;
/* узнаем и выводим дату регистрации пользователя
с логином truemisha */

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

$number_of_users = $wpdb->get_var(
        "SELECT COUNT(*) FROM $wpdb->users;"
);
echo "Всего на сайте зарегалось {$number_of_users} человек.";

Пример третий
подсчитаем сумму чего-нибудь из метаданных пользователя:

$amount = $wpdb->get_var( $wpdb->prepare( 
    "
        SELECT sum(meta_value) 
        FROM $wpdb->usermeta 
        WHERE meta_key = %s
    ", 
    $meta_key
) );
echo "Сумма равна {$amount}";

3. get_row

Получает значения только из одной строки, удовлетворяющей условию.

$wpdb->get_row('query', output_type, row_offset);
  • output_type — тип вывода данных,
    • OBJECT — объект (по умолчанию),
    • ARRAY_A — ассоциативный массив,
    • ARRAY_N — нумерованный массив;
  • row_offset — (целое) номер по порядку нужного ряда (по умолчанию 0)

Пример 1.
выводим заголовок поста с самым большим количеством комментариев:

$post = $wpdb->get_row(
    "
    SELECT post_title, post_content
    FROM $wpdb->posts
    WHERE post_status = 'publish'
    ORDER BY comment_count DESC LIMIT 0,1
    "
);
echo $post->title;

Пример 2.
используем для тех же целей ассоциативный массив:

$post = $wpdb->get_row(
    "
    SELECT post_title, post_content
    FROM $wpdb->posts
    WHERE post_status = 'publish'
    ORDER BY comment_count DESC LIMIT 0,1
    ",
    ARRAY_A
);
echo $post['title'];

4. get_col

Вывод данных только из одной колонки, в результате получаем одномерный объект.

$wpdb->get_col('query',column_offset);
  • column_offset — (целое) номер по порядку нужной колонки (по умолчанию 0)

Пример:
выводим заголовок самой первой опубликованной страницы:

$posts = $wpdb->get_col(
    "
    SELECT post_title
    FROM $wpdb->posts
    WHERE post_status = 'publish'
    AND post_type='page'
    "
);
echo $posts[0];

INSERT

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

$wpdb->insert( 
    $wpdb->prefix . 'usermeta', // указываем таблицу
    array( // 'название_колонки' => 'значение'
        'user_id' => 1,
        'meta_key' => 'first_name', 
        'meta_value' => 'Михаил' 
    ), 
    array( 
        '%d', // %d - значит число
        '%s', // %s - значит строка
        '%s'
    ) 
);
вставка строки в MySql таблицу INSERT

UPDATE

Предположим в прошлом примере мы всё-таки создали строку и сейчас хотим её обновить:

$wpdb->update( 
    $wpdb->prefix . 'usermeta', // указываем таблицу
    array('meta_value' => 'Миша'), // поменяем имя 
    array( // где 
        'user_id' => 1,
        'meta_key' => 'first_name'
    ), 
    array( '%s' ),
    array( // формат для &laquo;где&raquo;
        '%d',
        '%s'
    )
);
UPDADE - обновление строки в таблице MySql

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

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

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