[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fj73cut1uiRaXcYGjjNQ2A3RmYduw67uiIRO3uQ9g1sA":3},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":13,"num_ratings":14,"last_updated":15,"tested_up_to":16,"requires_at_least":17,"requires_php":18,"tags":19,"homepage":25,"download_link":26,"security_score":27,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30,"vulnerabilities":31,"developer":32,"crawl_stats":29,"alternatives":39,"analysis":145,"fingerprints":188},"themeforest-check","ThemeForest-Check","1.0.4","Japh","https:\u002F\u002Fprofiles.wordpress.org\u002Fjaph\u002F","\u003Cp>A supplement to the Theme-Check plugin that adds checks for ThemeForest’s WordPress Theme Submission Requirements, and removes checks that aren’t relevant in that context.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>The \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Ftheme-check\u002F\" rel=\"ugc\">Theme-Check\u003C\u002Fa> plugin is required for this plugin to work.\u003C\u002Fstrong>\u003C\u002Fp>\n","A supplement to the Theme-Check plugin that adds checks for ThemeForest's WordPress Theme Submission Requirements.",100,22186,86,7,"2013-08-26T01:57:00.000Z","3.6.1","3.5","",[20,21,22,23,24],"check","checker","guideline","review","template","http:\u002F\u002Fthemeforest.net","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fthemeforest-check.1.0.4.zip",85,0,null,"2026-03-15T15:16:48.613Z",[],{"slug":33,"display_name":7,"profile_url":8,"plugin_count":34,"total_installs":35,"avg_security_score":27,"avg_patch_time_days":36,"trust_score":37,"computed_at":38},"japh",4,160,30,84,"2026-04-04T03:38:23.133Z",[40,58,74,97,121],{"slug":41,"name":42,"version":43,"author":44,"author_profile":45,"description":46,"short_description":47,"active_installs":48,"downloaded":49,"rating":28,"num_ratings":28,"last_updated":50,"tested_up_to":51,"requires_at_least":52,"requires_php":18,"tags":53,"homepage":56,"download_link":57,"security_score":27,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"campuspress-theme-check","CampusPress Code Check","1.2.3","Ignacio Cruz Moreno","https:\u002F\u002Fprofiles.wordpress.org\u002Figmoweb\u002F","\u003Cp>This plugin is a fork of Theme Check created by Otto42 and pross. There are just a few checks more for CampusPress users.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Note: Please, do not use this plugin if you don’t have a site in CampusPress network.\u003Cbr \u002F>\nYou can found the original Theme Check \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Ftheme-check\u002F\" rel=\"ugc\">here\u003C\u002Fa>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>It checks plugins and themes against WordPress.org guidelines as well as additional requirements needed to pass in order to be supported on sites hosted by CampusPress and WPMU DEV Hosting.\u003C\u002Fp>\n\u003Cp>Any ‘Warnings’ listed should be fixed before submitting for further manual review.\u003C\u002Fp>\n\u003Ch4>How to use it?\u003C\u002Fh4>\n\u003Col>\n\u003Cli>Download the latest version, upload it to your wp-content\u002Fplugins and activate it in your local development installation.\u003C\u002Fli>\n\u003Cli>New menus should appear under Appereance menu called Theme Check and under Plugins menu called Plugin Check.\u003C\u002Fli>\n\u003Cli>Just select the theme in the selection box and click on \u003Ccode>Check it!\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Fol>\n","A simple and easy way to test your theme or plugin for all the latest WordPress standards and practices. A great theme development tool!",10,2335,"2017-07-28T16:10:00.000Z","4.8.28","3.8",[20,21,24,54,55],"theme","tool","https:\u002F\u002Fgithub.com\u002Figmoweb\u002Ftheme-check","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcampuspress-theme-check.1.2.3.zip",{"slug":59,"name":60,"version":61,"author":62,"author_profile":63,"description":64,"short_description":65,"active_installs":48,"downloaded":66,"rating":11,"num_ratings":67,"last_updated":18,"tested_up_to":68,"requires_at_least":69,"requires_php":70,"tags":71,"homepage":18,"download_link":72,"security_score":11,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":73},"color-changer","Color Changer","1.5","rahulraykor","https:\u002F\u002Fprofiles.wordpress.org\u002Frahulraykor\u002F","\u003Cp>Color Changer:\u003Cbr \u002F>\n\u003Cstrong>Changes color on click\u003C\u002Fstrong>\u003Cbr \u002F>\n\u003Cstrong>picks color at Random\u003C\u002Fstrong>\u003Cbr \u002F>\nNot Any.\u003C\u002Fp>\n","Color Changer is there to help you out when you get bored of seeing the black & white colors of the editor. Click in the Color Changer Button and  &hellip;",1683,1,"4.5.33","3.7","7.2.0",[20,21,24,54,55],"https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcolor-changer.1.5.zip","2026-03-15T10:48:56.248Z",{"slug":75,"name":76,"version":77,"author":78,"author_profile":79,"description":80,"short_description":81,"active_installs":82,"downloaded":83,"rating":84,"num_ratings":85,"last_updated":86,"tested_up_to":87,"requires_at_least":88,"requires_php":89,"tags":90,"homepage":18,"download_link":96,"security_score":11,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"plugin-compatibility-checker","Plugin Compatibility Checker","7.0.4","compatshield","https:\u002F\u002Fprofiles.wordpress.org\u002Fcompatshield\u002F","\u003Cp>The \u003Cstrong>Plugin Compatibility Checker\u003C\u002Fstrong> helps you keep your WordPress site stable and secure by scanning installed plugins for PHP and WordPress version compatibility.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>$1\u002Fmonth License Required (Entry Plan)\u003C\u002Fstrong>\u003Cbr \u002F>\nYou must subscribe to the CompatShield Portal ($1\u002Fmonth recurring) to obtain a \u003Cstrong>license key\u003C\u002Fstrong>. Once activated, you will be able to see plugin compatibility results (up to PHP 8.5) directly inside your WordPress admin.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>📺 Video Tutorial\u003C\u002Fstrong>\u003Cbr \u002F>\nWatch step-by-step how to activate your license & run your first scan:\u003Cbr \u002F>\n\u003Cspan class=\"embed-youtube\" style=\"text-align:center; display: block;\">\u003Ciframe loading=\"lazy\" class=\"youtube-player\" width=\"750\" height=\"422\" src=\"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FPCxhJmO-Tb4?version=3&rel=1&showsearch=0&showinfo=1&iv_load_policy=1&fs=1&hl=en-US&autohide=2&wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\">\u003C\u002Fiframe>\u003C\u002Fspan>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Quick Setup Steps\u003C\u002Fstrong>\u003Cbr \u002F>\n1) Subscribe \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Get your license key from the Portal\u003Cbr \u002F>\n2) Add your domain inside the License tab\u003Cbr \u002F>\n3) Copy your License Key\u003Cbr \u002F>\n4) Paste License Key inside Plugin Settings in WP Admin\u003Cbr \u002F>\n5) Click \u003Cstrong>Validate License\u003C\u002Fstrong>\u003Cbr \u002F>\n6) Click \u003Cstrong>Save Settings\u003C\u002Fstrong>\u003Cbr \u002F>\n7) Go to Plugin Main Page \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Click \u003Cstrong>Rescan\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pro Version (Upgrade)\u003C\u002Fstrong>\u003Cbr \u002F>\nUpgrading to Pro unlocks the full CompatShield Portal Dashboard with advanced features — vulnerability summary, detailed scan results, notifications, historic analysis, plugin issues overview, premium ZIP upload scanning, and multi-layer compatibility intelligence.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Subscribe \u002F Upgrade to Pro:\u003C\u002Fstrong> https:\u002F\u002Fwww.compatshield.com\u002F\u003C\u002Fp>\n\u003Ch3>✨ Key Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>PHP Compatibility Check\u003C\u002Fstrong> – Scan plugins for PHP compatibility.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>$1\u002Fmonth license: Shows PHP compatibility results directly inside WP Plugin backend (up to PHP 8.5)\u003C\u002Fli>\n\u003Cli>Pro license: Deeper breakdowns, insights, and analysis inside Portal Dashboard\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Plugin Rescan\u003C\u002Fstrong> – Quickly rescan whenever you install or update plugins.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Email Notifications (Pro)\u003C\u002Fstrong> – Get notified when scans complete or risks are detected.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Portal Integration (Pro)\u003C\u002Fstrong> – View full detailed results in the CompatShield Portal Dashboard.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Vulnerability Summary (Pro)\u003C\u002Fstrong> – Basic vulnerability insights available in the Portal.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>“No Data” Plugins Handling\u003C\u002Fstrong> – Easily identify custom\u002Fpremium plugins or removed versions not available on WordPress.org.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>🔑 Entry Plan vs Pro Plan\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>PHP Compatibility Check\u003C\u002Fstrong>\u003Cbr \u002F>\n$1 Plan: WP Admin Results up to PHP 8.5\u003Cbr \u002F>\nPro Plan: Detailed compatibility insights in Portal Dashboard\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Vulnerability Summary\u003C\u002Fstrong>\u003Cbr \u002F>\n$1 Plan: Not available\u003Cbr \u002F>\nPro Plan: Available in Portal\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Email Notifications\u003C\u002Fstrong>\u003Cbr \u002F>\n$1 Plan: Not available\u003Cbr \u002F>\nPro Plan: Available\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Portal Dashboard\u003C\u002Fstrong>\u003Cbr \u002F>\n$1 Plan: Not available\u003Cbr \u002F>\nPro Plan: Full access (compatibility + vulnerabilities + detailed summaries + site overview)\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Custom\u002FPremium Plugins ZIP Scanning\u003C\u002Fstrong>\u003Cbr \u002F>\n$1 Plan: Not available\u003Cbr \u002F>\nPro Plan: Supported via Portal ZIP uploader\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n","Scan and check your plugins for PHP and WordPress compatibility. Requires a $1\u002Fmonth Portal subscription to obtain a license key.",8000,85564,76,8,"2025-12-22T15:20:00.000Z","6.9.4","5.0","7.2",[91,92,93,94,95],"php-version","plugin-checker","security","tags-compatibility","vulnerabilities","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fplugin-compatibility-checker.zip",{"slug":98,"name":99,"version":100,"author":101,"author_profile":102,"description":103,"short_description":104,"active_installs":105,"downloaded":106,"rating":107,"num_ratings":108,"last_updated":109,"tested_up_to":110,"requires_at_least":111,"requires_php":112,"tags":113,"homepage":119,"download_link":120,"security_score":27,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"toolkit-for-envato","Envato Toolkit","1.4","KestutisIT","https:\u002F\u002Fprofiles.wordpress.org\u002Fkestutisit\u002F","\u003Cp>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.\u003C\u002Fp>\n\u003Cp>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 \u002F author, have been looking for months.\u003C\u002Fp>\n\u003Cp>If you are looking for the library-only version to integrate into your plugin \u002F theme, it’s on GitHub:\u003Cbr \u002F>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKestutisIT\u002FEnvatoToolkit\" title=\"Envato Toolkit (Standalone)\" rel=\"nofollow ugc\">Envato Toolkit (Standalone)\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>The main purpose of this plugin is to help you to start much easier without having a headache trying to understand \u003Ccode>WordPress - Envato Market\u003C\u002Fcode> 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).\u003C\u002Fp>\n\u003Cp>When I tried to create plugin’s \u003Ccode>[Check for Update]\u003C\u002Fcode> and \u003Ccode>[Validate Purchase Code]\u003C\u002Fcode> feature-buttons in the plugin myself, and I saw the code of the \u003Ccode>WordPress - Envato Market\u003C\u002Fcode> plugin, I was shocked how badly it is written and how you should not to code.\u003C\u002Fp>\n\u003Cp>For example – you would like to give an error message, if Envato user token is empty, which is a required string, i.e. – \u003Ccode>pAA0aBCdeFGhiJKlmNOpqRStuVWxyZ44\u003C\u002Fcode>. 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:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$token = get_user_meta(get_current_user_id(), 'envato_token', TRUE);\nif($token == \"\")\n{\n    return new \\WP_Error('api_token_error', __('An API token is required.', 'envato-toolkit'));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Now lets see how the same task traceback looks like in \u003Ccode>WordPress - Envato Market\u003C\u002Fcode> plugin:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Ccode>[Api.php -> request(..)]\u003C\u002Fcode> Check if the token is empty:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>if ( empty( $token ) )\n{\n    return new WP_Error( 'api_token_error', __( 'An API token is required.', 'envato-market' ) );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[Api.php -> request(..)]\u003C\u002Fcode> Parse it from another string:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$token = trim( str_replace( 'Bearer', '', $args['headers']['Authorization'] ) );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[Api.php -> request(..)]\u003C\u002Fcode> Parse it one more time – this time from arguments array:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>public function request( $url, $args = array() ) {\n    $defaults = array(\n        'timeout' => 20,\n    );\n    $args = wp_parse_args( $args, $defaults );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[Api.php -> download(..)]\u003C\u002Fcode> Transfer the token variable one more time – this time via params:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>class Envato_Market_API {\n    public function download( $id, $args = array() ) {\n        $url = 'https:\u002F\u002Fapi.envato.com\u002Fv2\u002Fmarket\u002Fbuyer\u002Fdownload?item_id=' . $id . '&shorten_url=true';\n        return $this->request( $url, $args );\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[admin.php -> maybe_deferred_download(..)]\u003C\u002Fcode> Pass it again – this time get it to args array from another method call:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>function maybe_deferred_download( $options ) {\n    $args = $this->set_bearer_args();\n    $options['package'] = envato_market()->api()->download( $vars['item_id'], $args );\n    return $options;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[admin.php -> set_bearer_args(..)]\u003C\u002Fcode> Wrap the token into multi-dimensional string array:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$args = array(\n    'headers' => array(\n        'Authorization' => 'Bearer ' . $token,\n    ),\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[admin.php -> set_bearer_args(..)]\u003C\u002Fcode> Pass the wrapped token one more time – this time get it from get_option:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>foreach ( envato_market()->get_option( 'items', array() ) as $item ) {\n    if ( $item['id'] === $id ) {\n        $token = $item['token'];\n        break;\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[admin.php -> get_option(..)]\u003C\u002Fcode> So what’s in this \u003Ccode>get_option\u003C\u002Fcode>? – Correct, another call to another method – \u003Ccode>get_options()\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>public function get_option( $name, $default = '' ) {\n    $options = self::get_options();\n    $name = self::sanitize_key( $name );\n    return isset( $options[ $name ] ) ? $options[ $name ] : $default;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[admin.php -> get_options()]\u003C\u002Fcode> Finally, after almost 10 steps in the tree, we are finally getting the original\u003Cbr \u002F>\nWordPress method call, but now I’m getting confused again – what is that \u003Ccode>option_name\u003C\u002Fcode> variable here:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>public function get_options() {\n    return get_option( $this->option_name, array() );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[envato-market.php -> init_globals()]\u003C\u002Fcode> Here is it is – the \u003Ccode>option name\u003C\u002Fcode> key name is… Oh wait…\u003Cbr \u002F>\nNo it is not here it. It is equals to another variable, who is is put\u003Cbr \u002F>\nin another clean-up function – look like I’m keep seeing this for the 2 time in the tree – the sanitization of sanitization:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$this->option_name = self::sanitize_key( $this->slug );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>[envato-market.php -> init_globals()]\u003C\u002Fcode> So the \u003Ccode>option name\u003C\u002Fcode> key name is the name of \u003Ccode>$this->slug\u003C\u002Fcode>.\u003Cbr \u002F>\nNow lets see what is the value of \u003Ccode>$this->slug\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$this->slug        = 'envato-market';\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>So it takes \u003Cstrong>eleven (!)\u003C\u002Fstrong> 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.\u003C\u002Fp>\n\u003Cp>And, I believe, that many other developers had the same issue when tried to create update check feature for their plugins or themes.\u003C\u002Fp>\n\u003Cp>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.\u003C\u002Fp>\n\u003Cp>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.\u003C\u002Fp>\n\u003Cp>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.\u003C\u002Fp>\n\u003Cp>Finally – the code is poetry – \u003Cstrong>the better is the plugin, the happier is the world\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>The pseudo-code of example output of the plugin is this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Details about you:\n----------------------------------------------------------\nList of all different plugins you bought:\n\u003C?php foreach($plugins AS $pluginId => $plugin): ?>\n    \u003C?='Plugin Id: '.$pluginId.', Name: '.$plugin['name'];?>, Licenses:\n    \u003C?php foreach($plugin['licenses'] AS $license): ?>\n        Code: \u003C?=$license['purchase_code'];?>,\n        License: \u003C?=$license['license'];?>,\n        Purchased: \u003C?=$license['license_purchase_date'];?> \u003C?=$license['license_purchase_time'];?>,\n        Expires: \u003C?=$license['support_expiration_date'];?> \u003C?=$license['support_expiration_time'];?>,\n        Support Status: \u003C?=$license['support_active'];?>\n    \u003C?php endforeach; ?>\n\u003C?php endforeach; ?>\n\nList of all different themes you bought:\n\u003C?php foreach($themes AS $themeId => $theme): ?>\n    \u003C?='Theme Id: '.$themeId.', Name: '.$theme['name'];?>, Licenses:\n    \u003C?php foreach($theme['licenses'] AS $license): ?>\n        Code: \u003C?=$license['purchase_code'];?>,\n        License: \u003C?=$license['license'];?>,\n        Purchased: \u003C?=$license['license_purchase_date'];?> \u003C?=$license['license_purchase_time'];?>,\n        Expires: \u003C?=$license['support_expiration_date'];?> \u003C?=$license['support_expiration_time'];?>,\n        Status: \u003C?=$license['support_active'] == 1 ? \"Supported\" : \"Support Expired\";?>\n    \u003C?php endforeach; ?>\n\u003C?php endforeach; ?>\n\nYour summary:\nYour location is \u003C?=$authorCity;?>, \u003C?=$authorCountry;?>.\nYou've sold your items \u003C?=$authorSales;?> times and you have \u003C?=$authorFollowers;?> followers on Envato.\n\n1. Your Customer's License Details\n----------------------------------------------------------\nPurchase Code: \u003C?=$targetPurchaseCode;?>\nIs Valid License: \u003C?=$isValidTargetLicense ? 'Yes' : 'No';?>\nBuyer Username: \u003C?=$targetLicenseBuyer;?>\nLicense Type: \u003C?=$targetLicenseType;?>\nPurchased At: \u003C?=$targetLicensePurchasedAt;?>\nSupported Until: \u003C?=$targetLicenseSupportedUntil;?>\nSupport Status: \u003C?=$targetLicenseSupportActive == 1 ? \"Supported\" : \"Support Expired\";?>\n\n2. Details About Target Envato User - \u003C?=$targetUsername;?>\n----------------------------------------------------------\n\u003C?=$targetUsername;?> is located in \u003C?=$targetUserCity;?>, \u003C?=$targetUserCountry;?>.\nHe sold his items \u003C?=$targetUserSales;?> times and has \u003C?=$targetUserFollowers;?> followers on Envato.\n\n3. Status of Purchased Plugin ID - \u003C?=$targetPluginId;?>\n----------------------------------------------------------\nPlugin Name: \u003C?=$nameOfTargetPluginId;?>\nPlugin Update Available: \u003C?=$pluginUpdateAvailable ? 'Yes' : 'No';?>\nInstalled Plugin Version: \u003C?=$installedPluginVersion;?>\nAvailable Plugin Version: \u003C?=$availablePluginVersion;?>\nPlugin Update Download URL:\n\u003Ca href=\"\u003C?=$pluginUpdateDownloadUrl;?>\" target=\"_blank\" title=\"Download newest version\">Download newest version\u003C\u002Fa>\n\n4. Status of Purchased Theme ID - \u003C?=$targetThemeId;?>:\n----------------------------------------------------------\nTheme Name: \u003C?=$nameOfTargetThemeId;?>\nTheme Update Available: \u003C?=$themeUpdateAvailable ? 'Yes' : 'No';?>\nInstalled Theme Version: \u003C?=$installedThemeVersion;?>\nAvailable Theme Version: \u003C?=$availableThemeVersion;?>\nTheme Update Download URL:\n\u003Ca href=\"\u003C?=$themeUpdateDownloadUrl;?>\" target=\"_blank\" title=\"Download newest version\">Download newest version\u003C\u002Fa>\n\n5. Envato Item Id of Purchased Plugin\n----------------------------------------------------------\nSearched for Name: \u003C?=$targetPluginName;?>\nSearched for Author: \u003C?=$targetPluginAuthor;?>\nFound Plugin Id: \u003C?=$foundPluginId;?>\n\n6. Envato Item Id of Purchased Theme\n----------------------------------------------------------\nSearched for Name: \u003C?=$targetThemeName;?>\nSearched for Author: \u003C?=$targetThemeAuthor;?>\nFound Theme Id: \u003C?=$foundThemeId;?>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>And the example input of the output above, it this:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$objToolkit = new EnvatoAPIManager($toolkitSettings);\n\n\u002F\u002F Details about you\n$purchasedPlugins = $objToolkit->getPurchasedPluginsWithDetails();\n$plugins = array();\nforeach($purchasedPlugins AS $pluginId => $purchasedPlugin)\n{\n    $purchasedPlugin['licenses'] = $objToolkit->getLicensesByItemId($pluginId);\n    $plugins[$pluginId] = $purchasedPlugin;\n}\n\n$purchasedThemes = $objToolkit->getPurchasedThemesWithDetails();\n$themes = array();\nforeach($purchasedThemes AS $themeId => $purchasedTheme)\n{\n    $purchasedTheme['licenses'] = $objToolkit->getLicensesByItemId($themeId);\n    $themes[$themeId] = $purchasedTheme;\n}\n\n$authorDetails = $objToolkit->getUserDetails($sanitizedEnvatoUsername);\n\u002F\u002F View vars\n$view->plugins = $plugins;\n$view->themes = $themes;\nif($authorDetails != FALSE)\n{\n    $view->authorCity = $authorDetails['city'];\n    $view->authorCountry = $authorDetails['country'];\n    $view->authorSales = $authorDetails['sales'];\n    $view->authorFollowers = $authorDetails['followers'];\n} else\n{\n    $view->authorCity = '';\n    $view->authorCountry = '';\n    $view->authorSales = 0;\n    $view->authorFollowers = 0;\n}\n\n\u002F\u002F 1. Details About Target Purchase Code\n$targetLicenseDetails = $objToolkit->getLicenseDetails($sanitizedTargetPurchaseCode);\n\u002F\u002F View vars\n$view->targetPurchaseCode = esc_html($sanitizedTargetPurchaseCode); \u002F\u002F Ready for print\n$view->isValidTargetLicense = $objToolkit->isValidLicense($sanitizedTargetPurchaseCode);\n$view->targetLicenseBuyer = $targetLicenseDetails['buyer_username'];\n$view->targetLicense = $targetLicenseDetails['license'];\n$view->targetLicensePurchasedAt = $targetLicenseDetails['license_purchase_date'].' '.$targetLicenseDetails['license_purchase_time'];\n$view->targetLicenseSupportedUntil = $targetLicenseDetails['support_expiration_date'].' '.$targetLicenseDetails['support_expiration_time'];\n$view->targetLicenseSupportActive = $targetLicenseDetails['support_active'];\n\n\u002F\u002F 2. Details About Target Envato User\n$targetUserDetails = $objToolkit->getUserDetails($sanitizedTargetUsername);\n\u002F\u002F View vars\n$view->targetUsername = esc_html($sanitizedTargetUsername); \u002F\u002F Ready for print\n$view->targetUserCity = $targetUserDetails['city'];\n$view->targetUserCountry = $targetUserDetails['country'];\n$view->targetUserSales = $targetUserDetails['sales'];\n$view->targetUserFollowers = $targetUserDetails['followers'];\n\n\u002F\u002F 3. Status of Purchased Plugin ID\n$availablePluginVersion = $objToolkit->getAvailableVersion($sanitizedTargetPluginId);\n$pluginUpdateAvailable = version_compare($sanitizedInstalledPluginVersion, $availablePluginVersion, '\u003C');\n\u002F\u002F View vars\n$view->targetPluginId = intval($sanitizedTargetPluginId); \u002F\u002F Ready for print\n$view->installedPluginVersion = esc_html($sanitizedInstalledPluginVersion); \u002F\u002F Ready for print\n$view->nameOfTargetPluginId = esc_html($objToolkit->getItemName($sanitizedTargetPluginId));\n$view->availablePluginVersion = $availablePluginVersion;\n$view->pluginUpdateAvailable = $pluginUpdateAvailable;\n$view->pluginUpdateDownloadUrl = $pluginUpdateAvailable ? $objToolkit->getDownloadUrlIfPurchased($sanitizedTargetPluginId) : '';\n\n\u002F\u002F 4. Status of Purchased Theme ID\n$availableThemeVersion = $objToolkit->getAvailableVersion($sanitizedTargetThemeId);\n$themeUpdateAvailable = version_compare($sanitizedInstalledThemeVersion, $availableThemeVersion, '\u003C');\n\u002F\u002F View vars\n$view->targetThemeId = intval($sanitizedTargetThemeId); \u002F\u002F Ready for print\n$view->installedThemeVersion = esc_html($sanitizedInstalledThemeVersion); \u002F\u002F Ready for print\n$view->nameOfTargetThemeId = esc_html($objToolkit->getItemName($sanitizedTargetThemeId));\n$view->availableThemeVersion = $availableThemeVersion;\n$view->themeUpdateAvailable = $themeUpdateAvailable;\n$view->themeUpdateDownloadUrl = $themeUpdateAvailable ? $objToolkit->getDownloadUrlIfPurchased($sanitizedTargetThemeId) : '';\n\n\u002F\u002F 5. Envato Item Id of Purchased Plugin\n$view->targetPluginName = esc_html($sanitizedTargetPluginName); \u002F\u002F Ready for print\n$view->targetPluginAuthor = esc_html($sanitizedTargetPluginAuthor); \u002F\u002F Ready for print\n$view->foundPluginId = $objToolkit->getItemIdByPluginAndAuthorIfPurchased($sanitizedTargetPluginName, $sanitizedTargetPluginAuthor);\n\n\u002F\u002F 6. Envato Item Id of Purchased Theme\n$view->targetThemeName = esc_html($sanitizedTargetThemeName); \u002F\u002F Ready for print\n$view->targetThemeAuthor = esc_html($sanitizedTargetThemeAuthor); \u002F\u002F Ready for print\n$view->foundThemeId = $objToolkit->getItemIdByThemeAndAuthorIfPurchased($sanitizedTargetThemeName, $sanitizedTargetThemeAuthor);\n\u003C\u002Fcode>\u003C\u002Fpre>\n","Validate purchase code, check for item update & support expiration, download newest version, lookup for user details, search for Envato item id & more",6000,126000,56,9,"2021-04-26T18:00:00.000Z","5.7.15","4.6","5.4",[114,115,116,117,118],"api","envato","license","purchase-validator","update-checker","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Ftoolkit-for-envato\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Ftoolkit-for-envato.zip",{"slug":122,"name":123,"version":124,"author":125,"author_profile":126,"description":127,"short_description":128,"active_installs":129,"downloaded":130,"rating":13,"num_ratings":131,"last_updated":132,"tested_up_to":87,"requires_at_least":88,"requires_php":133,"tags":134,"homepage":140,"download_link":141,"security_score":142,"vuln_count":143,"unpatched_count":28,"last_vuln_date":144,"fetched_at":30},"wp24-domain-check","WP24 Domain Check","1.12.0","WP24","https:\u002F\u002Fprofiles.wordpress.org\u002Fwp24dotorg\u002F","\u003Cp>WP24 Domain Check allows users to check domains if they are free for registration. The responsive form could be easily intregrated via shortcode or widget. Labels and colors are customizeable through the settings page.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Features\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Easy integration via shortcode or widget\u003C\u002Fli>\n\u003Cli>Ajax based search (no page reload required)\u003C\u002Fli>\n\u003Cli>Define a list of testable TLDs\u003C\u002Fli>\n\u003Cli>Drop-down list (select the TLD from predefinded list)\u003C\u002Fli>\n\u003Cli>Free text input (type TLD into domain name field)\u003C\u002Fli>\n\u003Cli>Over 1,600 supported TLDs\u003C\u002Fli>\n\u003Cli>Add custom whois servers\u003C\u002Fli>\n\u003Cli>Possibility of checking every TLD\u003C\u002Fli>\n\u003Cli>Internationalized domain name (IDN) support\u003C\u002Fli>\n\u003Cli>Check all TLDs simultaneously (asynchronous)\u003C\u002Fli>\n\u003Cli>Show detailed whois information (if domain is registered)\u003C\u002Fli>\n\u003Cli>Provide price and purchase link for each TLD\u003C\u002Fli>\n\u003Cli>WooCommerce integration\u003C\u002Fli>\n\u003Cli>Responsive design\u003C\u002Fli>\n\u003Cli>Bot protection with Google reCAPTCHA or Cloudflare Turnstile\u003C\u002Fli>\n\u003Cli>Customization of labels and colors\u003C\u002Fli>\n\u003Cli>WPML and Polylang compatible\u003C\u002Fli>\n\u003C\u002Ful>\n","Check (whois) domain names for availability. Easy integration via shortcode or widget.",5000,118926,32,"2026-01-11T10:24:00.000Z","7.0.0",[135,136,137,138,139],"domain","domain-check","domain-checker","domaincheck","whois","https:\u002F\u002Fwp24.org\u002Fplugins\u002Fdomain-check","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwp24-domain-check.1.12.0.zip",99,2,"2024-12-26 00:00:00",{"attackSurface":146,"codeSignals":172,"taintFlows":179,"riskAssessment":180,"analyzedAt":187},{"hooks":147,"ajaxHandlers":168,"restRoutes":169,"shortcodes":170,"cronEvents":171,"entryPointCount":28,"unprotectedCount":28},[148,154,158,161,165],{"type":149,"name":150,"callback":151,"file":152,"line":153},"action","init","load_plugin_textdomain","class-themeforest-check.php",67,{"type":149,"name":155,"callback":156,"file":152,"line":157},"admin_enqueue_scripts","enqueue_admin_styles",70,{"type":149,"name":155,"callback":159,"file":152,"line":160},"enqueue_admin_scripts",71,{"type":149,"name":162,"callback":163,"file":152,"line":164},"themecheck_checks_loaded","disable_checks",73,{"type":149,"name":162,"callback":166,"file":152,"line":167},"add_checks",74,[],[],[],[],{"dangerousFunctions":173,"sqlUsage":174,"outputEscaping":176,"fileOperations":28,"externalRequests":28,"nonceChecks":28,"capabilityChecks":28,"bundledLibraries":178},[],{"prepared":28,"raw":28,"locations":175},[],{"escaped":28,"rawEcho":28,"locations":177},[],[],[],{"summary":181,"deductions":182},"The \"themeforest-check\" v1.0.4 plugin exhibits a strong security posture based on the provided static analysis. The absence of any identified dangerous functions, direct SQL queries, unescaped output, file operations, or external HTTP requests is commendable.  Furthermore, the lack of any identified vulnerabilities in its history suggests a well-maintained and secure codebase.\n\nHowever, the analysis also highlights a complete absence of security mechanisms like nonce checks and capability checks. While the current lack of entry points (AJAX, REST API, shortcodes) means this is not an immediate risk, it represents a significant potential weakness. If the plugin's functionality were to expand in the future to include any of these entry points without the proper implementation of authentication and authorization, it could easily become vulnerable. The clean code signals are a strength, but the lack of defensive programming for potential future expansion is a notable concern.",[183,185],{"reason":184,"points":48},"Missing nonce checks",{"reason":186,"points":48},"Missing capability checks","2026-03-16T20:58:31.162Z",{"wat":189,"direct":198},{"assetPaths":190,"generatorPatterns":193,"scriptPaths":194,"versionParams":195},[191,192],"\u002Fwp-content\u002Fplugins\u002Fthemeforest-check\u002Fcss\u002Fadmin.css","\u002Fwp-content\u002Fplugins\u002Fthemeforest-check\u002Fjs\u002Fadmin.js",[],[192],[196,197],"themeforest-check-admin-styles?ver=","themeforest-check-admin-script?ver=",{"cssClasses":199,"htmlComments":200,"htmlAttributes":201,"restEndpoints":202,"jsGlobals":203,"shortcodeOutput":205},[],[],[],[],[204],"tfc_intro",[]]