2006-06-04 22:12:59 -04:00
< ? php
2007-12-24 02:01:47 -05:00
/**
* Link / Bookmark API
*
* @ package WordPress
* @ subpackage Bookmark
*/
/**
2010-09-07 07:21:11 -04:00
* Retrieve Bookmark data
2007-12-24 02:01:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.1 . 0
2007-12-24 02:01:47 -05:00
* @ uses $wpdb Database Object
*
2010-09-07 07:21:11 -04:00
* @ param mixed $bookmark
2007-12-24 02:01:47 -05:00
* @ param string $output Optional . Either OBJECT , ARRAY_N , or ARRAY_A constant
* @ param string $filter Optional , default is 'raw' .
* @ return array | object Type returned depends on $output value .
*/
2008-08-27 18:04:12 -04:00
function get_bookmark ( $bookmark , $output = OBJECT , $filter = 'raw' ) {
2006-06-04 22:12:59 -04:00
global $wpdb ;
2008-08-27 18:04:12 -04:00
if ( empty ( $bookmark ) ) {
if ( isset ( $GLOBALS [ 'link' ]) )
$_bookmark = & $GLOBALS [ 'link' ];
else
$_bookmark = null ;
} elseif ( is_object ( $bookmark ) ) {
wp_cache_add ( $bookmark -> link_id , $bookmark , 'bookmark' );
$_bookmark = $bookmark ;
} else {
2008-11-15 13:10:35 -05:00
if ( isset ( $GLOBALS [ 'link' ]) && ( $GLOBALS [ 'link' ] -> link_id == $bookmark ) ) {
2008-08-27 18:04:12 -04:00
$_bookmark = & $GLOBALS [ 'link' ];
} elseif ( ! $_bookmark = wp_cache_get ( $bookmark , 'bookmark' ) ) {
$_bookmark = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1 " , $bookmark ));
2012-09-13 12:41:43 -04:00
if ( $_bookmark ) {
$_bookmark -> link_category = array_unique ( wp_get_object_terms ( $_bookmark -> link_id , 'link_category' , array ( 'fields' => 'ids' ) ) );
wp_cache_add ( $_bookmark -> link_id , $_bookmark , 'bookmark' );
}
2008-08-27 18:04:12 -04:00
}
}
2006-06-04 22:12:59 -04:00
2012-09-13 12:41:43 -04:00
if ( ! $_bookmark )
return $_bookmark ;
2008-08-27 18:04:12 -04:00
$_bookmark = sanitize_bookmark ( $_bookmark , $filter );
2007-09-03 19:19:20 -04:00
2006-06-04 22:12:59 -04:00
if ( $output == OBJECT ) {
2008-08-27 18:04:12 -04:00
return $_bookmark ;
2006-06-04 22:12:59 -04:00
} elseif ( $output == ARRAY_A ) {
2008-08-27 18:04:12 -04:00
return get_object_vars ( $_bookmark );
2006-06-04 22:12:59 -04:00
} elseif ( $output == ARRAY_N ) {
2008-08-27 18:04:12 -04:00
return array_values ( get_object_vars ( $_bookmark ));
2006-06-04 22:12:59 -04:00
} else {
2008-08-27 18:04:12 -04:00
return $_bookmark ;
2006-06-04 22:12:59 -04:00
}
}
2007-12-24 02:01:47 -05:00
/**
2008-05-25 11:45:05 -04:00
* Retrieve single bookmark data item or field .
2007-12-24 02:01:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2007-12-24 02:01:47 -05:00
* @ uses get_bookmark () Gets bookmark object using $bookmark as ID
* @ uses sanitize_bookmark_field () Sanitizes Bookmark field based on $context .
*
* @ param string $field The name of the data field to return
* @ param int $bookmark The bookmark ID to get field
* @ param string $context Optional . The context of how the field will be used .
* @ return string
*/
2007-08-20 18:50:04 -04:00
function get_bookmark_field ( $field , $bookmark , $context = 'display' ) {
$bookmark = ( int ) $bookmark ;
$bookmark = get_bookmark ( $bookmark );
if ( is_wp_error ( $bookmark ) )
return $bookmark ;
if ( ! is_object ( $bookmark ) )
return '' ;
if ( ! isset ( $bookmark -> $field ) )
return '' ;
return sanitize_bookmark_field ( $field , $bookmark -> $field , $bookmark -> link_id , $context );
}
2007-12-24 02:01:47 -05:00
/**
2008-05-25 11:45:05 -04:00
* Retrieves the list of bookmarks
2007-12-24 02:01:47 -05:00
*
* 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 .
*
* List of default arguments are as follows :
2008-05-25 11:45:05 -04:00
* 'orderby' - Default is 'name' ( string ) . How to order the links by . String is
* based off of the bookmark scheme .
* 'order' - Default is 'ASC' ( string ) . Either 'ASC' or 'DESC' . Orders in either
* ascending or descending order .
* 'limit' - Default is - 1 ( integer ) or show all . The amount of bookmarks to
* display .
* 'category' - Default is empty string ( string ) . Include the links in what
* category ID ( s ) .
* 'category_name' - Default is empty string ( string ) . Get links by category
* name .
* 'hide_invisible' - Default is 1 ( integer ) . Whether to show ( default ) or hide
* links marked as 'invisible' .
* 'show_updated' - Default is 0 ( integer ) . Will show the time of when the
* bookmark was last updated .
2011-12-20 17:01:43 -05:00
* 'include' - Default is empty string ( string ) . Include bookmark ID ( s )
2008-05-25 11:45:05 -04:00
* separated by commas .
2011-12-20 17:01:43 -05:00
* 'exclude' - Default is empty string ( string ) . Exclude bookmark ID ( s )
2008-05-25 11:45:05 -04:00
* separated by commas .
2007-12-24 02:01:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.1 . 0
2007-12-24 02:01:47 -05:00
* @ uses $wpdb Database Object
2008-05-25 11:45:05 -04:00
* @ link http :// codex . wordpress . org / Template_Tags / get_bookmarks
2007-12-24 02:01:47 -05:00
*
* @ param string | array $args List of arguments to overwrite the defaults
* @ return array List of bookmark row objects
*/
2006-06-04 22:12:59 -04:00
function get_bookmarks ( $args = '' ) {
global $wpdb ;
2007-06-13 22:25:30 -04:00
2007-05-10 23:10:05 -04:00
$defaults = array (
2007-09-03 19:32:58 -04:00
'orderby' => 'name' , 'order' => 'ASC' ,
'limit' => - 1 , 'category' => '' ,
'category_name' => '' , 'hide_invisible' => 1 ,
'show_updated' => 0 , 'include' => '' ,
2008-02-12 03:01:32 -05:00
'exclude' => '' , 'search' => ''
2007-05-10 23:10:05 -04:00
);
2007-06-13 22:25:30 -04:00
2007-05-10 23:10:05 -04:00
$r = wp_parse_args ( $args , $defaults );
2007-06-14 18:45:40 -04:00
extract ( $r , EXTR_SKIP );
2006-06-04 22:12:59 -04:00
2008-12-19 02:05:51 -05:00
$cache = array ();
2006-11-23 12:04:05 -05:00
$key = md5 ( serialize ( $r ) );
2008-12-19 02:05:51 -05:00
if ( $cache = wp_cache_get ( 'get_bookmarks' , 'bookmark' ) ) {
2013-11-07 21:20:10 -05:00
if ( is_array ( $cache ) && isset ( $cache [ $key ] ) ) {
2013-10-26 12:53:09 -04:00
$bookmarks = $cache [ $key ];
/**
* Filter 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 $r An array of bookmark query arguments .
*/
return apply_filters ( 'get_bookmarks' , $bookmarks , $r );
2013-11-07 21:20:10 -05:00
}
2008-12-19 02:05:51 -05:00
}
if ( ! is_array ( $cache ) )
$cache = array ();
2006-11-23 12:04:05 -05:00
2006-06-04 22:12:59 -04:00
$inclusions = '' ;
if ( ! empty ( $include ) ) {
2007-12-24 02:01:47 -05:00
$exclude = '' ; //ignore exclude, category, and category_name params if using include
$category = '' ;
$category_name = '' ;
2006-06-04 22:12:59 -04:00
$inclinks = preg_split ( '/[\s,]+/' , $include );
if ( count ( $inclinks ) ) {
foreach ( $inclinks as $inclink ) {
if ( empty ( $inclusions ))
$inclusions = ' AND ( link_id = ' . intval ( $inclink ) . ' ' ;
else
$inclusions .= ' OR link_id = ' . intval ( $inclink ) . ' ' ;
}
}
}
2006-11-24 17:55:28 -05:00
if ( ! empty ( $inclusions ))
2006-06-04 22:12:59 -04:00
$inclusions .= ')' ;
$exclusions = '' ;
if ( ! empty ( $exclude ) ) {
$exlinks = preg_split ( '/[\s,]+/' , $exclude );
if ( count ( $exlinks ) ) {
foreach ( $exlinks as $exlink ) {
if ( empty ( $exclusions ))
$exclusions = ' AND ( link_id <> ' . intval ( $exlink ) . ' ' ;
else
$exclusions .= ' AND link_id <> ' . intval ( $exlink ) . ' ' ;
}
}
}
2006-11-24 17:55:28 -05:00
if ( ! empty ( $exclusions ))
2006-06-04 22:12:59 -04:00
$exclusions .= ')' ;
2007-02-27 10:24:54 -05:00
2009-04-23 01:39:33 -04:00
if ( ! empty ( $category_name ) ) {
if ( $category = get_term_by ( 'name' , $category_name , 'link_category' ) ) {
2007-05-27 13:21:04 -04:00
$category = $category -> term_id ;
2009-04-23 01:39:33 -04:00
} else {
$cache [ $key ] = array ();
wp_cache_set ( 'get_bookmarks' , $cache , 'bookmark' );
2013-10-26 12:53:09 -04:00
/** This filter is documented in wp-includes/bookmark.php */
2009-04-23 01:39:33 -04:00
return apply_filters ( 'get_bookmarks' , array (), $r );
}
2006-06-04 22:12:59 -04:00
}
2008-02-12 03:01:32 -05:00
if ( ! empty ( $search ) ) {
2013-07-29 14:16:47 -04:00
$search = esc_sql ( like_escape ( $search ) );
2008-02-12 03:01:32 -05:00
$search = " AND ( (link_url LIKE '% $search %') OR (link_name LIKE '% $search %') OR (link_description LIKE '% $search %') ) " ;
}
2006-06-04 22:12:59 -04:00
$category_query = '' ;
$join = '' ;
if ( ! empty ( $category ) ) {
$incategories = preg_split ( '/[\s,]+/' , $category );
if ( count ( $incategories ) ) {
foreach ( $incategories as $incat ) {
if ( empty ( $category_query ))
2007-05-27 13:21:04 -04:00
$category_query = ' AND ( tt.term_id = ' . intval ( $incat ) . ' ' ;
2006-06-04 22:12:59 -04:00
else
2007-05-27 13:21:04 -04:00
$category_query .= ' OR tt.term_id = ' . intval ( $incat ) . ' ' ;
2006-06-04 22:12:59 -04:00
}
}
}
if ( ! empty ( $category_query )) {
2007-05-27 13:21:04 -04:00
$category_query .= " ) AND taxonomy = 'link_category' " ;
2007-10-11 13:43:49 -04:00
$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 " ;
2006-06-04 22:12:59 -04:00
}
2014-04-02 23:10:15 -04:00
if ( $show_updated ) {
$recently_updated_test = " , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated " ;
2006-06-04 22:12:59 -04:00
} else {
$recently_updated_test = '' ;
}
2008-01-10 15:51:07 -05:00
$get_updated = ( $show_updated ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '' ;
2006-06-04 22:12:59 -04:00
$orderby = strtolower ( $orderby );
$length = '' ;
2011-06-27 11:46:11 -04:00
switch ( $orderby ) {
2006-06-04 22:12:59 -04:00
case 'length' :
$length = " , CHAR_LENGTH(link_name) AS length " ;
break ;
case 'rand' :
$orderby = 'rand()' ;
break ;
2011-06-27 11:46:11 -04:00
case 'link_id' :
$orderby = " $wpdb->links .link_id " ;
break ;
2006-06-04 22:12:59 -04:00
default :
2010-04-18 00:45:09 -04:00
$orderparams = array ();
2011-06-27 11:46:11 -04:00
foreach ( explode ( ',' , $orderby ) as $ordparam ) {
$ordparam = trim ( $ordparam );
2011-09-30 13:03:46 -04:00
$keys = array ( 'link_id' , 'link_name' , 'link_url' , 'link_visible' , 'link_rating' , 'link_owner' , 'link_updated' , 'link_notes' );
if ( in_array ( 'link_' . $ordparam , $keys ) )
2011-06-27 11:46:11 -04:00
$orderparams [] = 'link_' . $ordparam ;
2011-09-30 13:03:46 -04:00
elseif ( in_array ( $ordparam , $keys ) )
$orderparams [] = $ordparam ;
2011-06-27 11:46:11 -04:00
}
2010-04-18 00:45:09 -04:00
$orderby = implode ( ',' , $orderparams );
2006-06-04 22:12:59 -04:00
}
2011-06-27 11:46:11 -04:00
if ( empty ( $orderby ) )
$orderby = 'link_name' ;
$order = strtoupper ( $order );
if ( '' !== $order && ! in_array ( $order , array ( 'ASC' , 'DESC' ) ) )
$order = 'ASC' ;
2006-06-04 22:12:59 -04:00
$visible = '' ;
if ( $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 " ;
2008-02-12 03:01:32 -05:00
$query .= " $exclusions $inclusions $search " ;
2006-06-04 22:12:59 -04:00
$query .= " ORDER BY $orderby $order " ;
if ( $limit != - 1 )
$query .= " LIMIT $limit " ;
$results = $wpdb -> get_results ( $query );
2006-11-23 12:04:05 -05:00
$cache [ $key ] = $results ;
2007-08-16 14:12:12 -04:00
wp_cache_set ( 'get_bookmarks' , $cache , 'bookmark' );
2006-11-23 12:04:05 -05:00
2013-10-26 12:53:09 -04:00
/** This filter is documented in wp-includes/bookmark.php */
return apply_filters ( 'get_bookmarks' , $results , $r );
2006-06-04 22:12:59 -04:00
}
2007-12-24 02:01:47 -05:00
/**
2008-05-25 11:45:05 -04:00
* Sanitizes all bookmark fields
2007-12-24 02:01:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2007-12-24 02:01:47 -05:00
*
* @ param object | array $bookmark Bookmark row
2008-05-25 11:45:05 -04:00
* @ param string $context Optional , default is 'display' . How to filter the
* fields
2007-12-24 02:01:47 -05:00
* @ return object | array Same type as $bookmark but with fields sanitized .
*/
2007-08-20 18:50:04 -04:00
function sanitize_bookmark ( $bookmark , $context = 'display' ) {
$fields = array ( 'link_id' , 'link_url' , 'link_name' , 'link_image' , 'link_target' , 'link_category' ,
'link_description' , 'link_visible' , 'link_owner' , 'link_rating' , 'link_updated' ,
'link_rel' , 'link_notes' , 'link_rss' , );
2008-11-14 18:01:16 -05:00
if ( is_object ( $bookmark ) ) {
2007-08-20 18:50:04 -04:00
$do_object = true ;
2008-11-14 18:01:16 -05:00
$link_id = $bookmark -> link_id ;
} else {
$do_object = false ;
$link_id = $bookmark [ 'link_id' ];
}
2007-08-20 18:50:04 -04:00
foreach ( $fields as $field ) {
2008-11-14 18:01:16 -05:00
if ( $do_object ) {
if ( isset ( $bookmark -> $field ) )
$bookmark -> $field = sanitize_bookmark_field ( $field , $bookmark -> $field , $link_id , $context );
} else {
if ( isset ( $bookmark [ $field ]) )
$bookmark [ $field ] = sanitize_bookmark_field ( $field , $bookmark [ $field ], $link_id , $context );
}
2007-08-20 18:50:04 -04:00
}
return $bookmark ;
}
2007-12-24 02:01:47 -05:00
/**
2008-05-25 11:45:05 -04:00
* Sanitizes a bookmark field
2007-12-24 02:01:47 -05:00
*
2008-05-25 11:45:05 -04:00
* Sanitizes the bookmark fields based on what the field name is . If the field
* has a strict value set , then it will be tested for that , else a more generic
* filtering is applied . After the more strict filter is applied , if the
* $context is 'raw' then the value is immediately return .
2007-12-24 02:01:47 -05:00
*
2008-05-25 11:45:05 -04:00
* Hooks exist for the more generic cases . With the 'edit' context , the
* 'edit_$field' filter will be called and passed the $value and $bookmark_id
* respectively . With the 'db' context , the 'pre_$field' filter is called and
* passed the value . The 'display' context is the final context and has the
* $field has the filter name and is passed the $value , $bookmark_id , and
* $context respectively .
2007-12-24 02:01:47 -05:00
*
2008-08-27 02:45:13 -04:00
* @ since 2.3 . 0
2007-12-24 02:01:47 -05:00
*
* @ param string $field The bookmark field
* @ param mixed $value The bookmark field value
* @ param int $bookmark_id Bookmark ID
2008-05-25 11:45:05 -04:00
* @ param string $context How to filter the field value . Either 'raw' , 'edit' ,
* 'attribute' , 'js' , 'db' , or 'display'
2008-02-05 01:47:27 -05:00
* @ return mixed The filtered value
2007-12-24 02:01:47 -05:00
*/
2007-08-20 18:50:04 -04:00
function sanitize_bookmark_field ( $field , $value , $bookmark_id , $context ) {
2010-04-26 10:10:12 -04:00
switch ( $field ) {
case 'link_id' : // ints
case 'link_rating' :
2007-08-20 18:50:04 -04:00
$value = ( int ) $value ;
2010-04-26 10:10:12 -04:00
break ;
case 'link_category' : // array( ints )
$value = array_map ( 'absint' , ( array ) $value );
// We return here so that the categories aren't filtered.
// The 'link_category' filter is for the name of a link category, not an array of a link's link categories
2010-02-07 16:59:24 -05:00
return $value ;
2010-04-26 10:10:12 -04:00
break ;
case 'link_visible' : // bool stored as Y|N
2007-08-20 18:50:04 -04:00
$value = preg_replace ( '/[^YNyn]/' , '' , $value );
2010-04-26 10:10:12 -04:00
break ;
case 'link_target' : // "enum"
2007-08-20 18:50:04 -04:00
$targets = array ( '_top' , '_blank' );
if ( ! in_array ( $value , $targets ) )
2007-09-03 19:32:58 -04:00
$value = '' ;
2010-04-26 10:10:12 -04:00
break ;
2007-08-20 18:50:04 -04:00
}
if ( 'raw' == $context )
return $value ;
if ( 'edit' == $context ) {
2013-10-26 12:53:09 -04:00
/** This filter is documented in wp-includes/post.php */
$value = apply_filters ( " edit_ $field " , $value , $bookmark_id );
2007-08-20 18:50:04 -04:00
2010-12-25 17:45:09 -05:00
if ( 'link_notes' == $field ) {
$value = esc_html ( $value ); // textarea_escaped
2007-08-20 18:50:04 -04:00
} else {
2009-05-05 15:43:53 -04:00
$value = esc_attr ( $value );
2007-08-20 18:50:04 -04:00
}
} else if ( 'db' == $context ) {
2013-10-26 12:53:09 -04:00
/** This filter is documented in wp-includes/post.php */
$value = apply_filters ( " pre_ $field " , $value );
2007-08-20 18:50:04 -04:00
} else {
2013-10-26 12:53:09 -04:00
/** This filter is documented in wp-includes/post.php */
$value = apply_filters ( $field , $value , $bookmark_id , $context );
2007-08-20 18:50:04 -04:00
2010-04-26 10:10:12 -04:00
if ( 'attribute' == $context )
$value = esc_attr ( $value );
else if ( 'js' == $context )
$value = esc_js ( $value );
}
2007-08-20 18:50:04 -04:00
return $value ;
}
2007-12-24 02:01:47 -05:00
/**
2008-08-27 18:04:12 -04:00
* Deletes bookmark cache
2007-12-24 02:01:47 -05:00
*
2008-08-27 18:04:12 -04:00
* @ since 2.7 . 0
2007-12-24 02:01:47 -05:00
* @ uses wp_cache_delete () Deletes the contents of 'get_bookmarks'
*/
2012-01-11 16:26:18 -05:00
function clean_bookmark_cache ( $bookmark_id ) {
2008-08-27 18:04:12 -04:00
wp_cache_delete ( $bookmark_id , 'bookmark' );
2006-11-23 12:04:05 -05:00
wp_cache_delete ( 'get_bookmarks' , 'bookmark' );
2012-01-11 16:26:18 -05:00
clean_object_term_cache ( $bookmark_id , 'link' );
2006-11-23 12:04:05 -05:00
}