¿Es obligatorio usar $wpdb->prefix en tablas personalizadas?
Disculpen si esta pregunta es trivial. Estoy comenzando a desarrollar plugins en WordPress.
En todos los tutoriales encontré esto: al crear las tablas personalizadas, se usa $wpdb->prefix
.
Ejemplo:
$table_name = $wpdb->prefix . "liveshoutbox";
Mi pregunta:
¿Es obligatorio usar
$wpdb->prefix
? ¿Qué sucede si no uso el prefijo para mis tablas personalizadas?

Es obligatorio, aunque no se aplica estrictamente.
Considera el escenario en el que dos sitios WordPress están configurados en la misma base de datos. Uno con el prefijo wp_
y otro con wp2_
. Si instalas tu plugin en ambos sitios usando el prefijo, las tablas creadas serán wp_liveshoutbox
para el primer sitio y wp2_liveshoutbox
para el segundo sitio. Pero si omites el prefijo, ambos sitios usarán la misma tabla llamada liveshoutbox
y todo el sistema dejará de funcionar correctamente.

Considera lo siguiente:
Tu plugin se usa en una red de WordPress, que utiliza diferentes prefijos de tabla para cada sitio. Tu plugin podría estar ejecutándose simultáneamente en 836 sitios diferentes, todos en la misma base de datos. wp_385677_liveshoutbox
es un nombre de tabla perfectamente razonable.
Tu plugin es instalado por un usuario que tiene cierto concepto de seguridad y ha cambiado el prefijo de las tablas para bloquear bots que intentan inyectar select * from wp_users
en el sistema. Incluso si encuentran una nueva vulnerabilidad, no funcionará.
Tomar atajos como codificar nombres de tablas directamente es una buena manera de tener un producto funcionando rápidamente, pero no es una buena práctica para lanzarlo. En muy poco tiempo el plugin tendrá un montón de comentarios de "no funciona", y en el peor de los casos podrías dañar el sitio de alguien.
Si tengo una consulta compleja y no quiero lidiar con el dolor de escribir 'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....
puedes usar reemplazadores. Por ejemplo:
$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 cambio. Lo que "funciona" hoy puede no funcionar mañana. Por eso existen las funciones de la API. Los desarrolladores de WordPress se asegurarán de que el comportamiento de la API pública sea consistente (o marcarán la función como obsoleta). Si empiezas a usar llamadas a métodos internos porque es "más rápido así", generalmente te pasará factura. Hay muy pocos atajos reales en el desarrollo de software - simplemente trasladan el trabajo requerido de ahora para después, y como con tu tarjeta de crédito, "después" generalmente cuesta más.

Dado que esto menciona multisite, un elemento adicional a tener en cuenta que no vi en la respuesta es que usar $wpdb->prefix . "users"
resultará en una tabla inválida en una instalación multisite. Esto se debe a que añadirá el prefijo de la base de datos a la tabla. Sin embargo, multisite usa solo una tabla de usuarios, ya que todos los usuarios son usuarios de la red. Por lo tanto, si la consulta involucra las tablas wp_users o wp_usermeta, debes usar $wpdb->users
o $wpdb->usermeta
respectivamente.
