Envato Tookit - reborn - a new Edge / Market API plugin for all authors for free! (Unofficial)

Shortly - 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 quality and complexity of the WordPress - Envato Market plugin, that is released by Envato, I was shocked how badly it is written and how you should not to code. So, instead of being sad, or just a telling a criticism and suggesting Envato to send that plugin developer to coding campus ASAP, I decided to help all authors and re-develop WordPress - Envato Market and deprecated Wordpress Envato Toolkit plugins, and create a new one Envato Toolkit plugin for WordPress, that is lightweight, easy to edit, based on standards and high quality code paradigms (PSR-2, PSR-4 autoloaders, D.R.Y, K.I.S.S.), and most important - scalable.

So I’m releasing the new API code libraries (standalone) and a version of them in a MVP-like plugin - NOW. And I’m giving this to everyone, under the best, almost unlimited - MIT license, to use it’s code anyhow you want for both - unlimited free or unlimited commercial use. Also, I do really hope that Envato team will accept this plugin donation, as a revamp of the original Wordpress Envato Toolkit, because - trust me on this - I do know how hard is currently for authors to accomplish 5 simple tasks to their plugin by using Envato Edge / Market API:

  1. customer’s purchase code validation,
  2. check of customer’s support expiration date (by just having a simple string in plugin’s admin page of it’s license support status - is it already expired or not yet),
  3. have a [Check for Update] button in plugin admin,
  4. get a newest available plugin’s / theme’s version number,
  5. a get a download link displayed for to the new plugin’s / theme’s version (without leaving WordPress admin, installing and keeping updated other plugins, or going and checking Envato website)

It is pretty much - IMPOSIBLE - with what currently Envato gives, or by trying to understand the code of WordPress - Envato Market. Or you have to dedicate a whole team work for a whole week only for these simple tasks. So I really hope, that finally authors can add these mandatory features within one day, by just taking the code of 3 libraries I’m releasing today. And for those who want to start even easier, I made a these libraries version with include to a small, MVP-like, WordPress plugin.

Envato Toolkit - Reborn

GitHub / Download Link (Standalone): https://github.com/KestutisIT/EnvatoToolkit

WordPress plugin (w.org):
https://wordpress.org/plugins/toolkit-for-envato/

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.

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).

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'];?>,
		Type: <?=$license['license_type'];?>,
		Purchased: <?=$license['license_purchase_date'];?>,
		Expires: <?=$license['support_expiration_date'];?>
		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'];?>,
		Type: <?=$license['license_type'];?>,
		Purchased: <?=$license['license_purchase_date'];?>,
		Expires: <?=$license['support_expiration_date'];?>,
		Status: <?=$license['support_active'] == 1 ? "Supported" : "Support Expired";?>
	<?php endforeach; ?>
<?php endforeach; ?>

Your summary:
Your location is <?=$authorCity;?>, <?=$authorCountry;?>.
You&#39;ve sold your items <?=$authorSales;?> times and you have <?=$authorFollowers;?> followers on Envato.

1. Your Customer&#39;s License Details
----------------------------------------------------------
Purchase Code: <?=$targetPurchaseCode;?>
Is Valid License: <?=$isValidTargetLicense ? 'Yes' : 'No';?>
Buyer Username: <?=$targetLicenseBuyer;?>
License Type: <?=$targetLicenseType;?>
Purchased At: <?=$targetLicensePurchaseDate;?>
Supported Until: <?=$targetLicenseSupportExpiration;?>
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->targetLicenseType = $targetLicenseDetails['license_type'];
$view->targetLicensePurchaseDate = $targetLicenseDetails['license_purchase_date'];
$view->targetLicenseSupportExpiration = $targetLicenseDetails['support_expiration_date'];
$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);

Screenshots


8 Likes

