Как правильно вставить данные в пользовательскую таблицу через плагин

14 июл. 2016 г., 19:47:32
Просмотры: 41.2K
Голосов: 6

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

Вот как я реализовал это:

$connection = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
mysqli_query($connection, $query);

Проблема в том, что мне приходится объявлять эти переменные ($db_host, $db_user, $db_pass, $db_name) внутри исходного кода плагина.

Есть ли способ вставить данные в мои пользовательские таблицы с помощью WordPress API? Или есть способ получить эти переменные из внешнего файла, который я могу игнорировать в системе контроля версий?

2
Комментарии

ты пробовал использовать пользовательский тип записи вместо прямых SQL-запросов https://codex.wordpress.org/Function_Reference/register_post_type?

mmm mmm
14 июл. 2016 г. 19:50:55

Привет @mmm, к сожалению, пользовательский тип записи не подходит для моих нужд.

Breno Breno
14 июл. 2016 г. 20:13:25
Все ответы на вопрос 3
1
10

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


Проблема в том, что мне приходится объявлять эти переменные ($db_host, $db_user, $db_pass, $db_name) прямо в исходном коде плагина.

Все эти свойства уже определены в файле wp-config.php, который находится в корневой директории.

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

// подключаем конфигурационный файл для получения констант DB_*
$dirname = dirname(__FILE__);
$root = false !== mb_strpos( $dirname, 'wp-content' ) ? mb_substr( $dirname, 0, mb_strpos( $dirname, 'wp-content' ) ) : $dirname;
// если $root определён неправильно, укажите статический путь, например: $root = '/путь/к/корневой/директории'
// предполагаем, что константы уже готовы (WordPress настроен), получаем их
require_once( $root . "wp-config.php" );
echo var_dump(
    'Имя БД', DB_NAME,
    'Пользователь БД', DB_USER,
    'Пароль БД', DB_PASSWORD,
    'Хост БД', DB_HOST
);

Вот более правильное решение:

Загружаем WordPress

require( '/wp-blog-header.php' ); Укажите корректный путь к этому файлу!

Чтобы проверить успешность загрузки WordPress, выведите что-нибудь:

add_action("wp", function() { 
    echo sprintf( "Да! Я работаю с WordPress версии %s!\n", get_bloginfo("version") );
    exit("Я завершаю работу\n");
});

Используем API базы данных WordPress

Для вставки данных используйте метод wpdb::insert. Вот его синтаксис:

$wpdb->insert( $table, $data, $format ); и пример использования:

$wpdb->insert( 
    'messages', 
    array( 
        'PM_ID'     => (int) $pm_id,
        'sender'    => $current_user->ID,
        'recipient' => (int) $recipient,
        'message'   => "Привет!\n",
        'date'      => time()
    )
);
$record_id = $wpdb->insert_id;

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

Надеюсь, это поможет, хотя бы в том, чтобы избежать SQL-инъекций, используя $wpdb::insert или подготовленные выражения вместо прямых запросов.

15 июл. 2016 г. 00:04:58
Комментарии

Я делаю нечто подобное, создавая маршруты/эндпоинты в WP REST API и выполняя чтение/запись в базу данных с помощью методов, привязанных к маршрутам.

b_dubb b_dubb
19 мар. 2024 г. 16:23:05
0

Почему бы не изучить, как работает $wpdb. Посетите https://codex.wordpress.org/Class_Reference/wpdb

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

<?php
  global $wpdb;

  $wpdb->insert( 
    'table_name_here', 
    array( 
        'column1' => 'value1', 
        'column2' => 123 
    ), 
    array( 
        '%s', 
        '%d' 
    ) 
 );
?>

Посетите https://codex.wordpress.org/Creating_Tables_with_Plugins для получения дополнительной информации.

14 июл. 2016 г. 21:06:17
1
-1
<?php 
global $wpdb;
 $table="test_table";
$store_arr["name"]="test";
$store_arr["email"]="test@gmail.com";

$wpdb->insert( $table, $store_arr);
 ?> 
19 июл. 2016 г. 08:01:38
Комментарии

Пожалуйста, объясните, что делает этот код и почему он отвечает на вопрос. Ответы, содержащие только код, не приветствуются.

Tim Malone Tim Malone
19 июл. 2016 г. 08:19:54