问题描述

对不起,如果这个问题是微不足道的。我刚刚开始在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。