Skip to main content
changed inline code for get_bookmarks() into link to trac
Source Link
Rarst
  • 99.9k
  • 10
  • 160
  • 298

And here's the get_bookmarks function: - 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' => ''
    );

    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );

    $cache = array();
    $key = md5( serialize( $r ) );
    if ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) {
        if ( is_array($cache) && isset( $cache[ $key ] ) )
            return apply_filters('get_bookmarks', $cache[ $key ], $r );
    }

    if ( !is_array($cache) )
        $cache = array();

    $inclusions = '';
    if ( !empty($include) ) {
        $exclude = '';  //ignore exclude, category, and category_name params if using include
        $category = '';
        $category_name = '';
        $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) . ' ';
            }
        }
    }
    if (!empty($inclusions))
        $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) . ' ';
            }
        }
    }
    if (!empty($exclusions))
        $exclusions .= ')';

    if ( !empty($category_name) ) {
        if ( $category = get_term_by('name', $category_name, 'link_category') ) {
            $category = $category->term_id;
        } else {
            $cache[ $key ] = array();
            wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
            return apply_filters( 'get_bookmarks', array(), $r );
        }
    }

    if ( ! empty($search) ) {
        $search = like_escape($search);
        $search = " AND ( (link_url LIKE '%$search%') OR (link_name LIKE '%$search%') OR (link_description LIKE '%$search%') ) ";
    }

    $category_query = '';
    $join = '';
    if ( !empty($category) ) {
        $incategories = preg_split('/[\s,]+/',$category);
        if ( count($incategories) ) {
            foreach ( $incategories as $incat ) {
                if (empty($category_query))
                    $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' ';
                else
                    $category_query .= ' OR tt.term_id = ' . intval($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 ( $show_updated && get_option('links_recently_updated_time') ) {
        $recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL " . get_option('links_recently_updated_time') . " MINUTE) >= NOW(), 1,0) as recently_updated ";
    } else {
        $recently_updated_test = '';
    }

    $get_updated = ( $show_updated ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';

    $orderby = strtolower($orderby);
    $length = '';
    switch ($orderby) {
        case 'length':
            $length = ", CHAR_LENGTH(link_name) AS length";
            break;
        case 'rand':
            $orderby = 'rand()';
            break;
        default:
            $orderparams = array();
            foreach ( explode(',', $orderby) as $ordparam )
                $orderparams[] = 'link_' . trim($ordparam);
            $orderby = implode(',', $orderparams);
    }

    if ( 'link_id' == $orderby )
        $orderby = "$wpdb->links.link_id";

    $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";
    $query .= " $exclusions $inclusions $search";
    $query .= " ORDER BY $orderby $order";
    if ($limit != -1)
        $query .= " LIMIT $limit";

    $results = $wpdb->get_results($query);

    $cache[ $key ] = $results;
    wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );

    return apply_filters('get_bookmarks', $results, $r);
}

And here's the get_bookmarks function:

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' => ''
    );

    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );

    $cache = array();
    $key = md5( serialize( $r ) );
    if ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) {
        if ( is_array($cache) && isset( $cache[ $key ] ) )
            return apply_filters('get_bookmarks', $cache[ $key ], $r );
    }

    if ( !is_array($cache) )
        $cache = array();

    $inclusions = '';
    if ( !empty($include) ) {
        $exclude = '';  //ignore exclude, category, and category_name params if using include
        $category = '';
        $category_name = '';
        $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) . ' ';
            }
        }
    }
    if (!empty($inclusions))
        $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) . ' ';
            }
        }
    }
    if (!empty($exclusions))
        $exclusions .= ')';

    if ( !empty($category_name) ) {
        if ( $category = get_term_by('name', $category_name, 'link_category') ) {
            $category = $category->term_id;
        } else {
            $cache[ $key ] = array();
            wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
            return apply_filters( 'get_bookmarks', array(), $r );
        }
    }

    if ( ! empty($search) ) {
        $search = like_escape($search);
        $search = " AND ( (link_url LIKE '%$search%') OR (link_name LIKE '%$search%') OR (link_description LIKE '%$search%') ) ";
    }

    $category_query = '';
    $join = '';
    if ( !empty($category) ) {
        $incategories = preg_split('/[\s,]+/',$category);
        if ( count($incategories) ) {
            foreach ( $incategories as $incat ) {
                if (empty($category_query))
                    $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' ';
                else
                    $category_query .= ' OR tt.term_id = ' . intval($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 ( $show_updated && get_option('links_recently_updated_time') ) {
        $recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL " . get_option('links_recently_updated_time') . " MINUTE) >= NOW(), 1,0) as recently_updated ";
    } else {
        $recently_updated_test = '';
    }

    $get_updated = ( $show_updated ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';

    $orderby = strtolower($orderby);
    $length = '';
    switch ($orderby) {
        case 'length':
            $length = ", CHAR_LENGTH(link_name) AS length";
            break;
        case 'rand':
            $orderby = 'rand()';
            break;
        default:
            $orderparams = array();
            foreach ( explode(',', $orderby) as $ordparam )
                $orderparams[] = 'link_' . trim($ordparam);
            $orderby = implode(',', $orderparams);
    }

    if ( 'link_id' == $orderby )
        $orderby = "$wpdb->links.link_id";

    $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";
    $query .= " $exclusions $inclusions $search";
    $query .= " ORDER BY $orderby $order";
    if ($limit != -1)
        $query .= " LIMIT $limit";

    $results = $wpdb->get_results($query);

    $cache[ $key ] = $results;
    wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );

    return apply_filters('get_bookmarks', $results, $r);
}

And here's the get_bookmarks function - source.

Source Link
user4392
user4392

get_bookmarks filter not supplying query argument (wp 3.1)

I'm using a filter on the get_bookmarks function. When I use two arguments in my filter function I get the result array and nothing for the second arg (it should be the parsed query).

Here's what I'm mean:

function samiconductor_sort_links_by_order( $results, $args ) {
    echo print_r($args); // nothing

    function order($a, $b) {
        $a_order = get_option( "link_order_$a->link_id", 0 );
        $b_order = get_option( "link_order_$b->link_id", 0 );

        if ( $a_order == $b_order ) {
            return 0;
        }
        return ( $a_order > $b_order ) ? -1 : 1;
    }

    usort( $results, order );

    return array_reverse($results);
}
add_filter( 'get_bookmarks', 'samiconductor_sort_links_by_order' );

And here's the get_bookmarks function:

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' => ''
    );

    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );

    $cache = array();
    $key = md5( serialize( $r ) );
    if ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) {
        if ( is_array($cache) && isset( $cache[ $key ] ) )
            return apply_filters('get_bookmarks', $cache[ $key ], $r );
    }

    if ( !is_array($cache) )
        $cache = array();

    $inclusions = '';
    if ( !empty($include) ) {
        $exclude = '';  //ignore exclude, category, and category_name params if using include
        $category = '';
        $category_name = '';
        $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) . ' ';
            }
        }
    }
    if (!empty($inclusions))
        $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) . ' ';
            }
        }
    }
    if (!empty($exclusions))
        $exclusions .= ')';

    if ( !empty($category_name) ) {
        if ( $category = get_term_by('name', $category_name, 'link_category') ) {
            $category = $category->term_id;
        } else {
            $cache[ $key ] = array();
            wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );
            return apply_filters( 'get_bookmarks', array(), $r );
        }
    }

    if ( ! empty($search) ) {
        $search = like_escape($search);
        $search = " AND ( (link_url LIKE '%$search%') OR (link_name LIKE '%$search%') OR (link_description LIKE '%$search%') ) ";
    }

    $category_query = '';
    $join = '';
    if ( !empty($category) ) {
        $incategories = preg_split('/[\s,]+/',$category);
        if ( count($incategories) ) {
            foreach ( $incategories as $incat ) {
                if (empty($category_query))
                    $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' ';
                else
                    $category_query .= ' OR tt.term_id = ' . intval($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 ( $show_updated && get_option('links_recently_updated_time') ) {
        $recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL " . get_option('links_recently_updated_time') . " MINUTE) >= NOW(), 1,0) as recently_updated ";
    } else {
        $recently_updated_test = '';
    }

    $get_updated = ( $show_updated ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';

    $orderby = strtolower($orderby);
    $length = '';
    switch ($orderby) {
        case 'length':
            $length = ", CHAR_LENGTH(link_name) AS length";
            break;
        case 'rand':
            $orderby = 'rand()';
            break;
        default:
            $orderparams = array();
            foreach ( explode(',', $orderby) as $ordparam )
                $orderparams[] = 'link_' . trim($ordparam);
            $orderby = implode(',', $orderparams);
    }

    if ( 'link_id' == $orderby )
        $orderby = "$wpdb->links.link_id";

    $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";
    $query .= " $exclusions $inclusions $search";
    $query .= " ORDER BY $orderby $order";
    if ($limit != -1)
        $query .= " LIMIT $limit";

    $results = $wpdb->get_results($query);

    $cache[ $key ] = $results;
    wp_cache_set( 'get_bookmarks', $cache, 'bookmark' );

    return apply_filters('get_bookmarks', $results, $r);
}

As you can see, it should pass $r = wp_parse_args( $args, $defaults ); as the second arg to the filter.

Am I missing something?

Thanks