web-dev-qa-db-fra.com

Est-il obligatoire d'utiliser $ wpdb-> prefix dans les tables personnalisées

Désolé si cette question est triviale. Je commence tout juste à développer des plugins dans WordPress.

J'ai trouvé ceci dans tous les tutoriels: lors de la création des tables personnalisées, $wpdb->prefix est utilisé.

Exemple:

$table_name = $wpdb->prefix . "liveshoutbox";

Ma question:

Est-il obligatoire d'utiliser $wpdb->prefix? Que se passe-t-il si je n'utilise pas de préfixe pour mes tables personnalisées?

15
newbie

C'est obligatoire, bien que ce ne soit pas appliqué.

Prenons le cas où deux sites Wordpress ont été configurés dans la même base de données. Un avec le préfixe wp_ et un autre avec wp2_. Si vous installez votre plug-in sur les deux sites avec le préfixe, les tables créées seront wp_liveshoutbox pour le premier site et wp2_liveshoutbox pour le deuxième site. Mais si vous omettez le préfixe, les deux sites utiliseront la même table nommée liveshoutbox et le tout sera brisé.

21
sakibmoon

Considérer ce qui suit:

Votre plugin est utilisé sur un réseau wordpress, qui utilise différents préfixes de table pour chaque site. Votre plugin pourrait fonctionner simultanément sur 836 sites différents, tous dans la même base de données. wp_385677_liveshoutbox est un nom de table parfaitement raisonnable.

Votre plugin est installé par un utilisateur qui a un concept de sécurité et qui a changé le préfixe de la table pour bloquer les robots qui essaient d’injecter select * from wp_users dans le système. Même s'ils trouvent une nouvelle vulnérabilité, cela ne fonctionnera pas.

Utiliser des raccourcis tels que les noms de table de codage en dur est un bon moyen de mettre en marche un produit, mais pas un bon moyen de le publier. dans très peu de temps, le plugin aura une pile de commentaires "ça ne marche pas", dans le pire des cas, vous allez casser le site de quelqu'un d'autre.

Si j'ai une requête complexe et que je ne veux pas m'occuper de la peine d'écrire 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ...., vous pouvez utiliser des remplaçants. Par exemple:

$query = 'select foo from %table% left join %meta% on %table%.ID = %meta%.meta_id ... ';

$change = array (
    '%table%' => $wpdb->prefix . '_mytable',
    '%meta%'  => $wpdb->prefix . '_mytablemeta'
    );


$sql = str_replace( array_keys( $change ), array_values( $change ), $query );

$results = $wpdb->get_results( $sql );

Wordpress change constamment. Ce qui "fonctionne" aujourd'hui peut ne pas fonctionner demain. C'est pourquoi il existe des fonctions API. Les développeurs de Wordpress s'assureront que le comportement de l'API publique est cohérent (ou déprécieront la fonction). Si vous commencez à utiliser des appels de méthode internes parce que c'est "plus rapide ainsi", il reviendra généralement vous mordre. Il existe très peu de véritables raccourcis dans les logiciels: ils déplacent simplement le travail requis de maintenant à plus tard, et comme votre carte de crédit "plus tard" coûte généralement plus cher.

4
paul