使用自定义查询,您可以进行任何您想要的数据读取或操作。这开辟了一个充满新可能性的世界。
为什么使用自定义查询?
wordpress 中的基本功能在大多数情况下都很好,但是如果您有一些现有插件尚未解决的特定需求,您会怎么做?你在写自己的插件吗?然后你应该学习如何在 WordPress 中使用 sql 查询!官方参考资料可以在 WordPress Codex(自定义查询和WPDB 类)中找到。
wpdb班级_
wpdb全局 WordPress 类是使用自定义查询的关键。事实上,在执行查询时,几乎每个需要从数据库中获取数据的 WordPress api 最终都会在后台使用这个类。要使用这个类,您需要使用全局$wpdb变量,它是该类的实例化wpdb。
在本节中,我们将讨论wpdb该类的几个重要方法。使用这些方法,您可以在 WordPress 项目中执行所有类型的自定义查询。
query方法_
该query方法用于使用活动数据库连接执行查询。该query方法的第一个参数是有效的 SQL 语句。此方法的返回值是一个整数,对应于受影响/选择的行数或false发生错误时的行数。
通常,当您要检索记录计数时,您希望使用此方法。让我们看一下以下示例,以了解如何使用此方法。
global $wpdb; $query = "SELECT COUNT(apple) FROM $wpdb->fruits"; $result = $wpdb->query($query);
首先,我们声明了$wpdb全局变量,以便我们可以使用wpdb该类。接下来,我们准备好 SQL 语句并将其作为query方法的第一个参数传递。该query方法将执行查询并返回选定或受影响的行数。
get_results方法_
该get_results方法返回整个查询结果,即一个数组。数组的每个元素对应于结果的一行。
让我们看看下面的例子。
global $wpdb; $query = $wpdb->prepare( "SELECT * FROM $wpdb->wp_terms wt INNER JOIN $wpdb->wp_term_taxonomy wtt ON wt.term_id = wtt.term_id WHERE wtt.taxonomy = %s AND wtt.count = %d", array( 'post_tag', 0 ) ); $results = $wpdb->get_results($query); if (is_array($results) && count($results)) { foreach ($results as $row) { echo $row['name']; } }
首先,我们使用该prepare方法准备 SQL 查询以安全执行。我们将在本文后面讨论更多关于准备好的语句。接下来,我们在get_results方法的第一个参数中传递了准备好的查询。最后,该get_results方法执行查询并将结果作为数组返回。
get_var方法_
该get_var方法用于从数据库中返回一个变量,并将查询的完整结果缓存起来以备后用。NULL如果没有结果,它会返回。
让我们仔细看看下面的例子来了解它是如何工作的。
global $wpdb; $query = $wpdb->prepare( "SELECT wt.term_id, wt.name FROM $wpdb->wp_terms wt INNER JOIN $wpdb->wp_term_taxonomy wtt ON wt.term_id = wtt.term_id WHERE wtt.taxonomy = %s AND wtt.count = %d ORDER BY wtt.count DESC", array( 'post_tag', 0 ) ); $results = $wpdb->get_var($query, 1, 0);
该get_var方法接受三个参数。
查询:您要执行的 SQL 查询。
column:要从结果中检索的列名
row:要从结果集中检索的特定行的编号。
在上面的示例中,我们尝试检索name第一行中列的值。
get_row方法_
该get_row方法用于从数据库中检索单行。NULL当没有结果时,它会返回。
global $wpdb; $query = $wpdb->prepare( "SELECT * FROM wp_posts WHERE post_type = %s", 'post' ); $row = $wpdb->get_row($query, ARRAY_A, 3);
该get_row方法接受三个参数。
查询:您要执行的 SQL 查询。
返回类型:OBJECT、ARRAY_A或中的一个ARRAY_N,对应于stdClass对象、关联数组或数值数组。
row:要从结果集中检索的特定行的编号
在上面的示例中,我们尝试从结果集中检索第四行。
get_col方法_
该get_col方法用于从结果集中检索特定列。如果结果集只包含一列,则将其返回。另一方面,如果结果集包含多个列,它将返回第二个参数中指定的特定列。
global $wpdb; $query = $wpdb->prepare( "SELECT * FROM wp_posts WHERE post_type = %s", 'post' ); $col = $wpdb->get_col($query, 3);
在上面的示例中,我们尝试从结果集中检索第四列。
准备好的查询
根据 php.net 手册:
“它们 [prepared queries] 可以被认为是应用程序想要运行的 SQL 的一种编译模板,可以使用可变参数进行定制。”
预编译语句是预编译的 SQL 语句,只需将数据发送到服务器即可多次执行。它具有自动使占位符中使用的数据免受 SQL 注入攻击的额外优势。您可以通过在 SQL 中包含占位符来使用准备好的语句。
简而言之,查询必须在执行前进行 SQL 转义,以防止注入攻击。该类wpdb提供了prepare允许您准备 SQL 查询以安全执行的方法。在我们到目前为止讨论的示例中,我们已经prepare在执行 SQL 查询之前使用了该方法。
让我们快速看一下下面的示例,其中值10,monkey和apple将在查询中实际使用时被转义。
// Usage: $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] ); global $wpdb; $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->test_table (post_id, animal, food) VALUES ( %d, %s, %s )", array( 10, 'monkey', 'apple' ) ));
设置错误信息
show_errors您可以使用和hide_errors方法打开和关闭数据库错误消息。
global $wpdb; $wpdb->show_errors(); $wpdb->hide_errors();
缓存控制
可以使用该flush方法刷新查询结果缓存。
global $wpdb; $wpdb->flush();
插入数据
您可以使用该insert方法在 mysql 表中插入一行。
global $wpdb;$wpdb->insert( $wpdb->foods, array( 'fruit' => 'apple', 'year' => 2012 ), array( '%s', '%d' ));
该insert方法接受三个参数。 |
表:表的名称
data : 要插入的数据(列 => 值对)而不转义
format:要映射到$data. 如果您不传递任何内容,则所有值都将被视为字符串
更新数据
该update方法用于将行更新到 MySQL 表中。
global $wpdb; $wpdb->update( $wpdb->foods, array( 'fruit' => 'apple', // string 'year' => 'value2' // integer (number) ), array( 'ID' => 1 ), array( '%s', // value1 '%d' // value2 ), array( '%d' ) );
该update方法接受五个参数。
表:表的名称。
数据:要更新的数据(列值对)而不转义。
where: where条件,键值对数组的形式。
格式:要映射到 中的每个值的格式数组$data。如果您不传递任何内容,则所有值都将被视为字符串。
格式 其中:要映射到 中的每个值的格式数组$where。如果您不传递任何内容,则所有值都将被视为字符串。
栏目信息
该get_col_info方法用于从最后一个查询中检索列元数据。
$wpdb->get_col_info('type', 1);
让我们看一下参数。
info_type:您要检索的元数据类型。您可以通过以下任何一项:'name', 'table', 'def', 'max_length', 'not_null', 'primary_key', 'multiple_key', 'unique_key', 'numeric', 'blob', 'type', 'unsigned', 或'zerofill'.
col_offset:指定从中检索信息的列。
引用 WordPress 表格
WordPress 数据库表可以在wpdb类中引用。这非常方便,因为表名可以与默认名称不同。以下是 WordPress 数据库表引用的列表:
$wpdb->posts;
$wpdb->postmeta;
$wpdb->comments;
$wpdb->commentmeta;
$wpdb->terms;
$wpdb->term_taxonomy;
$wpdb->term_relationships;
$wpdb->users;
$wpdb->usermeta;
$wpdb->links;
$wpdb->options;
请注意,我们不需要包含前缀,这是这里的好处,因为wpdb该类会为我们处理这些问题。
我们有它!WordPress 中自定义查询的参考,都在一个地方供您使用。
- query方法_
- get_results方法_
- get_var方法_
- get_row方法_
- get_col方法_
发表评论