|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function get_bookmark( $bookmark, $output = OBJECT, $filter = 'raw' ) { |
|
global $wpdb; |
|
|
|
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 { |
|
if ( isset( $GLOBALS['link'] ) && ( $GLOBALS['link']->link_id === $bookmark ) ) { |
|
$_bookmark = & $GLOBALS['link']; |
|
} else { |
|
$_bookmark = wp_cache_get( $bookmark, 'bookmark' ); |
|
if ( ! $_bookmark ) { |
|
$_bookmark = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark ) ); |
|
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' ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ( ! $_bookmark ) { |
|
return $_bookmark; |
|
} |
|
|
|
$_bookmark = sanitize_bookmark( $_bookmark, $filter ); |
|
|
|
if ( OBJECT === $output ) { |
|
return $_bookmark; |
|
} elseif ( ARRAY_A === $output ) { |
|
return get_object_vars( $_bookmark ); |
|
} elseif ( ARRAY_N === $output ) { |
|
return array_values( get_object_vars( $_bookmark ) ); |
|
} else { |
|
return $_bookmark; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 ); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 ]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return apply_filters( 'get_bookmarks', $bookmarks, $parsed_args ); |
|
} |
|
} |
|
|
|
if ( ! is_array( $cache ) ) { |
|
$cache = array(); |
|
} |
|
|
|
$inclusions = ''; |
|
if ( ! empty( $parsed_args['include'] ) ) { |
|
$parsed_args['exclude'] = ''; |
|
$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' ); |
|
|
|
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' ); |
|
} |
|
|
|
|
|
return apply_filters( 'get_bookmarks', $results, $parsed_args ); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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', |
|
); |
|
|
|
if ( is_object( $bookmark ) ) { |
|
$do_object = true; |
|
$link_id = $bookmark->link_id; |
|
} else { |
|
$do_object = false; |
|
$link_id = $bookmark['link_id']; |
|
} |
|
|
|
foreach ( $fields as $field ) { |
|
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 ); |
|
} |
|
} |
|
} |
|
|
|
return $bookmark; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function sanitize_bookmark_field( $field, $value, $bookmark_id, $context ) { |
|
$int_fields = array( 'link_id', 'link_rating' ); |
|
if ( in_array( $field, $int_fields, true ) ) { |
|
$value = (int) $value; |
|
} |
|
|
|
switch ( $field ) { |
|
case 'link_category': |
|
$value = array_map( 'absint', (array) $value ); |
|
|
|
|
|
|
|
|
|
return $value; |
|
|
|
case 'link_visible': |
|
$value = preg_replace( '/[^YNyn]/', '', $value ); |
|
break; |
|
case 'link_target': |
|
$targets = array( '_top', '_blank' ); |
|
if ( ! in_array( $value, $targets, true ) ) { |
|
$value = ''; |
|
} |
|
break; |
|
} |
|
|
|
if ( 'raw' === $context ) { |
|
return $value; |
|
} |
|
|
|
if ( 'edit' === $context ) { |
|
|
|
$value = apply_filters( "edit_{$field}", $value, $bookmark_id ); |
|
|
|
if ( 'link_notes' === $field ) { |
|
$value = esc_html( $value ); |
|
} else { |
|
$value = esc_attr( $value ); |
|
} |
|
} elseif ( 'db' === $context ) { |
|
|
|
$value = apply_filters( "pre_{$field}", $value ); |
|
} else { |
|
|
|
$value = apply_filters( "{$field}", $value, $bookmark_id, $context ); |
|
|
|
if ( 'attribute' === $context ) { |
|
$value = esc_attr( $value ); |
|
} elseif ( 'js' === $context ) { |
|
$value = esc_js( $value ); |
|
} |
|
} |
|
|
|
|
|
if ( in_array( $field, $int_fields, true ) ) { |
|
$value = (int) $value; |
|
} |
|
|
|
return $value; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function clean_bookmark_cache( $bookmark_id ) { |
|
wp_cache_delete( $bookmark_id, 'bookmark' ); |
|
wp_cache_delete( 'get_bookmarks', 'bookmark' ); |
|
clean_object_term_cache( $bookmark_id, 'link' ); |
|
} |
|
|