Envato Toolkit

Envato Toolkit

Wordpress plugin

Install on Wordpress

App Details

It is a 3 files library + Visual UI, to validate the purchase codes of your customers, get details about specific Envato user (country, city, total followers, total sales, avatar), get his license purchase and support expiration dates, license type he bought, check for updates of purchased plugins and themes and get the download links for them.

Plus – this library has Envato Item Id search feature by providing plugin’s or theme’s name and author. So – yes, this is a tool you, as a developer / author, have been looking for months.

If you are looking for the library-only version to integrate into your plugin / theme, it’s on GitHub:
Envato Toolkit (Standalone)

The main purpose of this plugin is to help you to start much easier without having a headache trying to understand WordPress - Envato Market plugins code, that is the only one built by Envato, and has so complicated and unclear code, that you never get how it works (see example below).

When I tried to create plugin’s [Check for Update] and [Validate Purchase Code] feature-buttons in the plugin myself, and I saw the code of the WordPress - Envato Market plugin, I was shocked how badly it is written and how you should not to code.

For example – you would like to give an error message, if Envato user token is empty, which is a required string, i.e. – pAA0aBCdeFGhiJKlmNOpqRStuVWxyZ44. If you like K.I.S.S., PSR-2, D.R.Y., clean code coding standards and paradigms, you’d probably just have these five lines of code, so that every developer would get it:

$token = get_user_meta(get_current_user_id(), 'envato_token', TRUE); if($token == "") { return new \WP_Error('api_token_error', __('An API token is required.', 'envato-toolkit')); } 

Now lets see how the same task traceback looks like in WordPress - Envato Market plugin:

  1. [Api.php -> request(..)] Check if the token is empty:

    if ( empty( $token ) ) { return new WP_Error( 'api_token_error', __( 'An API token is required.', 'envato-market' ) ); } 
  2. [Api.php -> request(..)] Parse it from another string:

    $token = trim( str_replace( 'Bearer', '', $args['headers']['Authorization'] ) ); 
  3. [Api.php -> request(..)] Parse it one more time – this time from arguments array:

    public function request( $url, $args = array() ) { $defaults = array( 'timeout' => 20, ); $args = wp_parse_args( $args, $defaults ); } 
  4. [Api.php -> download(..)] Transfer the token variable one more time – this time via params:

    class Envato_Market_API { public function download( $id, $args = array() ) { $url = 'https://api.envato.com/v2/market/buyer/download?item_id=' . $id . '&shorten_url=true'; return $this->request( $url, $args ); } } 
  5. [admin.php -> maybe_deferred_download(..)] Pass it again – this time get it to args array from another method call:

    function maybe_deferred_download( $options ) { $args = $this->set_bearer_args(); $options['package'] = envato_market()->api()->download( $vars['item_id'], $args ); return $options; } 
  6. [admin.php -> set_bearer_args(..)] Wrap the token into multi-dimensional string array:

    $args = array( 'headers' => array( 'Authorization' => 'Bearer ' . $token, ), ); 
  7. [admin.php -> set_bearer_args(..)] Pass the wrapped token one more time – this time get it from get_option:

    foreach ( envato_market()->get_option( 'items', array() ) as $item ) { if ( $item['id'] === $id ) { $token = $item['token']; break; } } 
  8. [admin.php -> get_option(..)] So what’s in this get_option? – Correct, another call to another method – get_options():

    public function get_option( $name, $default = '' ) { $options = self::get_options(); $name = self::sanitize_key( $name ); return isset( $options[ $name ] ) ? $options[ $name ] : $default; } 
  9. [admin.php -> get_options()] Finally, after almost 10 steps in the tree, we are finally getting the original
    WordPress method call, but now I’m getting confused again – what is that option_name variable here:

    public function get_options() { return get_option( $this->option_name, array() ); } 
  10. [envato-market.php -> init_globals()] Here is it is – the option name key name is… Oh wait…
    No it is not here it. It is equals to another variable, who is is put
    in another clean-up function – look like I’m keep seeing this for the 2 time in the tree – the sanitization of sanitization:

    $this->option_name = self::sanitize_key( $this->slug ); 
  11. [envato-market.php -> init_globals()] So the option name key name is the name of $this->slug.
    Now lets see what is the value of $this->slug:

    $this->slug = 'envato-market'; 

