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

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

示例:

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


我的问题:


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


#1 楼

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

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

评论


换句话说,它是强制性的。 :)

–稀有
2015年5月31日上午10:32

#2 楼

请考虑以下事项:

您的插件在wordpress网络上使用,该网络对每个站点使用不同的表前缀。您的插件可以在836个不同的站点上同时运行,所有站点都在同一数据库中。 wp_385677_liveshoutbox是一个非常合理的表名。

您的插件是由具有一定安全性概念的用户安装的,并且已更改了表前缀以阻止试图将select * from wp_users注入系统的机器人。即使他们发现了新的漏洞也无法使用。

采用诸如对表名进行硬编码之类的快捷方式是启动和运行产品的好方法,但不是发布产品的好方法。在很短的时间内,该插件上会出现一堆“无效”的评论,在最坏的情况下,您会破坏其他人的网站。

如果我有一个复杂的查询,但我不知道不想应付可以使用替换程序编写Q4312079q的麻烦。例如:

$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。在多站点安装中,“用户”将导致无效的表。那是因为它将db前缀附加到表上。但是,由于所有用户都是网络用户,因此多站点仅使用一个用户表。因此,如果查询涉及wp_users或wp_usermeta表,则必须分别使用$ wpdb-> users或$ wpdb-> usermeta。

– Butlerblog
19年1月29日在20:08