1.1 update released
Release summary: Removed 1 redundant API class method that should be handled by the controller, not a model. Plus, for security reasons, changelog.txt is no more in the plugin folder (so that there would be no way to discover the actual plugin version by public.

Also now it is added to the WordPress.org plugin’s repository:
https://wordpress.org/plugins/toolkit-for-envato/

I hope this will help authors to discover the toolkit quicker, and things like version checking and purchase code validation become more common used and more standardized.

Envato Toolkit v1.2 - update released

Release summary: Added support for the situations if Envato API is down, plus added detailed error message handler.

Envato Toolkit v1.3 - update released

Release summary: Added support for purchase time and license expiration time. Plus split to two fields on ‘license_type’ to ‘license’ and ‘license_type’.

Update reasoning: It evolved naturally, while developing my own plugin with all these validations, I saw that for general-purpose use, when I use “Envato Toolkit” just as one of libraries, and I want to have things standardized, the time parameter is required to match the standards with other libraries, or just with local input on the site, there UNIX_TIMESTAMP() is given and then can be parsed for both - date and time. So I’ve added this to the Envato Toolkit standalone library and the plugin as well.
Regarding the ‘license’ and ‘license_type’ - again, it evolved naturally. The ‘license’ suppose to be a text string in one language to read, while ‘license_type’ should be used to transfer data via API as a keyword for translations and comparing - ‘EXTENDED’, "REGULAR’ or something else, i.e. in my case the 3rd option is ‘PARTNER’, when the license needs to be given to partner company for i.e. testing or partnership purpose.

1 Like

Ok, so the plugin just hit 1000+ active installations on w.org counter with nearly 3000 downloads, and all this happened within 30 days since it was launched and that number don’t even include the GitHub downloads and libraries use directly.

So it looks like that this tool is really beloved by Envato authors. Thank you.

I’m happy to announce that another goal has been reached today - over 2000 active installations by Envato authors of Envato Toolkit (combined with over 5000 overall downloads), make this plugin & library a top-notch item :).

1 Like

One more goal has been reached today - the plugin already has over 3,000 active installations by Envato authors of Envato Toolkit, and almost 8,500 downloads in all-time. And by reaching 3,000 active installations milestone, plugin appears to be moving next week to the 1st page of plugins list by the ‘API’ keyword in W.org plugin’s library ( https://wordpress.org/plugins/tags/api/ ), making it even more noticeable tool :).

1 Like

Ok, another great goal has been hit - Envato Toolkit plugin just crossed the 10,000 downloads milestone :).

@KestutisIT Amazing work!!! PHP Rocks :grinning: Thank you for such a great presentation.

1 Like

So the Envato Toolkit plugin just proved how valuable it is for Envato Authors. Today it hit 10,000 active installations limit together with nearly 36,000 overall downloads, and got into in between TOP 2000 WordPress plugins (Popular Plugins) :).

Hello @KestutisIT

  1. While I understand what effort you put into this plugin/code, I’m afraid Envato Market is the official plugin and Envato encourages authors to integrate it and customers to use it (“so that customers have a reliable and consistent experience across products.” as Envato said here)

  2. Also, I see you are using the word “Envato” in the name of your plugin on the public WordPress repository. I really think you should contact quickly Envato Help about this, because this word has a trademark on it and it can’t be used like this, from what I know.

  3. Also, please show some respect for Envato and for Envato Community members:

  1. Instead of this, you could join your effort with the Envato Market plugin developers and why not, contribute to the project? For instance, I’m sure some pull requests on github would help :wink:

