get_bookmarks()
云策文档标注
概述
get_bookmarks() 函数用于从 WordPress 数据库中检索书签(链接)列表,支持缓存机制以提高性能。它接受多种参数来过滤、排序和限制结果,并返回书签对象的数组。
关键要点
- 函数首先尝试从缓存中基于参数 MD5 哈希检索书签,失败时构建并执行查询,结果会存储到缓存中。
- 参数包括 orderby(排序方式,如 'name'、'rand')、order(排序顺序,'ASC' 或 'DESC')、limit(限制数量)、category(分类 ID)、hide_invisible(是否隐藏不可见链接)等,均有默认值。
- 返回值为对象数组,每个对象代表一个书签行,可通过 apply_filters('get_bookmarks', ...) 钩子进行过滤。
- 函数内部处理 include 和 exclude 参数时,会忽略其他分类参数;支持通过 category_name 按名称检索分类。
- 查询构建涉及 SQL 语句,包括 JOIN 操作以关联分类,并处理搜索、可见性等条件。
代码示例
$bookmarks = get_bookmarks( array(
'orderby' => 'name',
'order' => 'ASC',
'category_name' => 'Related Sites'
) );
// Loop through each bookmark and print formatted output
foreach ( $bookmarks as $bookmark ) {
printf( '%2$s', esc_attr( $bookmark->link_url ), $bookmark->link_name );
}
原文内容
Retrieves the list of bookmarks.
Description
Attempts to retrieve from the cache first based on MD5 hash of arguments. If that fails, then the query will be built from the arguments and executed. The results will be stored to the cache.
Parameters
$argsstring|arrayoptional-
String or array of arguments to retrieve bookmarks.
orderbystringHow to order the links by. Accepts'id','link_id','name','link_name','url','link_url','visible','link_visible','rating','link_rating','owner','link_owner','updated','link_updated','notes','link_notes','description','link_description','length'and'rand'.
When$orderbyis'length', orders by the character length of'link_name'. Default'name'.orderstringWhether to order bookmarks in ascending or descending order.
Accepts'ASC'(ascending) or'DESC'(descending). Default'ASC'.limitintAmount of bookmarks to display. Accepts any positive number or -1 for all. Default -1.categorystringComma-separated list of category IDs to include links from.
Default empty.category_namestringCategory to retrieve links for by name. Default empty.hide_invisibleint|boolWhether to show or hide links marked as'invisible'. Accepts1|trueor0|false. Default1|true.show_updatedint|boolWhether to display the time the bookmark was last updated.
Accepts1|trueor0|false. Default0|false.includestringComma-separated list of bookmark IDs to include. Default empty.excludestringComma-separated list of bookmark IDs to exclude. Default empty.searchstringSearch terms. Will be SQL-formatted with wildcards before and after and searched in'link_url','link_name'and'link_description'.
Default empty.
Source
function get_bookmarks( $args = '' ) {
global $wpdb;
$defaults = array(
'orderby' => 'name',
'order' => 'ASC',
'limit' => -1,
'category' => '',
'category_name' => '',
'hide_invisible' => 1,
'show_updated' => 0,
'include' => '',
'exclude' => '',
'search' => '',
);
$parsed_args = wp_parse_args( $args, $defaults );
$key = md5( serialize( $parsed_args ) );
$cache = wp_cache_get( 'get_bookmarks', 'bookmark' );
if ( 'rand' !== $parsed_args['orderby'] && $cache ) {
if ( is_array( $cache ) && isset( $cache[ $key ] ) ) {
$bookmarks = $cache[ $key ];
/**
* Filters the returned list of bookmarks.
*
* The first time the hook is evaluated in this file, it returns the cached
* bookmarks list. The second evaluation returns a cached bookmarks list if the
* link category is passed but does not exist. The third evaluation returns
* the full cached results.
*
* @since 2.1.0
*
* @see get_bookmarks()
*
* @param array $bookmarks List of the cached bookmarks.
* @param array $parsed_args An array of bookmark query arguments.
*/
return apply_filters( 'get_bookmarks', $bookmarks, $parsed_args );
}
}
if ( ! is_array( $cache ) ) {
$cache = array();
}
$inclusions = '';
if ( ! empty( $parsed_args['include'] ) ) {
$parsed_args['exclude'] = ''; // Ignore exclude, category, and category_name params if using include.
$parsed_args['category'] = '';
$parsed_args['category_name'] = '';
$inclinks = wp_parse_id_list( $parsed_args['include'] );
if ( count( $inclinks ) ) {
foreach ( $inclinks as $inclink ) {
if ( empty( $inclusions ) ) {
$inclusions = ' AND ( link_id = ' . $inclink . ' ';
} else {
$inclusions .= ' OR link_id = ' . $inclink . ' ';
}
}
}
}
if ( ! empty( $inclusions ) ) {
$inclusions .= ')';
}
$exclusions = '';
if ( ! empty( $parsed_args['exclude'] ) ) {
$exlinks = wp_parse_id_list( $parsed_args['exclude'] );
if ( count( $exlinks ) ) {
foreach ( $exlinks as $exlink ) {
if ( empty( $exclusions ) ) {
$exclusions = ' AND ( link_id <> ' . $exlink . ' ';
} else {
$exclusions .= ' AND link_id <> ' . $exlink . ' ';
}
}
}
}
if ( ! empty( $exclusions ) ) {
$exclusions .= ')';
}
if ( ! empty( $parsed_args['category_name'] ) ) {
$parsed_args['category'] = get_term_by( 'name', $parsed_args['category_name'], 'link_category' );
if ( $parsed_args['category'] ) {
$parsed_args['category'] = $parsed_args['category']->term_id;
} else {
$cache[ $key ] = array();
wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
/** This filter is documented in wp-includes/bookmark.php */
return apply_filters( 'get_bookmarks', array(), $parsed_args );
}
}
$search = '';
if ( ! empty( $parsed_args['search'] ) ) {
$like = '%' . $wpdb->esc_like( $parsed_args['search'] ) . '%';
$search = $wpdb->prepare( ' AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) ', $like, $like, $like );
}
$category_query = '';
$join = '';
if ( ! empty( $parsed_args['category'] ) ) {
$incategories = wp_parse_id_list( $parsed_args['category'] );
if ( count( $incategories ) ) {
foreach ( $incategories as $incat ) {
if ( empty( $category_query ) ) {
$category_query = ' AND ( tt.term_id = ' . $incat . ' ';
} else {
$category_query .= ' OR tt.term_id = ' . $incat . ' ';
}
}
}
}
if ( ! empty( $category_query ) ) {
$category_query .= ") AND taxonomy = 'link_category'";
$join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id";
}
if ( $parsed_args['show_updated'] ) {
$recently_updated_test = ', IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated ';
} else {
$recently_updated_test = '';
}
$get_updated = ( $parsed_args['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';
$orderby = strtolower( $parsed_args['orderby'] );
$length = '';
switch ( $orderby ) {
case 'length':
$length = ', CHAR_LENGTH(link_name) AS length';
break;
case 'rand':
$orderby = 'rand()';
break;
case 'link_id':
$orderby = "$wpdb->links.link_id";
break;
default:
$orderparams = array();
$keys = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' );
foreach ( explode( ',', $orderby ) as $ordparam ) {
$ordparam = trim( $ordparam );
if ( in_array( 'link_' . $ordparam, $keys, true ) ) {
$orderparams[] = 'link_' . $ordparam;
} elseif ( in_array( $ordparam, $keys, true ) ) {
$orderparams[] = $ordparam;
}
}
$orderby = implode( ',', $orderparams );
}
if ( empty( $orderby ) ) {
$orderby = 'link_name';
}
$order = strtoupper( $parsed_args['order'] );
if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ), true ) ) {
$order = 'ASC';
}
$visible = '';
if ( $parsed_args['hide_invisible'] ) {
$visible = "AND link_visible = 'Y'";
}
$query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query";
$query .= " $exclusions $inclusions $search";
$query .= " ORDER BY $orderby $order";
if ( -1 !== $parsed_args['limit'] ) {
$query .= ' LIMIT ' . absint( $parsed_args['limit'] );
}
$results = $wpdb->get_results( $query );
if ( 'rand()' !== $orderby ) {
$cache[ $key ] = $results;
wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
}
/** This filter is documented in wp-includes/bookmark.php */
return apply_filters( 'get_bookmarks', $results, $parsed_args );
}
Hooks
- apply_filters( ‘get_bookmarks’, array $bookmarks, array $parsed_args )
-
Filters the returned list of bookmarks.
Changelog
| Version | Description |
|---|---|
| 2.1.0 | Introduced. |
Skip to note 2 content
Codex
Example
– Create a link category named “Related Sites”
– Create a few links, adding them to the “Related Sites” category
You may use the following code in your templates to retrieve the links:
$bookmarks = get_bookmarks( array( 'orderby' => 'name', 'order' => 'ASC', 'category_name' => 'Related Sites' ) ); // Loop through each bookmark and print formatted output foreach ( $bookmarks as $bookmark ) { printf( '<a class="relatedlink" href="%1$s">%2$s</a><br />', esc_attr( $bookmark->link_url ), $bookmark->link_name ); }