问题描述
对不起,如果这个问题是微不足道的。我刚刚开始在 WordPress 中开发插件。
在所有教程中,我发现这一点:在创建自定义表时,使用 $wpdb->prefix
。
例:
$table_name = $wpdb->prefix . "liveshoutbox";
我的问题:
Is it mandatory to use
$wpdb->prefix
? What happens If I don’t use prefix for my custom tables?
最佳解决方案
这不是强制性的,但您应该始终使用它,并应将其视为强制性的。
考虑两个 Wordpress 站点在同一个数据库中设置的情况。一个前缀为 wp_
,另一个与 wp2_
。如果您在两个具有前缀的站点中安装了插件,则您创建的数据库将是第一个站点的 wp_liveshoutbox
和第二个站点的 wp2_liveshoutbox
。但是如果您省略了前缀,那么这两个站点都将使用相同的名为 liveshoutbox
的数据库,整个事情将会分解。
次佳解决方案
考虑以下几点:
您的插件用于 Wordpress 网络,每个网站使用不同的表前缀。您的插件可以在 836 个不同的站点上同时运行,所有这些站点都在同一个数据库中。 wp_385677_liveshoutbox
是一个完全合理的表名。
您的插件由具有一些安全概念的用户安装,并将表前缀更改为阻止漫游器尝试将 select * from wp_users
注入系统。即使他们发现一个新的漏洞,它将无法正常工作。
使用硬编码表名称的快捷方式是让产品开始运行的好方法,但不是释放它的好方法。在很短的时间内,插件将有一堆 「不工作」 的意见,在最坏的情况下,你会打破别人的网站。
如果我有一个复杂的查询,我不想处理写'select foo from ' . $wpdb->prefix . '_mytable left join ' . $wpdb->prefix . '_mytablemeta on ' . $wpdb->prefix . '.ID = ' . $wpdb->prefix . '.meta_id ....
的痛苦,你可以使用替换。例如:
$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 不断变化今天”works” 今天可能不工作。这就是为什么有 API 函数。 WordPress 开发人员将确保公共 API 行为是一致的 (或者它们会贬值该功能) 。如果您开始使用内部方法调用,因为它的 「速度更快」,通常会回来咬你。软件中的真正快捷键很少 – 他们只需将所需的工作从现在开始转移到以后,像您的信用卡一样,”later” 的成本更高。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。