在自定义表中是否必须使用$ wpdb-> prefix


16

抱歉,这个问题不重要。我刚刚开始在WordPress中开发插件。

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

例:

$table_name = $wpdb->prefix . "liveshoutbox";

我的问题:

是否必须使用$wpdb->prefix?如果我的自定义表不使用前缀会怎样?

Answers:


22

尽管不是强制性的,但它是强制性的。

考虑在同一数据库中设置了两个Wordpress站点的情况。一个带有前缀wp_,另一个带有wp2_。如果您在带有前缀的两个站点中都安装了插件,则创建的表将wp_liveshoutbox用于第一个站点和wp2_liveshoutbox第二个站点。但是,如果省略前缀,则两个站点都将使用相同的命名表liveshoutbox,并且整个过程将崩溃。


12
换句话说,它是强制性的。:)
拉斯特2015年

4

考虑以下:

您的插件在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行为是一致的(否则他们将贬低该功能)。如果您因为使用内部方法调用而开始使用内部方法,因为它会“更快”,它通常会再次咬住您。软件中真正的快捷键很少-它们只是将所需的工作从现在移到以后,并且像您的信用卡“以后”通常会花费更多。


既然提到了多站点,那么我在答案中没有看到的要注意的另外一个元素是,使用$wpdb->prefix . "users"将导致多站点安装中的表无效。那是因为它将db前缀附加到表上。但是,由于所有用户都是网络用户,因此多站点仅使用一个用户表。因此,如果查询涉及wp_users或wp_usermeta表,则必须分别使用$wpdb->users$wpdb->usermeta
butlerblog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.