本章内容:
?了解WordPress数据库
?学习数据库表的关系
?使用WordPress数据库类
?调试自定义查询
如今,几乎互联网上的每个网站都连接到存储该网站信息的数据库。WordPress也不例外,它的后台是MySQL数据库。这个数据库存储网站的所有数据,包括内容、用户、链接、元数据、设置等等。本章涵盖了如何存储数据,存储什么数据,以及如何在WordPress中使用这些数据来帮助你建立令人惊叹的网站。
数据库表
默认安装的WordPress包含11个数据库表。WordPress以轻量级而自豪,而数据库是轻量级的基础。在开发和设计WordPress时,数据库结构被设计得非常小,但允许无限的灵活性。要理解数据库模式,查看数据库关系图是有帮助的。
图6-1展示了WordPress标准安装过程中创建的数据库结构和表的概述。记住,插件和主题有能力创建自定义表。WordPress Multisite 还会创建额外的表,所以你的WordPress数据库可能包含更多的表,而不仅仅是默认的表。
当WordPress发布一个新的主要版本时,通常会对数据库进行一些更改。这些更改通常非常小,例如更改表字段数据类型或删除不再使用的字段。向后兼容性是WordPress开发社区的一个主要关注点,所以对数据库的任何更改都要经过严格的审查,很少会影响到正在运行的插件和主题。Codex有一个特点是一个非常彻底的数据库更新日志,你可以参考WordPress的新版本发布:http://codex.wordpress.org/Database_Description#Changelog
WordPress中的表格结构是非常一致的。数据库中的每个表都包含一个惟一的ID字段,它是表的主键。每个表还包含字段上的一个或多个索引,这提高了对数据执行查询时的数据检索速度。正如在第5章中所看到的,在一个主题中,每次遍历Loop都会生成至少一个(可能是几个)查询,以提取文章、页面及其相关的元数据或评论。
每个表中最重要的字段是惟一的ID字段。这个字段并不总是命名为ID,而是一个自动递增的字段,用于给表中的每条记录一个唯一的标识符。例如,当你第一次安装WordPress时,默认的文章标题是“Hello world!” 因为这是在wp_posts表中创建的第一个帖子,所以这个帖子的ID是1。每个帖子都有一个唯一的ID,可以用来加载特定的帖子信息,也可以作为数据库中其他表的连接字段。
表细节
目前已经为WordPress创建了11个数据库表。以下是这些表的列表和它们存储的数据的详细信息:
?wp_commentmeta -包含所有评论的元数据。
?wp_comments -包含WordPress内的所有评论。个人评论通过一个帖子ID链接回帖子。
?wp_links-包含所有通过链接管理器添加的链接。该表仍然存在,但是核心功能在WordPress 3.5中已弃用。欲了解更多信息,请访问http://codex.wordpress.org/Links_Manager。
?wp_options -存储设置界面下定义的所有网站选项。还存储插件选项,活动插件和主题,以及其他。
?wp_postmeta -包含所有post元数据(自定义字段)。
?wp_posts -包含所有类型的文章(默认和自定义的文章类型)、页面、多媒体和修订积累。在大多数情况下,这是数据库中最大的表。
?wp_terms -包含你的网站定义的所有分类术语,将它们的文本描述映射到术语编号,可以作为其他表格的唯一索引。
?wp_term_relationships—将分类法术语与内容连接起来,提供一个成员关系表。它将标签或类别名称等术语映射到引用它的页面或文章。
?wp_term_taxonomy—定义每个术语被分配到的分类。这个表允许使用相同名称的类别和标记,将它们放在不同的命名分类法中。
?wp_users -包含在你的网站中创建的所有用户(登录名,密码,e-mail)。
?wp_usermeta -包含用户的元数据(firstst /last name,昵称,用户级别等等)。
每个数据库表在WordPress中都有特定的用途。下一节将分解一些更常见的表,还有查看使用每个表的一些示例。
WordPress 内容表
要检索你网站的所有内容,你需要访问wp _ posts表。该表存储您的所有文章、页面、附件、修订等等。附件记录存储在该表中,但实际的附件不存储在该表中。它们以标准文件的形式物理存储在主机服务器上。下面的SQL查询是一个如何从数据库中提取你的所有帖子的例子,并且是默认的WordPress循环中的简短形式:
SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date DESC
这个查询从wp_posts中选择post类型为'post'的所有记录。post_type字段指定正在查看的post的类型。要返回所有页面,只需将该值更改为'page'。在这个例子中,你想要发布的文章,所以确保post _ status设置为'publish'。还将按post _ date降序排列表记录,因此的文章将按反时间顺序显示。查询数据和可用的工具将在本章的后面讨论。
让我们来看看wp_posts表中一些更有用的字段。你已经知道你的ID字段包含你的文章的唯一ID。post_author字段是文章作者的唯一ID。你可以使用它从wp_users表中检索作者指定的数据。post_date是文章创建的日期。post_content字段存储文章或页面的主要内容,post_title是内容的标题。
一个非常重要的字段是post - status字段。目前,在WordPress中定义了八种不同的发帖状态:
?publish——已发布的帖子或页面。
?inherit—修改后的内容。
?pending -等待管理员或编辑审核的帖子。
?private——私有的帖子。
?future -计划在未来的日期和时间发布的帖子。
?draft——一篇尚未发表的正在创作中的帖子。
?auto-draft——当你编辑的时候WordPress会自动保存的一篇文章。
?trash——内容在垃圾桶里,仍然可以被回收。
当贡献者角色被用来限制其帖子发布或编辑现有内容的能力时,帖子状态就起作用了。和WordPress中的几乎所有东西一样,自定义发布状态可以通过插件和主题创建。
注:user 角色的使用将在第12章讨论,角色对内容管理工作流程的影响将在第15章讨论
post_type也存储在wp_posts表中。这个值区分了不同类型的内容:文章、页面、修订、菜单和附件。自从WordPress 2.9发布以来,可以创建自定义文章类型,这为在WordPress中定义自定义内容打开了无限可能的大门。
wp_users表包含注册成员帐户数据。同样你将看到ID字段,该字段代表用户记录的惟一标识符。其中user_login为用户的用户名。用户登录WordPress时必须输入。user_ pass字段包含加密后的用户密码。注册用户的电子邮件存储在user_email字段中。user_url字段包含成员的网站,用户的注册日期保存在user_ registered中。
接下来将探索wp_comments表。该表存储网站的所有评论、pingback和trackback。在查看注释记录时,您会注意到ID字段名为comment_ID。即使这个字段没有命名为ID,它仍然是表中此记录的唯一标识符。comment_post_ID是添加的文章评论唯一ID。记住,默认情况下,你不需要登录就能在WordPress上发表评论。因此,您将看到与用户表中类似的字段。
comment _ author字段存储注释者的名称。如果评论是pingback或trackback,它将包含发送ping的文章的名称。comment_author_email包含了评论者的电子邮件地址,他或她的网站存储在comment_author_url中。另一个重要的字段是comment_date,这是评论创建的日期。此字段用于按正确的顺序显示您的文章评论。
WordPress分类表
术语、关系和分类法被分解成三个不同的表,以允许在类别、标签、自定义分类法中的项目和帖子之间有多到一的关系。这些关系是有层次的、多重价值的。
虽然可以为wp_posts表中的每一行添加标记数组或类别标识符,但这种方法将限制每个帖子显式描述关系的数量,同时也因为分配给标签或没有分配内容类别而浪费空间。
如果你创建一个名为“恐怖故事”的类别,并在该类别中放置四篇文章,所有三个与分类法相关的表格都会被更新:
wp_terms表中的一行定义了“恐怖故事”和其slug或者是在url中使用的diminutive格式。此关系将获得一个惟一标识符(键),用于将术语匹配到其他表。
wp_term_taxonom表中的一行将“恐怖故事”映射到“类别”分类。这种映射关系将获得一个唯一的键,表示“category”中的“恐怖故事”组合。如果还创建了自定义分类法,并且在其中有一个“可怕的故事”条目,那么在wp_term_taxonom表中就会有对应该映射的另一行,以及它的惟一键。
wp_term_relationships表中的四行将“类别中的恐怖故事”标识符映射类别中每一篇文章的post标识符。
处理分类法表的主要操作符是SQL JOIN,有时将两个(或更多)表的称为“产品”。JOIN构建临时表,将一个表中的每一行映射到第二个和后续表中的每一行;然后JOIN操作的WHERE部分选择每一行中特定字段匹配的行。要找到“恐怖故事”类别中的所有文章,WordPress首先找到这个术语和分类对的标识符,选择
从wp_term_relationships表中适当的行,然后对wp_posts和从relationships表中选择的行进行JOIN:最后一个JOIN是SQL- ese,用于“提取此列表中具有标识符的所有posts”,其中列表是动态计算的。
图6-2显示了WordPress中wp _ posts表和分类taxonomy表之间的连接。
虽然这使得选择SQL内容关联到一个特定的标签或类别更复杂,因为要求使用一个多表连接操作来实现“名字和分类关系”匹配,不过允许丰富和多种有价值的描述,类别,分类,标记名具有独立的名称空间这就是WordPress 强大的之处。
WORDPRESS数据库类
WordPress提供了一个带有方法函数的对象类,可以直接使用数据库。这个数据库类叫做wpdb,位于wp‐includes/wp‐db.php中。任何时候在PHP代码中查询WordPress数据库,都应该使用wpdb类。使用这个类的主要原因是它允许WordPress以最安全的方式执行查询。
简单数据库查询
在使用wpdb类时,必须首先将$wpdb定义为全局变量,然后才能使用它。要做到这一点,只需将这行代码直接放在$wpdb函数调用的前面:
global $wpdb;
wpdb类中最重要的函数之一是prepare()函数。这个函数用于转义传递给SQL查询的变量。这是防止网站遭受SQL注入攻击的关键步骤。
注意:所有查询在执行之前都应该通过prepare()函数传递。prepare()函数接受至少两个参数:
$wpdb->prepare( $query, $value1 );
$query参数是要运行的数据库查询。$value1参数是要在查询中替换的第一个值。可以根据需要添加额外的值参数。让我们来看一个例子:
<?php
global $wpdb;$field_key = "address";
$field_value = "1428 Elm St";
$wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->my_custom_table( id, field_key, field_value ) VALUES ( %d, %s, %s )", 1,$field_key, $field_value ) );
?>
这个例子将数据添加到你之前创建的非默认的自定义表格中。当使用prepare()时,请确保将查询中的任何变量替换为%s(字符串)、%d(整数)和%f(浮点数)。
然后按照完全相同的顺序将变量作为prepare()函数的参数列出。在上面的例子中,%d表示1,%s表示$field_key,第二个%s表示$ field_value。本节中的示例都使用prepare()函数,这突出了它在处理数据库查询时的重要性。
注意,这个例子使用$wpdb‐>my_custom_table来引用WordPress中的表格。如果wp_是表前缀,则转换为wp_my_custom_table。这是在使用WordPress数据库中的表时确定正确的表前缀的正确方法。
安装WordPress时,可以设置自定义的数据库表前缀。默认情况下,这是wp_,但出于安全目的,许多人选择更改这个前缀。使用$wpdb-> 对于任何WordPress安装来说,确定这个表前缀是什么,是很正确的方法。
wpdb query()方法用于执行一个简单的查询。该函数主要用于SELECT语句。不管它的名字是什么,它不仅用于SQL SELECT查询,还可以对数据库执行任何SQL语句。下面是一个基本的查询函数示例:
<?php
global $wpdb;$wpdb->query( $wpdb->prepare( " DELETE FROM $wpdb->my_custom_table WHERE
id = %d AND field_key = %d ", 1, 'address' ) );
?>
如你所见使用wpdb类query()函数执行查询,删除ID为1的字段“address”。虽然query()函数允许在WordPress数据库上执行任何SQL查询,但其他数据库对象类函数更适合于SELECT查询。例如,get_ var()函数用于从数据库中检索单个变量:
<?php
global $wpdb;$comment_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*)FROM $wpdb->commentsWHERE comment_approved = %d;", 1 ) );
echo '<p>Total comments: ' . $comment_count . '</p>';
?>
这个例子检索WordPress中所有被批准的评论的数量并显示总数。尽管只返回一个标量变量,但会缓存查询的整个结果集。最好尝试使用WHERE子句来限制查询返回的结果集,只检索实际需要的记录。在本例中,返回所有注释记录行,即使显示注释的总数。这在大型网站上是一个巨大的内存冲击。
复杂数据库操作
要检索整个表行,需要使用get_ row()函数。函数可以以对象、关联数组或数字索引数组的形式返回行数据。默认情况下,行作为一个对象返回,在这种情况下是每个post数据的实例。这里有一个例子:
<?php
global $wpdb;
$thepost = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", 1 ) );
echo $thepost->post_title;
?>
这将检索post ID 1的整个行数据并显示post标题。$thepost对象的属性是你查询的表的列名,在这个例子中是wp_posts。为了以数组的形式检索结果,你可以向get_row()函数发送一个额外的参数:
<?php
global $wpdb;
$thepost = $wpdb->get_row( $wpdb->prepare( "SELECT* FROM $wpdb->posts WHERE ID = %d", 1 ), ARRAY_print_r ( $thepost );
?>
通过使用get_ row()中的ARRAY_A参数,post数据将作为一个关联数组返回。或者可以使用array_ N参数返回发布数据在一个数字索引数组。
标准的SELECT查询应该使用get_results()函数从数据库检索多行数据。下面的函数以数组的形式返回SQL结果数据:
<?php
global $wpdb;
$liveposts = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_titleFROM $wpdb->posts WHERE post_status = %d ", 'publish' ) );foreach ( $liveposts as $livepost ) {
echo '<p>' .$livepost->post_title. '</p>';
}?
>
上面的示例是在WordPress中查询所有已发布的文章并显示文章标题。查询结果以数组的形式返回并存储在$liveposts中,然后可以通过该数组进行循环以显示查询值。WordPress数据库类还具有用于UPDATE、INSERT和DELETE语句的特定函数。这三个函数消除了自定义SQL查询的需求,因为WordPress将根据传入函数的值为你创建它们。下面是insert()函数的结构:
$wpdb->insert( $table, $data, $format );
$table变量是想要插入值的表的名称。$data变量是一个字段名和要插入到这些字段名中的数据的数组。最后一个参数是$format,它定义了一个要映射到$data中的每个值的格式数组。例如,如果你想在post元表中插入数据,你可以这样执行:
<?php
global $wpdb;$wpdb->insert($wpdb->postmeta,array('post_id' => '1','meta_key' => 'address','meta_value' => '1428 Elm St.'),array('%d','%s','%s')
);
?>
在这个例子中,执行insert()函数,通过数组传入三个变量。注意如何设置post _id、meta_key和meta _value作为要插入的三个字段。你可以将要插入的表中的任何可用字段和数据传递到该字段中。最后一个值是格式化数组,它的工作方式与我们在本章前面讨论的prepare()函数格式化非常相似。该数组包含插入到数据库中的三个值的格式。
update()函数的工作原理与insert()函数非常相似,除了还需要设置$where子句和$where_ format变量,以便WordPress知道哪些记录需要更新以及如何格式化:
$wpdb->update( $table, $data, $where, $format, $where_format );
$where变量是SQL where子句的字段名和数据数组。这通常设置为正在更新的字段的惟一ID,但也可以包含表中的其他字段名。
<?php
global $wpdb;$wpdb->update($wpdb->postmeta,array('meta_value' => '333 Wonderview Ave'),array('post_id' => '1','meta_key' => 'address'),array('%s'),array('%d','%s')
);
?>
$where变量是SQL where子句的字段名和数据数组。这通常设置为正在更新的字段的惟一ID,但也可以包含表中的其他字段名。
delete()函数的作用是:删除WordPress数据库表中的数据。这个函数的结构类似于前面两个函数,如下所示:
$wpdb->delete( $table, $where, $where_format );
$where参数设置查询中的where子句,该子句决定要删除哪些数据。$where_format参数用于设置传递给函数的值的格式。让我们删除你在前面的例子中创建的post地址元数据:
$wpdb->delete($wpdb->postmeta,array('post_id' => '1','meta_key' => 'address'),array('%d','%s')
);
当你删除数据时,在虚拟数据上彻底测试你的代码来验证它是否如预期的那样工作是非常重要的。在真实生产网站上运行未经测试的代码可能会带来灾难性的结果。
上面介绍的insert()、update()和delete()函数不需要用prepare()函数包装。这些函数在连接传递给它们的值的查询之后实际上使用了prepare()函数。这比在WordPress中手动创建INSERT、UPDATE和DELETE查询要简单得多。
处理错误
每当处理查询时,看到错误消息都是件好事。默认情况下,如果自定义查询失败,则不会返回任何内容,因此很难确定查询出现了什么问题。wpdb类提供了向页面显示MySQL错误的函数。下面是使用这些函数的例子:
<?php
$wpdb->show_errors();
$liveposts = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_titleFROM $wpdb->posts_FAKE WHERE post_status = 'publish'") );
$wpdb->print_error();
?>
在执行查询之前必须直接调用show_errors()函数。在执行查询之后,必须直接调用print_error()函数。如果SQL语句中有任何错误,则会显示错误消息。你也可以调用$wpdb‐->hide_errors()函数来隐藏所有MySQL错误,或者调用$wpdb‐>flush()函数来删除缓存的查询结果。
数据库类包含额外的变量来存储关于WordPress查询的信息。下面是一些比较常见的变量列表:
var_dump($wpdb->num_queries);//运行查询的总数
var_dump($wpdb->num_rows);//最后一个查询返回的行数
var_dump($wpdb->last_result);//最近的查询结果
var_dump($wpdb->last_query);//最近执行的查询
var_dump($wpdb->col_info);//最近查询的列信息
在执行查询后直接添加上述代码以查看结果。这在确定为什么数据库查询不能按预期工作时非常有用。另一个非常强大的数据库变量是$queries变量。它存储了WordPress运行的所有查询。要启用该变量,必须首先在wp-config.php文件中将常量SAVEQUERIES设置为true。这告诉WordPress将每个页面加载时执行的所有查询存储在$queries变量中。首先在你的wp-config.php文件中删除这行代码:
define( 'SAVEQUERIES', true );
现在,所有查询都将存储在$queries变量中。你可以像这样显示所有的查询信息:
var_dump( $wpdb->queries );//显示页面加载期间执行的所有查询
当排除缓慢的加载时间故障时,这特别方便。如果一个插件执行了大量的查询,这会大大降低WordPress的加载速度。记住在查看完查询后禁用SAVEQUERIES常量选项,因为存储所有查询也会减慢加载时间。
正如你在开发插件或构建更复杂的Loop时所看到的那样当直接使用WordPress数据库时,数据库查询类是一个重要的资产。前面提到的所有数据库类函数都使用特定的转义技术来验证查询是以尽可能安全的方式执行。借用Randall Munroe的“Little Bobby Tables”xkcd joke(xkcd #327),你不希望用户手工制作一个包含DROP Tables的输入项,作为恶意SQL注入从而导致WordPress数据库表丢失。查询准备和转义函数确保输入不会变成SQL函数,无论它们的设置多么巧妙。你必须遵循以下方法来查询数据,以确保你的网站是最有效的,并尽可能使用最安全的技术。
直接数据库操作
有些时候,你可能想直接使用WordPress数据库数据。这可以包括访问插件或主题创建的自定义数据库表。为此需要使用SQL语句从MySQL数据库查询数据。请记住,WordPress api提供了对所有WordPress表的访问,并且你只是偶尔需要访问直接的表。本章中的所有示例查询都使用wp _前缀来表示表,但是你安装WordPress时,数据库表可能使用与wp-config.php文件中定义的不同前缀。
直接使用WordPress数据库最常见的方法之一是使用phpMyAdmin。如第三章所述,phpMyAdmin是大多数托管公司提供的免费软件工具,通过web界面管理MySQL数据库。本节中的大多数示例都涉及到与MySQL的直接交互,将需要使用SQL命令行来执行它们。使用phpMyAdmin的默认数据库视图如图6-3所示。
要在phpMyAdmin中运行SQL语句,只需单击顶部的SQL选项卡。在这里你可以对你的WordPress数据库执行任何查询。我们总是建议在将查询转移到PHP脚本之前,先在phpMyAdmin中直接创建查询。这背后的原因是直接在phpMyAdmin中调试SQL语句比在WordPress中使用PHP代码要快得多。一旦完善了查询,就可以在PHP代码中使用它,并且可以确信结果将如预期的那样。在下面的示例中,将使用原始SQL查询。请记住,如果想在主题或插件中运行这些查询,需要将查询包装在WordPress数据库类中。
最常被访问的表之一是wp_posts表。该表存储所有的文章、页面、自定义文章类型、修订,甚至附件记录。不同类型的内容由post_type字段定义。WordPress 2.9为开发者引入了定义自定义文章类型的能力,这将在第7章中详细讨论。这意味着在这个字段中可能存在额外的post _ type值。要查看数据库中的所有后期版本,可以运行以下查询:
SELECT * FROM wp_posts
WHERE post_type = 'revision'
这将返回wp_贴子中所有修订贴子类型的记录。你可以修改前面的查询来查看所有已经上传到WordPress上的文章附件:
SELECT guid, wp_posts.* FROM wp_posts
WHERE post_type = 'attachment'
本例将字段guid作为查询中返回的第一个值。guid字段包含服务器上附件文件的完整URL。wp_option表包含为你的WordPress安装保存的所有设置。保存在该表中的选项以option_name和option_value保存。因此调用的实际字段名称将始终是这两个名称,而不是基于选项值的特定字段。以下是本表中两个极为重要的记录:
SELECT * FROM wp_options
WHERE option_name IN ( 'siteurl','home' )
这个查询返回两条记录,一条是option_name是home,另一条是option_name是siteurl。这两个设置告诉WordPress你的网站的域名是什么。如果你需要改变你的网站的域名,你可以运行一个查询来更新这两个值,像这样:
UPDATE wp_options
SET option_value = 'http://yournewdomain.com'
WHERE option_name IN ('siteurl','home')
一旦这个查询运行,你的网站将立即运行在新的域名下。记住,这只是在WordPress中更新网站的域名。文章和页面中的附件url也需要更新以指向新域。插件也可以存储域信息,所以在更新产品网站之前,请确保在开发环境中进行测试。如果访问旧域,将被重定向到新域。如果已登录cookie和会话将无效,用户将不得不再次登录。一个值得推崇的技术是在子域名(例如http://new.example.com)下创建一个新网站,并将url更新到网站。
wp_options表包含其他非常重要的字段。
要查看你网站上的所有活动插件,你可以查看active_plugins option_name,像这样:
SELECT * FROM wp_options WHERE option_name = 'active_plugins'
选项表还存储了插件定义的所有选项。在WordPress中激活的大多数插件都会有一些设置页面。这些设置通常保存在wp_option中,以便插件可以在需要时检索这些设置。例如,Akismet插件存储了一个名为Akismet _spam_count的选项,该选项存储了垃圾评论的总数。可以通过执行以下查询查看该选项:
SELECT * FROM wp_options WHERE option_name = 'akismet_spam_count'
wp_users表包含了你目前在WordPress中设置的所有用户。如果你允许在你的网站上开放注册,当新用户加入网站时,将在此表中创建新用户。wp_users表存储了非常重要的用户信息,包括用户名、密码、电子邮件、网站URL和注册日期。假设想导出所有用户的电子邮件地址。可以通过运行以下查询轻松做到这一点:
SELECT DISTINCT user_email FROM wp_users
现在你可以轻松地导出所有加载到WordPress中的电子邮件地址!在wp_users中使用的另一个常见查询是重置用户的密码。你可以用几种不同的方法来做到这一点,但是如果你完全被锁定在WordPress之外,你总是可以直接在数据库中重置密码。要做到这一点,你需要从MySQL命令行更新user_ pass字段:
UPDATE wp_users SET user_pass = MD5('Hall0w33n') WHERE user_login ='admin' LIMIT 1;
执行该查询将管理员密码重置为Hall0w33n。注意如何在MD5()中封装新密码。这将密码转换为MD5哈希。自从WordPress 2.5以来,密码现在使用phpass加密库而不是MD5进行加盐和哈希处理。不过,不用担心,因为WordPress是用来检测MD5哈希密码并将其转换为phpass加密的。因此,前面的查询将成功重置你在WordPress中的密码。wp_comments表存储提交到您网站的所有评论。该表包含评论、作者、电子邮件、网站URL、IP地址等。下面是一个显示注释的查询示例:
SELECT wc.* FROM wp_posts wp
INNER JOIN wp_comments wc ON wp.ID = wc.comment_post_ID
WHERE wp.ID = '1554'
这个查询返回post ID 1554的所有注释。wp_comments中的另一个重要字段是user_id字段。如果用户登录到你的网站并发表了评论,该字段将包含他或她的用户ID。考虑下面的代码,它显示了用户admin留下的所有注释:
SELECT wc.* FROM wp_comments wc
INNER JOIN wp_users wu ON wc.user_id = wu.ID
WHERE wu.user_login = 'admin'
在图6-1的数据库图中,箭头表示各表之间的关系。在编写自定义查询以直接从数据库检索数据时,这非常有用。例如,要检索特定文章的所有评论,可以运行以下查询:
SELECT * FROM wp_comments
INNER JOIN wp_posts ON wp_comments.comment_post_id = wp_posts.ID
WHERE wp_posts.ID = '1'
这个查询返回post ID 1的所有注释。注意如何将wp_ comments.comment post_ID字段加入到wp_posts.ID字段。SQL JOIN是必要的,因为评论和帖子之间是N:1的关系;每一篇文章可能有许多评论,但评论只适用于一篇文章。这两个字段在关系图中显示为这些表的连接字段。还考虑下面的示例,它演示了如何加入wp users和wp_ usermeta表:
SELECT * FROM wp_users
INNER JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
WHERE wp_users.ID = '1'
正如你在数据库图中看到的那样,wp _ users。ID字段被加入到wp_ usermeta . user_ ID字段。前面的查询检索用户ID 1的所有用户信息,包括用户元数据,该用户ID 1是默认的admin帐户。同样,通过数据库图可以非常容易地确定如何通过WordPress数据库中的索引值来连接表,以及逻辑INNER JOIN操作如何构建相关表行的结果集。如果你有兴趣学习更多关于SQL的知识,你可以在http://www.w3schools.com/sql/上阅读一些优秀的教程。也可以访问 https://www.chenxiaofang.site/ WordPress教程
本章总结:
本章涵盖了WordPress数据库模式、数据库表关系、WordPress数据库类以及调试数据库查询的正确方法。无论是使用主题、插件还是自定义函数,了解如何使用WordPress数据库是非常重要的。了解WordPress在数据库中存储数据的位置和方式可以帮助你开发更复杂的网站功能。
接下来,我们将介绍使用自定义文章类型的WordPress自定义内容。我们还将介绍自定义分类法、自定义元数据,以及这两种方法在开发WordPress网站时的作用和重要性。