J'ai créé des tables supplémentaires pour un plugin que je développe et j'ai besoin d'ajouter des index à ces tables.
Quelle est la façon dont WordPress fait cela?
Utiliser dbDelta()
ne semble pas fonctionner et je ne vois aucune erreur dans les journaux.
Vous pouvez exécuter les instructions arbitraires SQL avec wpdb :: query () , y compris les instructions de définition de données, par exemple.
function
create_index ()
{
global $wpdb ;
$sql = "CREATE INDEX my_index ON {$wpdb->prefix}my_table (my_column)" ;
$wpdb->query ($sql) ;
return ;
}
Remarque: Étant donné que $wpdb->query()
peut exécuter arbitraire SQL, si l'instruction que vous lui transmettez contient une entréeTOUTE ENTRÉEutilisateur, vous devez utiliser wpdb :: prepare () pour se protéger contre les attaques par injection SQL.
Mais cela soulève la question: comment avez-vous créé vos tables spécifiques aux plugins? "Manuellement" ou par programme? Si par programme, n’avez-vous pas utilisé $wpdb->query()
? Si vous l'avez fait "manuellement", alors vous devriez vraiment créer les tables (et leurs index) lors de l'activation du plugin.
Voir l'excellente réponse à cette autre question WPSE pour savoir comment se connecter à l'activation de plug-ins (et/ou à la désactivation et à la désinstallation) pour créer des tables privées.
À l'aide de dbDelta, en plus d'une clé primaire, vous pouvez inclure la clé Word pour créer un index pour d'autres colonnes:
Vous devez utiliser la clé Word KEY plutôt que son synonyme INDEX et vous devez inclure au moins une clé.
Exemple de schema.php dans le noyau:
CREATE TABLE $wpdb->termmeta (
meta_id bigint(20) unsigned NOT NULL auto_increment,
term_id bigint(20) unsigned NOT NULL default '0',
meta_key varchar(255) default NULL,
meta_value longtext,
PRIMARY KEY (meta_id),
KEY term_id (term_id),
KEY meta_key (meta_key($max_index_length))
) $charset_collate;