WordPress包含一个操作数据库的类——wpdb
,该类基于ezSQL(由Justin Vincent维护的数据库操作项目)编写,包含了其基本的功能。
请不要直接调用wpdb
类中的方法。WordPress定义了$wpdb
的全局变量,所以请直接调用该全局变量$wpdb
的实例来操作数据库。(调用之前不要忘了声明引用全局变量$wpdb
。参考globalize)
$wpdb
对象可以用来操作WordPress数据库中的每一个表,不仅仅是WordPress自动创建的基本表。例如,你有一个自定义的表叫做mytable,那么可以使用如下语句来查询:
$myrows = $wpdb->get_results( "SELECT id, name FROM mytable" );
$wpdb
对象可以读取多个表,但是其只针对WordPress的数据库。如果你需要连接其他数据库,那么你应该使用你自己的数据库连接信息,并调用wpdb
类来创建一个你自己的数据库操作实例。如果你有多个数据库需要连接,那么你可以考虑使用hyperdb来替代$wpdb
。
这个查询函数允许你在wordpress的数据库里运行任何SQL查询。当然了,最好能利用如下的特定函数,
<?php $wpdb->query('query'); ?>
此函数返回操作/查询的行或列的整数。如果出现了MySQL错误,此函数将返回 FALSE
(注意: 因为 0 和 FALSE 都可能被返回, 确保你使用了正确的比较运算符:等于 ==
vs. 一致 ===
)。
注意:As with all functions in this class that execute SQL queries, you must SQL escape all inputs (e.g., wpdb->escape($user_entered_data_string)
). See the section entitled Protect Queries Against SQL Injection Attacks below.
删除属于id为13的文章的‘gargle’meta 键和值。
$wpdb->query(" DELETE FROM $wpdb->postmeta WHERE post_id = '13' AND meta_key = 'gargle'");
在WordPress中由 delete_post_meta()
执行.
设置页面 Page 15 的父级页面为 7.
$wpdb->query(" UPDATE $wpdb->posts SET post_parent = 7 WHERE ID = 15 AND post_status = 'static'");
The get_var
function returns a single variable from the database. Though only one variable is returned, the entire result of the query is cached for later use. Returns NULL if no result is found.
<?php $wpdb->get_var('query',column_offset,row_offset); ?>
null
will return the specified variable from the cached results of the previous query.获取并显示用户数量
<?php $user_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users;")); echo '<p>User count is ' . $user_count . '</p>'; ?>
获取并显示 自定义字段值 的总和.
<?php $meta_key = 'miles';//set this to appropriate custom field meta key $allmiles=$wpdb->get_var($wpdb->prepare("SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key)); echo '<p>Total miles is '.$allmiles . '</p>'; ?>
To retrieve an entire row from a query, use get_row
. The function can return the row as an object, an associative array, or as a numerically indexed array. If more than one row is returned by the query, only the specified row is returned by the function, but all rows are cached for later use. Returns NULL if no result is found.
<?php $wpdb->get_row('query', output_type, row_offset); ?>
获取ID为10的链接的全部信息
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10");
$mylink
对象的属性是SQL查询结果的列名(此例中是所有 $wpdb->links
表中的列名)。
echo $mylink->link_id; // prints "10"
作为对比, 使用
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);
将返回关联数组:
echo $mylink['link_id']; // prints "10"
然后
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N);
将返回索引数组:
echo $mylink[1]; // prints "10"
To SELECT a column, use get_col
. This function outputs a dimensional array. If more than one column is returned by the query, only the specified column will be returned by the function, but the entire result is cached for later use. Returns an empty array if no result is found.
<?php $wpdb->get_col('query',column_offset); ?>
null
will return the specified column from the cached results of the previous query.For this example, assume the blog is devoted to information about automobiles. Each post describes a particular car (e.g. 1969 Ford Mustang), and three Custom Fields, manufacturer, model, and year, are assigned to each post. This example will display the post titles, filtered by a particular manufacturer (Ford), and sorted by model and year.
The get_col form of the wpdb Class is used to return an array of all the post ids meeting the criteria and sorted in the correct order. Then a foreach construct is used to iterate through that array of post ids, displaying the title of each post. Note that the SQL for this example was created by Andomar.
<?php $meta_key1 = 'model'; $meta_key2 = 'year'; $meta_key3 = 'manufacturer'; $meta_key3_value = 'Ford'; $postids=$wpdb->get_col($wpdb->prepare(" SELECT key3.post_id FROM $wpdb->postmeta key3 INNER JOIN $wpdb->postmeta key1 on key1.post_id = key3.post_id and key1.meta_key = %s INNER JOIN $wpdb->postmeta key2 on key2.post_id = key3.post_id and key2.meta_key = %s WHERE key3.meta_key = %s and key3.meta_value = %s ORDER BY key1.meta_value, key2.meta_value",$meta_key1, $meta_key2, $meta_key3, $meta_key3_value)); if ($postids) { echo 'List of ' . $meta_key3_value . '(s), sorted by ' . $meta_key1 . ', ' . $meta_key2; foreach ($postids as $id) { $post=get_post(intval($id)); setup_postdata($post);?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php } } ?>
This example lists all posts that contain a particular custom field, but sorted by the value of a second custom field.
<?php //List all posts with custom field Color, sorted by the value of custom field Display_Order //does not exclude any 'post_type' //assumes each post has just one custom field for Color, and one for Display_Order $meta_key1 = 'Color'; $meta_key2 = 'Display_Order'; $postids=$wpdb->get_col($wpdb->prepare(" SELECT key1.post_id FROM $wpdb->postmeta key1 INNER JOIN $wpdb->postmeta key2 on key2.post_id = key1.post_id and key2.meta_key = %s WHERE key1.meta_key = %s ORDER BY key2.meta_value+(0) ASC", $meta_key2,$meta_key1)); if ($postids) { echo 'List of '. $meta_key1 . ' posts, sorted by ' . $meta_key2 ; foreach ($postids as $id) { $post=get_post(intval($id)); setup_postdata($post);?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php } } ?>
Generic, mulitple row results can be pulled from the database with get_results
. The function returns the entire query result as an array. Each element of this array corresponds to one row of the query result and, like get_row
, can be an object, an associative array, or a numbered array.
<?php $wpdb->get_results('query', output_type); ?>
null
will return the data from the cached results of the previous query.Since this function uses the '$wpdb->query()' function all the class variables are properly set. The results count for a 'SELECT' query will be stored in $wpdb->num_rows.
获取用户 5 发布的草稿的id和标题,并显示标题。
$fivesdrafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5"); foreach ($fivesdrafts as $fivesdraft) { echo $fivesdraft->post_title; }
获取用户 5 的所有草稿信息
<?php $fivesdrafts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5"); if ($fivesdrafts) : foreach ($fivesdrafts as $post) : setup_postdata($post); ?> <h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="链接到 <?php the_title(); ?>"><?php the_title(); ?></a></h2> <?php endforeach; else : ?> <h2> 未找到</h2> <?php endif; ?>
插入一行数据到数据表中
<?php $wpdb->insert( $table, $data, $format ); ?>
Possible format values: %s as string; %d as decimal number; and %f as float.
After insert, the ID generated for the AUTO_INCREMENT column can be accessed with:
$wpdb->insert_id
如果不能插入行,此函数返回false
在一行中插入两列,第一个值为字符串,第二个为数字:
$wpdb->insert( 'table', array( 'column1' => 'value1', 'column2' => 123 ), array( '%s', '%d' ) )
更新数据库的记录。
<?php $wpdb->update( $table, $data, $where, $format = null, $where_format = null ); ?>
Possible format values: %s as string; %d as decimal number and %f as float. If omitted, all values in $where will be treated as strings.
更新ID为1的行,第一列的值为字符串,第二列的值为数组:
$wpdb->update( 'table', array( 'column1' => 'value1', 'column2' => 'value2' ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )
For a more complete overview of SQL escaping in WordPress, see database Data Validation. That Data Validationarticle is a must-read for all WordPress code contributors and plugin authors.
Briefly, though, all data in SQL queries must be SQL-escaped before the SQL query is executed to prevent against SQL injection attacks. This can be conveniently done with the prepare
method, which supports both asprintf()-like and vsprintf()-like syntax.
<?php $sql = $wpdb->prepare( 'query' [, value_parameter, value_parameter ... ] ); ?>
%s
and %d
placeholders. Any other %
characters may cause parsing errors unless they are escaped. All %
characters inside SQL string literals, including LIKE wildcards, must be double-% escaped as %%
.Add Meta key => value pair "Harriet's Adages" => "WordPress' database interface is like Sunday Morning: Easy." to Post 10.
$metakey = "Harriet's Adages"; $metavalue = "WordPress' database interface is like Sunday Morning: Easy."; $wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", 10, $metakey, $metavalue ) );
Performed in WordPress by add_meta()
.
The same query using vsprintf()-like syntax.
$metakey = "Harriet's Adages"; $metavalue = "WordPress' database interface is like Sunday Morning: Easy."; $wpdb->query( $wpdb->prepare( " INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", array(10, $metakey, $metavalue) ) );
Note that in this example we pack the values together in an array. This can be useful when we don't know the number of arguments we need to pass until runtime.
Notice that you do not have to worry about quoting strings. Instead of passing the variables directly into the SQL query, use a %s
placeholder for strings and a %d
placedolder for integers. You can pass as many values as you like, each as a new parameter in the prepare()
method.
You can turn error echoing on and off with the show_errors
and hide_errors
, respectively.
<?php $wpdb->show_errors(); ?>
<?php $wpdb->hide_errors(); ?>
You can also print the error (if any) generated by the most recent query with print_error
.
<?php $wpdb->print_error(); ?>
You can retrieve information about the columns of the most recent query result with get_col_info
. This can be useful when a function has returned an OBJECT whose properties you don't know. The function will output the desired information from the specified column, or an array with information on all columns from the query result if no column is specified.
<?php $wpdb->get_col_info('type', offset); ?>
使用 flush
清除SQL查询结果缓存
<?php $wpdb->flush(); ?>
可以清除 $wpdb->last_result
, $wpdb->last_query
, 和 $wpdb->col_info
的缓存。
如果你正在使用多站点, 你也可以访问:
The WordPress database tables are easily referenced in the wpdb
class.