So it takes eleven (!) steps to understand one variable. And the whole code of that plugin is like that. The example above was the headache I had, until I realized that I must write a new Envato API Management Toolkit, instead of trying to use what Envato is giving, because otherwise I won’t get anything working ever.

And, I believe, that many other developers had the same issue when tried to create update check feature for their plugins or themes.

So instead of using that library for myself, I decided that I want to help all these developers to save their time, and I’m sharing this code with you. I’m releasing it under MIT license, which allows you to use this code in your plugin without any restrictions for both – free and commercial use.

Plus – I’m giving a promise to you, that this plugin is and will always be 100% free, without any ads, ‘Subscribe’, ‘Follow us’, ‘Check our page’, ‘Get Pro Version’ or similar links.

If you created in hi-quality code a valuable additional functionality to the library and you want to share it with everyone – I’m open here to support your efforts, and add your code to the plugin’s library, so that we all together make this plugin better for authors – the better is the plugin, the better plugins authors will make for their customers. The better quality products we will have on the internet, the happier people will be all over the world.

Finally – the code is poetry – the better is the plugin, the happier is the world.

The pseudo-code of example output of the plugin is this:

Details about you: ---------------------------------------------------------- List of all different plugins you bought: <?php foreach($plugins AS $pluginId => $plugin): ?> <?='Plugin Id: '.$pluginId.', Name: '.$plugin['name'];?>, Licenses: <?php foreach($plugin['licenses'] AS $license): ?> Code: <?=$license['purchase_code'];?>, License: <?=$license['license'];?>, Purchased: <?=$license['license_purchase_date'];?> <?=$license['license_purchase_time'];?>, Expires: <?=$license['support_expiration_date'];?> <?=$license['support_expiration_time'];?>, Support Status: <?=$license['support_active'];?> <?php endforeach; ?> <?php endforeach; ?> List of all different themes you bought: <?php foreach($themes AS $themeId => $theme): ?> <?='Theme Id: '.$themeId.', Name: '.$theme['name'];?>, Licenses: <?php foreach($theme['licenses'] AS $license): ?> Code: <?=$license['purchase_code'];?>, License: <?=$license['license'];?>, Purchased: <?=$license['license_purchase_date'];?> <?=$license['license_purchase_time'];?>, Expires: <?=$license['support_expiration_date'];?> <?=$license['support_expiration_time'];?>, Status: <?=$license['support_active'] == 1 ? "Supported" : "Support Expired";?> <?php endforeach; ?> <?php endforeach; ?> Your summary: Your location is <?=$authorCity;?>, <?=$authorCountry;?>. You've sold your items <?=$authorSales;?> times and you have <?=$authorFollowers;?> followers on Envato. 1. Your Customer's License Details ---------------------------------------------------------- Purchase Code: <?=$targetPurchaseCode;?> Is Valid License: <?=$isValidTargetLicense ? 'Yes' : 'No';?> Buyer Username: <?=$targetLicenseBuyer;?> License Type: <?=$targetLicenseType;?> Purchased At: <?=$targetLicensePurchasedAt;?> Supported Until: <?=$targetLicenseSupportedUntil;?> Support Status: <?=$targetLicenseSupportActive == 1 ? "Supported" : "Support Expired";?> 2. Details About Target Envato User - <?=$targetUsername;?> ---------------------------------------------------------- <?=$targetUsername;?> is located in <?=$targetUserCity;?>, <?=$targetUserCountry;?>. He sold his items <?=$targetUserSales;?> times and has <?=$targetUserFollowers;?> followers on Envato. 3. Status of Purchased Plugin ID - <?=$targetPluginId;?> ---------------------------------------------------------- Plugin Name: <?=$nameOfTargetPluginId;?> Plugin Update Available: <?=$pluginUpdateAvailable ? 'Yes' : 'No';?> Installed Plugin Version: <?=$installedPluginVersion;?> Available Plugin Version: <?=$availablePluginVersion;?> Plugin Update Download URL: <a href="<?=$pluginUpdateDownloadUrl;?>" target="_blank" title="Download newest version">Download newest version</a> 4. Status of Purchased Theme ID - <?=$targetThemeId;?>: ---------------------------------------------------------- Theme Name: <?=$nameOfTargetThemeId;?> Theme Update Available: <?=$themeUpdateAvailable ? 'Yes' : 'No';?> Installed Theme Version: <?=$installedThemeVersion;?> Available Theme Version: <?=$availableThemeVersion;?> Theme Update Download URL: <a href="<?=$themeUpdateDownloadUrl;?>" target="_blank" title="Download newest version">Download newest version</a> 5. Envato Item Id of Purchased Plugin ---------------------------------------------------------- Searched for Name: <?=$targetPluginName;?> Searched for Author: <?=$targetPluginAuthor;?> Found Plugin Id: <?=$foundPluginId;?> 6. Envato Item Id of Purchased Theme ---------------------------------------------------------- Searched for Name: <?=$targetThemeName;?> Searched for Author: <?=$targetThemeAuthor;?> Found Theme Id: <?=$foundThemeId;?> 

