Verifica dell'esistenza di una Tabella nel Database
Ho letto il codex di WordPress e WordPress professionale. Sembra che entrambi utilizzino qualcosa come
if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
per determinare se la tabella esiste. C'è qualche motivo per cui non viene utilizzato CREATE TABLE IF NOT EXISTS ( ... )
? Controllerà e creerà la tabella in una sola query, non sarebbe meglio? O mi sta sfuggendo qualcosa?
DICHIARAZIONE: Non sono un Guru di WordPress, solo un DBA MySQL
Se vuoi utilizzare una query diversa, prova questa
SELECT COUNT(1) FROM information_schema.tables WHERE table_schema='dbname' AND table_name='tbname';
Restituirà 0 (se la tabella non esiste) o 1 (se la tabella esiste)

TL;DR
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 ora fornisce la funzione maybe_create_table
- vedi https://developer.wordpress.org/reference/functions/maybe_create_table/
Prima di chiamare questa funzione è necessario includere manualmente il file upgrade.php
, altrimenti si otterrà un errore fatale come il seguente:
PHP Fatal error: Uncaught Error: Call to undefined function maybe_create_table()

Capisco che questa sia una domanda molto vecchia, ma forse qualcuno la troverà utile. Una piccola classe che gestisce le funzioni su un nuovo database, la versione della tabella e la crea se non esiste.
class ACCESS_TBDB {
private $wpdb = null;
private $accessTable = 'table_prefix'; // solo il nome del prefisso della tua tabella
private $accessTableVer = '1.0.7'; // versione della tabella
private $accessTableOptName = 'access_db_ver'; // nome dell'opzione per la versione del db
public function __construct()
{
global $wpdb;
//Non mi piace chiamare global $wpdb in ogni funzione della classe
$this->wpdb = $wpdb;
$tablename = $this->accessTable;
//imposta il prefisso della nostra tabella
$this->wpdb->access_table = $this->wpdb->prefix . $tablename;
// controlla ogni volta se il db deve essere creato o meno
$this->checkAccessDatabase();
}
private function createDBSQL(){
// crea il sql per la tabella del db
$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;
//gestisce le versioni del DB
$db_version = get_option( $this->accessTableOptName , '0.0.0');
//Senza questo otterremo un errore su dbDelta e maybe_create_table
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$dbCreateSql = $this->createDBSQL();
// controlla se forse il DB ha bisogno di un aggiornamento
if (version_compare($version, $db_version, '>')) {
// se contiene vecchie versioni di sviluppo/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/
// controlla semplicemente se il DB esiste nel caso sia stato cancellato per qualche motivo... :)
$recreate = maybe_create_table( $this->wpdb->access_table, $dbCreateSql );
if(!$recreate){
update_option( $this->accessTableOptName , $version);
}
}
}
... altre funzioni ...
}

Utilizza la funzione get_var
della classe wpdb
con gestione delle eccezioni:
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();
}
Riferimento: Seleziona una Variabile
