Est-il obligatoire d'utiliser le préfixe $ wpdb-> dans les tableaux personnalisés

16

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

Dans tous les tutoriels, j'ai trouvé ceci: lors de la création des tableaux personnalisés, $wpdb->prefixest 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 tableaux personnalisés?

débutant
la source

Réponses:

22

Il est obligatoire, bien qu'il ne soit pas appliqué.

Considérez le scénario lorsque deux sites Wordpress ont été configurés dans la même base de données. Un avec préfixe wp_et un autre avec wp2_. Si vous installez votre plugin dans les deux sites avec le préfixe, vos tables créées seront wp_liveshoutboxpour le premier site et wp2_liveshoutboxpour le deuxième site. Mais si vous omettez le préfixe, les deux sites utiliseront la même table nommée liveshoutboxet le tout se brisera.

sakibmoon
la source
12
En d'autres termes, c'est obligatoire . :)
Rarst
4

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_liveshoutboxest un nom de table parfaitement raisonnable.

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

Prendre des raccourcis comme les noms de table de codage en dur est un bon moyen de mettre un produit en service, mais pas un bon moyen de le publier. en très peu de temps, le plugin aura une pile de commentaires "ne fonctionne pas", dans le pire des cas, vous casserez le site de quelqu'un d'autre.

Si j'ai une requête complexe et que je ne veux pas faire face à la douleur de l'écriture, '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 est en constante évolution. Ce qui "fonctionne" aujourd'hui peut ne pas fonctionner demain. C'est pourquoi il existe des fonctions API. Les développeurs Wordpress s'assureront que le comportement de l'API publique est cohérent (ou ils déprécieront la fonction). Si vous commencez à utiliser des appels de méthode internes parce que c'est «plus rapide de cette façon», cela reviendra généralement vous mordre. Il existe très peu de vrais 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.

Paul
la source
Étant donné que cela mentionne multisite, un élément supplémentaire à noter que je n'ai pas vu dans la réponse est que l'utilisation $wpdb->prefix . "users"entraînera une table non valide dans une installation multisite. C'est parce qu'il apposera le préfixe db sur la table. Cependant, le multisite n'utilise qu'une seule table d'utilisateurs, car tous les utilisateurs sont des utilisateurs du réseau. Donc, si la requête implique les tables wp_users ou wp_usermeta, vous devez utiliser respectivement $wpdb->usersou $wpdb->usermeta.
butlerblog