And the example input of the output above, it this:

$objToolkit = new EnvatoAPIManager($toolkitSettings); // Details about you $purchasedPlugins = $objToolkit->getPurchasedPluginsWithDetails(); $plugins = array(); foreach($purchasedPlugins AS $pluginId => $purchasedPlugin) { $purchasedPlugin['licenses'] = $objToolkit->getLicensesByItemId($pluginId); $plugins[$pluginId] = $purchasedPlugin; } $purchasedThemes = $objToolkit->getPurchasedThemesWithDetails(); $themes = array(); foreach($purchasedThemes AS $themeId => $purchasedTheme) { $purchasedTheme['licenses'] = $objToolkit->getLicensesByItemId($themeId); $themes[$themeId] = $purchasedTheme; } $authorDetails = $objToolkit->getUserDetails($sanitizedEnvatoUsername); // View vars $view->plugins = $plugins; $view->themes = $themes; if($authorDetails != FALSE) { $view->authorCity = $authorDetails['city']; $view->authorCountry = $authorDetails['country']; $view->authorSales = $authorDetails['sales']; $view->authorFollowers = $authorDetails['followers']; } else { $view->authorCity = ''; $view->authorCountry = ''; $view->authorSales = 0; $view->authorFollowers = 0; } // 1. Details About Target Purchase Code $targetLicenseDetails = $objToolkit->getLicenseDetails($sanitizedTargetPurchaseCode); // View vars $view->targetPurchaseCode = esc_html($sanitizedTargetPurchaseCode); // Ready for print $view->isValidTargetLicense = $objToolkit->isValidLicense($sanitizedTargetPurchaseCode); $view->targetLicenseBuyer = $targetLicenseDetails['buyer_username']; $view->targetLicense = $targetLicenseDetails['license']; $view->targetLicensePurchasedAt = $targetLicenseDetails['license_purchase_date'].' '.$targetLicenseDetails['license_purchase_time']; $view->targetLicenseSupportedUntil = $targetLicenseDetails['support_expiration_date'].' '.$targetLicenseDetails['support_expiration_time']; $view->targetLicenseSupportActive = $targetLicenseDetails['support_active']; // 2. Details About Target Envato User $targetUserDetails = $objToolkit->getUserDetails($sanitizedTargetUsername); // View vars $view->targetUsername = esc_html($sanitizedTargetUsername); // Ready for print $view->targetUserCity = $targetUserDetails['city']; $view->targetUserCountry = $targetUserDetails['country']; $view->targetUserSales = $targetUserDetails['sales']; $view->targetUserFollowers = $targetUserDetails['followers']; // 3. Status of Purchased Plugin ID $availablePluginVersion = $objToolkit->getAvailableVersion($sanitizedTargetPluginId); $pluginUpdateAvailable = version_compare($sanitizedInstalledPluginVersion, $availablePluginVersion, '<'); // View vars $view->targetPluginId = intval($sanitizedTargetPluginId); // Ready for print $view->installedPluginVersion = esc_html($sanitizedInstalledPluginVersion); // Ready for print $view->nameOfTargetPluginId = esc_html($objToolkit->getItemName($sanitizedTargetPluginId)); $view->availablePluginVersion = $availablePluginVersion; $view->pluginUpdateAvailable = $pluginUpdateAvailable; $view->pluginUpdateDownloadUrl = $pluginUpdateAvailable ? $objToolkit->getDownloadUrlIfPurchased($sanitizedTargetPluginId) : ''; // 4. Status of Purchased Theme ID $availableThemeVersion = $objToolkit->getAvailableVersion($sanitizedTargetThemeId); $themeUpdateAvailable = version_compare($sanitizedInstalledThemeVersion, $availableThemeVersion, '<'); // View vars $view->targetThemeId = intval($sanitizedTargetThemeId); // Ready for print $view->installedThemeVersion = esc_html($sanitizedInstalledThemeVersion); // Ready for print $view->nameOfTargetThemeId = esc_html($objToolkit->getItemName($sanitizedTargetThemeId)); $view->availableThemeVersion = $availableThemeVersion; $view->themeUpdateAvailable = $themeUpdateAvailable; $view->themeUpdateDownloadUrl = $themeUpdateAvailable ? $objToolkit->getDownloadUrlIfPurchased($sanitizedTargetThemeId) : ''; // 5. Envato Item Id of Purchased Plugin $view->targetPluginName = esc_html($sanitizedTargetPluginName); // Ready for print $view->targetPluginAuthor = esc_html($sanitizedTargetPluginAuthor); // Ready for print $view->foundPluginId = $objToolkit->getItemIdByPluginAndAuthorIfPurchased($sanitizedTargetPluginName, $sanitizedTargetPluginAuthor); // 6. Envato Item Id of Purchased Theme $view->targetThemeName = esc_html($sanitizedTargetThemeName); // Ready for print $view->targetThemeAuthor = esc_html($sanitizedTargetThemeAuthor); // Ready for print $view->foundThemeId = $objToolkit->getItemIdByThemeAndAuthorIfPurchased($sanitizedTargetThemeName, $sanitizedTargetThemeAuthor); 

