注册WP的自定义表格以在插件中使用

时间:2021-11-06 作者:Álvaro Franz

我正在尝试将自定义表处理程序添加到$wpdb.

public function __construct() {
    $this->register_tables();
}

public function register_tables() {
    global $wpdb;

    $wpdb->tables[] = \'my_new_tablename\';
}

public function testing() {
    global $wpdb;
    wp_die($wpdb->my_new_tablename);
}
但在运行testing() 方法,我意识到$wpdb->my_new_tablename 未定义。

如何注册自己的表名并在$wpdb->my_new_tablename, 就像它是本地WP表一样?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这不是$tables 变量does,andthere is no such thing as a registered custom table. 这些变量是内部API,不供插件/主题开发人员使用。这个$wpdb->mytable 模式本身就是一些人所做的事情,因为他们想避免在早期WordPress文章中流行的手动前缀。

您的代码无法正常工作的原因是,它在set_prefix/set_blog_id 方法由设置这些变量的核心调用。大多数人都是通过$wpdb->mytable = $wpdb->prefix . \'mytable\'; 这实际上是什么set_prefixset_blog_id 内部执行。

这些函数由调用wp_set_wpdb_vars 它被标记为私有、内部,不供插件或主题开发人员使用。它运行在wp-load.php 这意味着要使代码正常工作,需要将其移动到WordPress核心本身,并移动到加载过程的早期。

https://developer.wordpress.org/reference/functions/wp_set_wpdb_vars/


然而,你试图做的是不好的实践,不是一件好事。相反,请考虑以下选项之一:

返回带有前缀的表名的函数,该前缀是一个包装器对象,其方法如下insert/update/delete 将SQL查询抽象出来以简化代码,或定义一个常量或自定义post类型,我建议您选择选项1,因为您已经有了一个对象,$this->table$this->table_name() 更简单,更符合OOP。输入的字符更少。

一般来说,自定义帖子类型通常被认为是加速WordPress的一种可靠/快速的方法,但除非您知道如何仔细构造表并添加适当的索引,否则这并不能保证它会更快,实际上可能会慢得多。大多数速度的提高并不是因为使用了自定义表,而是因为post meta不再通过meta_query.

除非您需要与非WordPress数据库表/应用程序集成,或有特殊独特的数据存储要求,需要专业数据和查询(例如,按半径搜索地理数据、大型有向图),否则定制表在WP站点中很少是合适的,也很少是开发人员时间的最佳利用。

相关推荐

为什么我不能从$wpdb->Get var返回值?

我试图在满足条件时从表中删除记录。条件是:如果表1中有一条记录与表2中的记录不匹配,则从表1中删除该记录。$survey_mapping =$wpdb->get_results( $wpdb->prepare("SELECT surveyid from oc_partner_x_survey")); foreach($survey_mapping as $row){ $dup_survey2 =absint($wpdb->get_var(