Hi, hevada, it looks like you out of the context here. It was discussed with Collis, and Envato hosted. The plugin was created because Envato did not cared about the authors. And I listed the 100 reasons what Envato is doing bad in the letter. WordPress Envato Market is the worst quality code plugin in the whole planet, and I listed step-by-step how bad it is. Plus, that plugin suits ONLY for Envato Customers. It has NOTHING to do or to help the authors to protect their products. And the authors are more important here, in Envato, I believe, because without authors there would be no Envato at all. So I created what does authors needs. And it just proved that it works much more and that I was correct. It has 100 times more success that Envato’s first old version. So that plugin is a must. And it does uses Envato’s name as it HAS to use it, because that was Envato team’s job to make this plugin, but they did not done that. Anyway, I release it not under GPL, but under MIT license, that is much more flexible and allows Envato to take-over the plugin management later - I expect that it will be listed as official Envato plugin in home page and will be under Envato control later or sooner, until then I will maintain it, because if Envato don’t care about the authors, there should be at least one guy in the planet who cares about the authors - so I do help authors. So, no, I should not join the Envato WordPress Market plugin, as that plugin has totally different purpose - it is for customers who needs to run mass-updates of the themes, not for the authors who needs to integrate specific library files for activation and license validation, nor to validate purchase codes (the API with Token instead of purchase code is the BAD way, and Cambridge Analytica and Facebook scandal just proved that for the whole world what I was telling for years. So no, the plugin name won’t be changed (despite that the url is make as ‘toolkit-for-envato’ to meet W.org standards), as otherwise I would just have to create a plugin to other marketplace. So Envato Hosted and Collis knows about this, and is good that they were not against my efforts, I did let them know what I’m doing before starting, why I’m doing that, and what is the goal of that and why that is a MUST for authors and why does the ‘Envato WordPress Market’ has no usability at all for authors - theme and plugin developers.

So if you have questions regarding this - talk with Envato Hosted, Collis, and the Lead of Envato WordPress Market, who took over that role last year, as I discussed with all them.

Have a good day.

Well, let’s hope this is right.

But if these two plugins do different things, why you have to mention then everywhere the Envato Market plugin and its code?

I might be out of context, but you still have to be more respectful with Envato and with other developers.

Still, I don’t understand why you have to attack Envato (even in your plugin description on wordpress dot org) if that’s so:

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 ( https://wordpress.org/plugins/toolkit-for-envato/ )

That is because other developers would know, who will need to do i.e. license validation in their plugin, and they would now make the mistake I did, because I was wrongly driven by Envato website that I should use Envato Market, and I tried to integrate the library based on it’s code, and I saw that it is pretty much impossible, just because the code is unreadable - it takes 9 steps and 9 different functions and classed to pass one parameter etc. So then I created this plugin. With the right code. The code that works, follows coding standards, and most important - can be taken and integrated in 9 minutes. Now regarding the authors, I’m not sure if you are aware about what Envato authors thinks about Envato actions, when I comes more Facebook-like company version Tesla-like company. I don’t like Facebook, as well as many authors (thousands of them) don’t like that either. I don’t want that my plugin would be integrated into Envato, nor I don’t want it to be stolen, and there is absolutely no help from Envato fighting with DCMA’s cryptocurrency stores and warez. Only the authors having over 1M USD in Sales, can hire those lawyers for that fight, there is no help for small authors until they reach Level 10.

I’m not going to argue with you :slight_smile:

I am helping with forum moderation, I am only an Envato author like you and all I’m asking is respect for Envato and for community members. We are a friendly community after all, aren’t we?

Regarding the code (and here is only my personal opinion as a programmer and Envato author), I saw the Envato Market plugin code and I find it absolutely fine and easy to read. But of course, developers will always have different opinions regarding code, aren’t we? :wink:

By the way, do you know that on github there is a set of PHP Code Sniffer rules (updated regularly) made especially for WordPress? When added to your development IDE, they can show you different errors/warnings in the code? (for instance “Variable “objETConfiguration” is not in valid snake_case format”). This PHPSniffer rules help developers write code according to WP standards. it’s worth a try :wink:

WordPress coding ideas are not the quality standard. Quality code standard is PSR-2, PSR-4 Autoloaders and so on. I make S.O.L.I.D., 100% MVC + Templates OOP code. If you don’t see issues in that code, when then that means that you are far away from being a software architect. I’m an architect - I create coding standards, my code is used in University, I’m a big part of Vilnius University Master Degree of Software Engineering course flag carries, and I do push everyone to go and code better. So I can see that code, and every architect would see that. There is such as thing as S.O.L.I.D., as MVC, etc., that a platform-independent rules of great code architecture followed by the world. I do push that a lot via W.org community as well (I contributed WordPress and open-source many times). So even at WordPress site the things are changing, starting from the way how we understand what is the plugin, and even at Envato many authors have no idea what is theme and what is plugin, and that’s why Matt (ma.tt) is angry. But things are changing. I looked to Envato plugin code last May (so look to that date code version, maybe something changed after that), and I saw that this code would not pass any course lector assignment valuation in Vilnius University. Well, it is Top 400 university in the world, and faculty of Mathematics and Information is at Top 200 in the world, so many people don’t even go to university, nor take Master Degree, nor takes the university that has QS rating at all, not even talking about Top 500. But lack of education or knowledge is not an excuse to make a code, that then will have issues later (i.e. even Yahoo got hacked with 3 billion accounts hacked). So being a great architect, is not an easy task. But Envato plugins has to be made by great architects, because that is top level, above the authors, and authors, who get their plugins inside the store, already are not just a random developers, they have at least Average+ skills. So Envato has to show the path here, and that path has to be correct. If Envato shows you the path, that says that it is impossible to protect intellectual property (because the code is unreadable, or ‘because we don’t have time’, or because we can’t help you with DCMA sending), then it breaks all the idea of selling anything online. And regarding WordPress coding standard, you have to take it with caution, nobody at w.org would say anything if you follow the PSR-2 and PSR-4 Autoloaders instead. And in top engineering companies I saw that even PSR is not enough. They create even more detailed rules of how to create a good quality code. As always remember two basic principles of software engineering - K.I.S.S. and D.R.Y. (Keep it simple and stupid and do not repeat yourself) - WordPress Envato Market plugin did not followed none of these (at least in May, 2017, when I looked to that plugin code and created this plugin instead.

Well, I could debate this with you for days :wink: I was an architect too, but for Java Enterprise applications, not for PHP plugins/etc - BUT this would not help anyone :slight_smile:

I wish you all the best wit the plugin then, only a last friendly reminder: please remember to show respect for Envato and for other developers when posting on Envato forums.

Peace :slight_smile:
All the best!

1 Like