我在WordPress中有一个依赖外部数据库的自定义页面模板,它正在使用wpdb类来实现此目的。
这是我的代码:
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
</header><!-- .entry-header -->
<?php
class StudentsDatabase
{
private $db;
public function __construct() {
try {
$this->db = new wpdb(DB_USER, DB_PASSWORD, 'students_db', DB_HOST);
$this->db->show_errors();
} catch (Exception $e) {
echo $e->getMessage();
}
}
public function getStudentById($student_id)
{
return $this->db->get_results("SELECT * FROM `students` WHERE id=$student_id");
}
public function getSchoolByAreaCode($area_code)
{
return $this->db->get_results("SELECT * FROM `schools` WHERE area_code=$area_code;--");
}
}
$Students_DB = new StudentsDatabase();
$student_one = $Students_DB->getStudentById(1);
$school_one = $Students_DB->getSchoolByAreaCode(1);
?>
<div class="entry-content">
<?php
//do something with $student_one and $school_one ...
the_content();
?>
</div><!-- .entry-content -->
嗯,我想知道这是否是正确的方法。安全方面或任何“其他”方式实际上。
从页面模板本身进行外部数据库调用感觉有点粗略。我应该在某些外部文件上注册这些函数,然后只在模板中使用它们吗?
答案 0 :(得分:10)
我认为最干净&#34;清洁&#34;方法是实现一个插件,它将是您主题的API。当然,这取决于它是否仅仅是出于你自己的目的,因为Wordpress(到目前为止)缺少一个依赖管理器。
总结一下 - 在主题中使用这个API。
答案 1 :(得分:6)
将class
声明等放在主题的 functions.php 文件中。或者,更好的是,require_once
将它们放在那里,并将它们放在主题的assets
或includes
文件夹中。
-/theme/
-/includes/classes/class-studentsDatabase.php
-functions.php
在functions.php中
define('TEMPLATE_PATH', get_template_directory());
require_once(TEMPLATE_PATH . '/includes/classes/class-studentsDatabase.php');
您可以为整个主题实例化class
(es),也可以根据需要在模板页面上实例化。
就安全性而言,我会避免将需要安全的数据库连接放在一个将要发送到外部的主题中。
我不确定我是否遵循了您为此所做的事情,但如上所述,我会在主题环境之外处理这一点。
同样,不知道你的用例,主题可以利用外部api,而api可以是wordpress wp-json api在中心站点管理数据库连接。
这将允许主题GET
/ POST
到处理身份验证和任何CRUD的端点,并缓解许多潜在的安全问题。然后外部站点上的主题只是解析返回的json,并且除此之外不会有任何DB访问。
答案 2 :(得分:0)
在Wordpress中使用多个DB还有更激进的方法。如下所示来自wpdb Codex page:
$ wpdb对象可以与任意数量的表进行通信,但一次只能与一个数据库通信;默认情况下是WordPress数据库。在极少数情况下,您需要连接到另一个数据库,您需要使用自己的数据库连接信息从wpdb类中实例化您自己的对象。对于包含许多数据库的极其复杂的设置,请考虑使用hyperdb。
Hyperdb是一个插件,可以帮助处理多个数据库并取代您对代码组织的过度思考。