Querying Products in the Database
In the process of building around Easy Digital Downloads you may find the need to query the database for product data. This document will show several examples of how to do that properly.
Getting a Single Product
The best way to get information about a single product is to use the EDD_Download class. It accepts a
download_id
and returns an object with information about the download. Example:
$download = new EDD_Download( 109 );
This would return an object like this:
EDD_Download Object ( [ID] => 109 [price:EDD_Download:private] => [prices:EDD_Download:private] => [files:EDD_Download:private] => [file_download_limit:EDD_Download:private] => [type:EDD_Download:private] => [bundled_downloads:EDD_Download:private] => [sales:EDD_Download:private] => [earnings:EDD_Download:private] => [notes:EDD_Download:private] => [sku:EDD_Download:private] => [button_behavior:EDD_Download:private] => [post_author] => 2 [post_date] => 2016-03-22 13:30:29 [post_date_gmt] => 2016-03-22 13:30:29 [post_content] => Buy my mp3! [post_title] => My MP3 [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => my-mp3 [to_ping] => [pinged] => [post_modified] => 2016-03-22 13:30:29 [post_modified_gmt] => 2016-03-22 13:30:29 [post_content_filtered] => [post_parent] => 0 [guid] => http://edd.dev/?post_type=download&p=109 [menu_order] => 0 [post_mime_type] => [comment_count] => 0 [filter] => raw [post_type] => download )
Once you have the object there are a wide variety of methods that can be run on it to get information like price, variations etc.
Full documentation for EDD_Download here.
Getting Multiple Products
Downloads are a WordPress custom content type, so it’s possible to get the ids of multiple downloads using
get_posts()
. If you specify the fields parameter properly then get_posts will get only the ids, and the query will be much faster. You’ll also need to at least specify download
for the post_type. Example:
$args = array( 'fields' => 'ids', 'post_type' => 'download', ); $downloads = get_posts( $args );
You may use any option you wish in
get_posts()
to narrow your query.
Full documentation for get_posts()
here.
One additional option not found in the documentation for
get_posts()
is called no_found_rows()
. This removes some data required for pagination, but dramatically speeds up your query. If you need pagination don’t use this option. If you don’t need pagination it would look like this:
$args = array( 'fields' => 'ids', 'post_type' => 'download', 'no_found_rows' => true, ); $downloads = get_posts( $args );
The above query will return an array of download_ids like this:
Array ( [0] => 109 [1] => 82 [2] => 79 [3] => 61 [4] => 42 )
Working With Multiple Products
Once you have an array of download_ids you may simply iterate over the array creating EDD_Download objects like this:
foreach ( $downloads as $key => $download_id ) { $download = new EDD_Download( $download_id ); // do whatever you wish with each object }