是否必须在定制表中使用$wpdb->前缀

时间:2015-05-31 作者:newbie

如果这个问题很琐碎,很抱歉。我刚刚开始在WordPress中开发插件。

在所有教程中,我都发现了这一点:在创建自定义表时,$wpdb->prefix 已使用。

示例:

$table_name = $wpdb->prefix . "liveshoutbox";
我的问题:

是否必须使用$wpdb->prefix? 如果不对自定义表使用前缀,会发生什么情况?

2 个回复
最合适的回答,由SO网友:sakibmoon 整理而成

它是强制性的,但没有强制执行。

考虑在同一数据库中设置两个Wordpress站点的情况。带前缀的一个wp_ 还有一个wp2_. 如果您在这两个带有前缀的站点中安装插件,那么您创建的表将wp_liveshoutbox 对于第一个站点和wp2_liveshoutbox 对于第二个站点。但如果省略前缀,两个站点将使用相同的名为liveshoutbox 整个事情都会破裂。

SO网友:paul

考虑以下因素:

您的插件用于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在不断变化。今天起作用的东西明天可能不起作用。这就是为什么会有API函数。Wordpress开发人员将确保公共API行为是一致的(否则他们会贬低函数)。如果你开始使用内部方法调用,因为这样做“更快”,它通常会回来咬你。软件中几乎没有真正的捷径——它们只是将所需的工作从现在转移到以后,就像你的信用卡“以后”通常要花更多的钱。

结束