Проверка существования таблицы в базе данных
Я прочитал WordPress Codex и Professional WordPress. Похоже, оба используют что-то вроде
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
для определения существования таблицы. Есть ли причина, почему не используется CREATE TABLE IF NOT EXISTS ( ... )
? Ведь это проверит и создаст таблицу за 1 запрос, разве это не лучше? Или я что-то упускаю?

Если вы используете "IF NOT EXISTS", то скрипт dbdelta не обновит вашу базу данных с изменениями (дельтами), появившимися после первоначального создания базы.
(предполагая, что вы хотите повторно использовать тот же SQL-скрипт)
По крайней мере... так я думаю

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не эксперт по WordPress, только администратор баз данных MySQL
Если вы хотите использовать другой запрос, попробуйте этот
SELECT COUNT(1) FROM information_schema.tables WHERE table_schema='dbname' AND table_name='tbname';
Он вернет 0 (если таблица не существует) или 1 (если таблица существует)

Кратко
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$tablename = 'myTable';
$main_sql_create = "CREATE TABLE $tablename";
maybe_create_table( $wpdb->prefix . $tablename, $main_sql_create );
WordPress теперь предоставляет функцию maybe_create_table
- см. https://developer.wordpress.org/reference/functions/maybe_create_table/
Перед вызовом этой функции необходимо вручную подключить файл upgrade.php
, иначе вы получите фатальную ошибку следующего вида:
PHP Fatal error: Uncaught Error: Call to undefined function maybe_create_table()

Понимаю, что это очень старый вопрос, но возможно кто-то найдет его полезным. Небольшой класс, который обрабатывает функции для новой БД, версии таблицы и создает ее, если она не существует.
class ACCESS_TBDB {
private $wpdb = null;
private $accessTable = 'table_prefix'; // просто название префикса вашей таблицы
private $accessTableVer = '1.0.7'; // версия таблицы
private $accessTableOptName = 'access_db_ver'; // название опции для версии БД
public function __construct()
{
global $wpdb;
//Мне не нравится вызывать global $wpdb в каждой функции класса
$this->wpdb = $wpdb;
$tablename = $this->accessTable;
//устанавливаем префикс нашей таблицы
$this->wpdb->access_table = $this->wpdb->prefix . $tablename;
// каждый раз проверяем, нужно ли создавать БД или нет
$this->checkAccessDatabase();
}
private function createDBSQL(){
// SQL для создания таблицы БД
$charset = $this->wpdb->get_charset_collate();
$sql = "
CREATE TABLE {$this->wpdb->access_table} (
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
name TINYTEXT,
type VARCHAR(10),
value SMALLINT DEFAULT 0 NOT NULL,
created_at DATETIME DEFAULT NULL,
PRIMARY KEY (id)
) $charset;
";
return $sql;
}
private function checkAccessDatabase(){
$version = $this->accessTableVer;
//обрабатываем версии БД
$db_version = get_option( $this->accessTableOptName , '0.0.0');
//Без этого мы получим ошибку в dbDelta и maybe_create_table
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$dbCreateSql = $this->createDBSQL();
// проверяем, нужно ли обновление БД
if (version_compare($version, $db_version, '>')) {
// если содержатся старые dev/legacy версии
if (version_compare($db_version, '1.0.0', '<')) {
$this->wpdb->query("DROP TABLE IF EXISTS {$this->wpdb->access_table};");
}
dbDelta($dbCreateSql);
update_option( $this->accessTableOptName , $version);
}else{
//https://developer.wordpress.org/reference/functions/maybe_create_table/
// просто проверяем существование БД на случай, если она была удалена по каким-то причинам... :)
$recreate = maybe_create_table( $this->wpdb->access_table, $dbCreateSql );
if(!$recreate){
update_option( $this->accessTableOptName , $version);
}
}
}
... другие функции ...
}

Используйте функцию get_var
из класса wpdb
с обработкой исключений:
try {
$wpdb->hide_errors();
$wpdb->get_var( 'SELECT COUNT(*) FROM ' . $wpdb->prefix . 'translator' );
$wpdb->show_errors();
} catch (Exception $e) {
error_log($e);
} finally {
translator_create_db();
}
Ссылка: Выбор переменной