Pricing

Starting from $0 per month.

Check Out the AdBlocker Detector Widget

By Common Ninja

AdBlocker DetectorTry For Free!

App Info

Rating

Reviewers

9 reviews

Tags

api
envato
license

Developed By

KestutisIT

Quick & Easy

Find the Best Wordpress plugins for you

Common Ninja has a large selection of powerful Wordpress plugins that are easy to use, fully customizable, mobile-friendly and rich with features — so be sure to check them out!

Testimonial

Testimonial plugins for Wordpress

Galleries

Galleries plugins for Wordpress

SEO

SEO plugins for Wordpress

Contact Form

Contact Form plugins for Wordpress

Forms

Forms plugins for Wordpress

Social Feeds

Social Feeds plugins for Wordpress

Social Sharing

Social Sharing plugins for Wordpress

Events Calendar

Events Calendar plugins for Wordpress

Sliders

Sliders plugins for Wordpress

Analytics

Analytics plugins for Wordpress

Reviews

Reviews plugins for Wordpress

Comments

Comments plugins for Wordpress

Portfolio

Portfolio plugins for Wordpress

Maps

Maps plugins for Wordpress

Security

Security plugins for Wordpress

Translation

Translation plugins for Wordpress

Ads

Ads plugins for Wordpress

Video Player

Video Player plugins for Wordpress

Music Player

Music Player plugins for Wordpress

Backup

Backup plugins for Wordpress

Privacy

Privacy plugins for Wordpress

