While there is an API for working with Easy Digital Downloads data, sometimes you might just want to fetch all the downloads you have or query for a specific one.
Downloads are just stored as posts with the post_type of download so just do a get_posts call for them:
$posts = get_posts( array( 'post_type' => 'download', 'post_status' => 'any', 'suppress_filters' => true, 'posts_per_page' => -1, ) );
You can add parameters like meta_key and meta_value to search for specific downloads as needed.
Once you get the posts just loop through and create a new EDD_Download object for them:
$downloads = array(); foreach ( $posts as $post ) { $downloads[] = new EDD_Download( $post->ID ); }
One things that tripped me up was some downloads not being returned. If you’re using the EDD Hide Downloads extension, you’ll need to remove those filters before you call get_posts():
if ( class_exists( 'EDD_Hide_Download' ) ) { remove_filter( 'edd_downloads_query', array( EDD_Hide_Download::get_instance(), 'shortcode_query' ) ); remove_action( 'pre_get_posts', array( EDD_Hide_Download::get_instance(), 'pre_get_posts' ), 9999 ); }
then likely add them back afterwards if you’re still outputting something else during the request.