Optimize

Optimize plugins for Wordpress

Chat

Chat plugins for Wordpress

Countdown

Countdown plugins for Wordpress

Email Marketing

Email Marketing plugins for Wordpress

Tabs

Tabs plugins for Wordpress

Membership

Membership plugins for Wordpress

popup

popup plugins for Wordpress

SiteMap

SiteMap plugins for Wordpress

Payment

Payment plugins for Wordpress

Coming Soon

Coming Soon plugins for Wordpress

Ecommerce

Ecommerce plugins for Wordpress

Customer Support

Customer Support plugins for Wordpress

Inventory

Inventory plugins for Wordpress

Video Player

Video Player plugins for Wordpress

Testimonials

Testimonials plugins for Wordpress

Tabs

Tabs plugins for Wordpress

Social Sharing

Social Sharing plugins for Wordpress

Social Feeds

Social Feeds plugins for Wordpress

Slider

Slider plugins for Wordpress

Reviews

Reviews plugins for Wordpress

Portfolio

Portfolio plugins for Wordpress

Membership

Membership plugins for Wordpress

Forms

Forms plugins for Wordpress

Events Calendar

Events Calendar plugins for Wordpress

Contact

Contact plugins for Wordpress

Comments

Comments plugins for Wordpress

Analytics

Analytics plugins for Wordpress

Common Ninja Apps

Some of the best Common Ninja plugins for Wordpress

Browse our extensive collection of compatible plugins, and easily embed them on any website, blog, online store, e-commerce platform, or site builder.

AdBlocker Detector for Wordpress logo

AdBlocker Detector

Detect ad blockers on your site to maintain visibility into user behavior and support sustainable ad-based monetization.

Mastodon Feed for Wordpress logo

Mastodon Feed

Show Mastodon posts in a live Mastodon feed that keeps content fresh, strengthens your social presence, and helps visitors engage with your updates.

Image Magnifier for Wordpress logo

Image Magnifier

Use an image magnifier to let visitors zoom in on photos, view fine details clearly, and enjoy a more accessible and informative visual experience.

Pinterest Feed for Wordpress logo

Pinterest Feed

Show Pinterest content in a Pinterest feed that keeps your page visually engaging, highlights new ideas, and helps visitors explore fresh inspiration.

Scroll to Top for Wordpress logo

Scroll to Top

A scroll to top button that helps visitors move back to the top of long pages quickly, improving navigation and overall browsing flow.

FAQ for Wordpress logo

FAQ

Add an FAQ section to your site to answer common questions, reduce support requests, and give visitors a smoother and more confident user experience.

All in One Reviews for Wordpress logo

All in One Reviews

Display and manage customer reviews from multiple platforms in one place to build trust and highlight brand credibility.

QR Code for Wordpress logo

QR Code

Use the QR Code Generator to create and display QR codes for URLs, contact info, downloads, locations, and more.

 Headline With Background Image for Wordpress logo

Headline With Background Image

Create headlines with background images that blend text and visuals and let you control animation, position, and fonts.

Image Poll for Wordpress logo

Image Poll

Create interactive image polls that use compelling visuals to boost engagement, gather feedback, and help visitors vote easily.

RSVP Form for Wordpress logo

RSVP Form

Collect event responses with an RSVP form that lets guests register easily, saves submissions, sends notifications, and helps you organize attendance efficiently.

Announcements for Wordpress logo

Announcements

Add announcements to your site to share important updates, keep visitors informed, and guide them toward actions that support engagement and conversions.

Discover Apps By Platform

Discover the best apps for your website

WordPress
Wix
Shopify
Weebly
Webflow
Joomla
PrestaShop
Shift4Shop
WebsiteX5
MODX
Opencart
NopCommerce

Common Ninja Search Engine

The Common Ninja Search Engine platform helps website builders find the best site widgets, apps, plugins, tools, add-ons, and extensions! Compatible with all major website building platforms - big or small - and updated regularly, our Search Engine tool provides you with the business tools your site needs!

Multiple platforms