[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f61HrQweIOtaYktEz80sSGIKRmanObxsalEA4IzEVQeU":3,"$fSTzhFPg6HDVhXgH_rR14vf4RXrhvNuHxh0NbDq0cPxg":217,"$fPPZ39xrT-xd7jz1UCzi27A8RKWY2WQxG5ZxdV5fSNK8":222},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":11,"num_ratings":11,"last_updated":13,"tested_up_to":14,"requires_at_least":15,"requires_php":16,"tags":17,"homepage":22,"download_link":23,"security_score":24,"vuln_count":11,"unpatched_count":11,"last_vuln_date":25,"fetched_at":26,"discovery_status":27,"vulnerabilities":28,"developer":29,"crawl_stats":25,"alternatives":36,"analysis":139,"fingerprints":199},"gp-translate-update-api","GP Translate Update API","1.0","meloniq","https:\u002F\u002Fprofiles.wordpress.org\u002Fmeloniq\u002F","\u003Cp>A translate update api for \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fglotpress\u002F\" rel=\"ugc\">GlotPress as a WordPress plugin\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4>Configuration\u003C\u002Fh4>\n\u003Cp>Once you have installed GP Translate Update API, go to your WordPress admin screen and select “Settings > GP Translate Update API”.\u003C\u002Fp>\n","A translate update API for GlotPress as a WordPress plugin.",0,229,"2025-12-09T19:52:00.000Z","6.8.5","4.9","7.4",[18,19,20,21],"api","glotpress","translate","update","https:\u002F\u002Fblog.meloniq.net\u002Fgp-translate-update-api\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fgp-translate-update-api.1.0.zip",100,null,"2026-04-16T10:56:18.058Z","no_bundle",[],{"slug":7,"display_name":7,"profile_url":8,"plugin_count":30,"total_installs":31,"avg_security_score":32,"avg_patch_time_days":33,"trust_score":34,"computed_at":35},16,710,98,1,99,"2026-05-19T23:56:19.235Z",[37,61,82,103,119],{"slug":38,"name":39,"version":40,"author":41,"author_profile":42,"description":43,"short_description":44,"active_installs":45,"downloaded":46,"rating":47,"num_ratings":48,"last_updated":49,"tested_up_to":50,"requires_at_least":51,"requires_php":52,"tags":53,"homepage":58,"download_link":59,"security_score":60,"vuln_count":11,"unpatched_count":11,"last_vuln_date":25,"fetched_at":26},"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,126268,56,9,"2021-04-26T18:00:00.000Z","5.7.15","4.6","5.4",[18,54,55,56,57],"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",85,{"slug":62,"name":63,"version":64,"author":65,"author_profile":66,"description":67,"short_description":68,"active_installs":69,"downloaded":70,"rating":24,"num_ratings":71,"last_updated":72,"tested_up_to":14,"requires_at_least":73,"requires_php":74,"tags":75,"homepage":74,"download_link":80,"security_score":24,"vuln_count":33,"unpatched_count":11,"last_vuln_date":81,"fetched_at":26},"log-http-requests","Log HTTP Requests","1.5.0","Matt Gibbs","https:\u002F\u002Fprofiles.wordpress.org\u002Fmgibbs189\u002F","\u003Ch4>Log and view all WP HTTP requests\u003C\u002Fh4>\n\u003Cp>How long do [core \u002F plugin \u002F theme] update checks take to run? What data about my site is being sent out? What about all those ajax requests? The answers to these questions are just a few clicks away.\u003C\u002Fp>\n\u003Cp>This plugin logs all WP_HTTP requests and displays them in a table listing for easy viewing. It also stores the runtime of each HTTP request.\u003C\u002Fp>\n\u003Ch4>Available Hooks\u003C\u002Fh4>\n\u003Cp>Customize the length (in days) before older log items are removed:\u003C\u002Fp>\n\u003Cpre>\nadd_filter( 'lhr_expiration_days', function( $days ) {\n    return 7; \u002F\u002F default = 1\n});\n\u003C\u002Fpre>\n\u003Cp>Don’t log items from a specific hostname:\u003C\u002Fp>\n\u003Cpre>\nadd_filter( 'lhr_log_data', function( $data ) {\n    if ( false !== strpos( $data['url'], 'wordpress.org' ) ) {\n        return false;\n    }\n    return $data;\n});\n\u003C\u002Fpre>\n\u003Cp>In the above example, the \u003Ccode>$data\u003C\u002Fcode> array keys correspond to columns within the \u003Ccode>lhr_log\u003C\u002Fcode> database table.\u003C\u002Fp>\n\u003Ch4>Important Links\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFacetWP\u002Flog-http-requests\" rel=\"nofollow ugc\">Github \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan>\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n","Log and view all WP HTTP requests",2000,71030,15,"2025-11-11T13:14:00.000Z","5.0","",[18,76,77,78,79],"log","requests","update-checks","wp_http","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Flog-http-requests.zip","2022-10-05 00:00:00",{"slug":83,"name":84,"version":85,"author":84,"author_profile":86,"description":87,"short_description":88,"active_installs":89,"downloaded":90,"rating":91,"num_ratings":92,"last_updated":93,"tested_up_to":94,"requires_at_least":95,"requires_php":74,"tags":96,"homepage":98,"download_link":99,"security_score":100,"vuln_count":101,"unpatched_count":11,"last_vuln_date":102,"fetched_at":26},"poeditor","POEditor","0.9.12","https:\u002F\u002Fprofiles.wordpress.org\u002Faddatwork\u002F","\u003Cp>This plugin will let you manage your POEditor translations directly from WordPress via the POEditor API.\u003C\u002Fp>\n\u003Cp>It will fetch all your projects from POEditor.com, based on your API KEY, and it will scan your \u002Fwp-content\u002F folder for gettext language files (.po and .pot). After this, you can assign files from your WordPress themes or plugins to your POEditor language files and you can import, export or sync your files with the POEditor translations.\u003C\u002Fp>\n\u003Cp>You can find step by step instructions on how to use the POEditor plugin in this \u003Ca href=\"http:\u002F\u002Fblog.poeditor.com\u002Fhow-to-translate-wordpress-themes-and-plugins-using-the-poeditor-localization-plugin\u002F\" rel=\"nofollow ugc\">localization guide\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>If you want to contribute to the localization of this plugin, please go to the \u003Ca href=\"https:\u002F\u002Fpoeditor.com\u002Fjoin\u002Fproject\u002F90c87a6885fac137e7810f31a1a5296f\" rel=\"nofollow ugc\">plugin’s translation page\u003C\u002Fa> and join the translation effort.\u003C\u002Fp>\n\u003Cp>You can also contribute to plugin’s development on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPOEditor\u002Fpoeditor_wp_plugin\" rel=\"nofollow ugc\">GitHub\u003C\u002Fa>.\u003C\u002Fp>\n","This plugin will let you manage your POEditor translations directly from Wordpress via the POEditor API.",600,45982,88,11,"2025-12-08T13:31:00.000Z","6.9.0","3.5",[18,97,20],"localization","https:\u002F\u002Fpoeditor.com\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpoeditor.zip",95,4,"2025-06-05 00:00:00",{"slug":104,"name":105,"version":106,"author":107,"author_profile":108,"description":109,"short_description":110,"active_installs":24,"downloaded":111,"rating":24,"num_ratings":112,"last_updated":113,"tested_up_to":14,"requires_at_least":114,"requires_php":74,"tags":115,"homepage":116,"download_link":117,"security_score":118,"vuln_count":11,"unpatched_count":11,"last_vuln_date":25,"fetched_at":26},"inspect-http-requests","Inspect HTTP Requests","1.0.10","expresstechsoftware","https:\u002F\u002Fprofiles.wordpress.org\u002Fexpresstechsoftware\u002F","\u003Cp>** This plugin is inpired from the work of log-http-requests plugin **\u003C\u002Fp>\n\u003Cp>Monitor all the HTTP Request being made via WP HTTP Methods i.e. wp_remote_get, wp_remote_post Block any request by just a click of button.\u003Cbr \u002F>\nTrack how much time a request like updating core\u002Fplugin\u002Ftheme taking (may be useful for bandwidth consumption analysis),\u003C\u002Fp>\n\u003Cp>This plugin logs all WP_HTTP requests and displays them in a table listing for easy viewing. It also stores the runtime of each HTTP request.\u003C\u002Fp>\n\u003Cp>If you add a base-url manually, e.g. https:\u002F\u002Fapi.woocommerce.com,  there will be no more entries stored for that host.\u003C\u002Fp>\n\u003Ch4>Available Hooks\u003C\u002Fh4>\n\u003Cp>Add the following to wp-config.php for default blocking:\u003C\u002Fp>\n\u003Cpre>\ndefine( 'inspect_http_requests_default_block', true );\n\u003C\u002Fpre>\n\u003Cp>To prevent database littering and performance drain due to sql lookups you can ignore (parts of) hostnames:\u003Cbr \u002F>\n(without this, your own site and wordpress.org are ignored)\u003C\u002Fp>\n\u003Cpre>\ndefine( 'inspect_http_requests_ignored_urls', [\n        'your own site',\n        'wordpress.org',\n        'api.woocommerce.com',\n        'wp-rocket.me',\n        'ip-api.com',\n        'ipinfo.io',\n    'api',\n]);\n\u003C\u002Fpre>\n\u003Ch4>Important Links\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fexpresstechsoftware\u002Finspect-http-requests\" rel=\"nofollow ugc\">Github \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan>\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FFacetWP\u002Flog-http-requests\" rel=\"nofollow ugc\">Github \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan>\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Checkout Our Other Plugins\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fexpresstechsoftwares-memberpress-discord-add-on\u002F\" rel=\"ugc\">Connect MemberPress and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fpmpro-discord-add-on\u002F\" rel=\"ugc\">Connect PaidmembershipPro and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fconnect-learnpress-discord-add-on\u002F\" rel=\"ugc\">Connect LearnPress and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fconnect-gamipress-and-discord\u002F\" rel=\"ugc\">Connect GamiPress and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fconnect-lifterlms-to-discord\u002F\" rel=\"ugc\">Connect LifterLMS and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fwebhook-for-wcfm-vendors\u002F\" rel=\"ugc\">Webhook For WCFM Vendors\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fconnect-learndash-and-discord\u002F\" rel=\"ugc\">Connect LearnDash and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fproduct-questions-answers-for-woocommerce\u002F\" rel=\"ugc\">Product Questions & Answers for WooCommerce\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fultimate-member-discord-add-on\u002F\" rel=\"ugc\">Connect Ultimate Member and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fconnect-badgeos-to-discord\u002F\" rel=\"ugc\">Connect BadgeOS and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fconnect-eduma-theme-to-discord\u002F\" rel=\"ugc\">connect Eduma Theme and Discord\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Fol>\n","Log, view, and Block WP HTTP requests",4838,2,"2025-05-14T23:00:00.000Z","3.0.1",[18,76,77,78,79],"https:\u002F\u002Fwww.expresstechsoftwares.com\u002Finspect-http-requests","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Finspect-http-requests.1.0.10.zip",92,{"slug":120,"name":121,"version":122,"author":123,"author_profile":124,"description":125,"short_description":126,"active_installs":127,"downloaded":128,"rating":11,"num_ratings":11,"last_updated":129,"tested_up_to":14,"requires_at_least":130,"requires_php":131,"tags":132,"homepage":74,"download_link":138,"security_score":24,"vuln_count":11,"unpatched_count":11,"last_vuln_date":25,"fetched_at":26},"api2cart-webhook-helper","Webhook Helper","1.7.5","Developer","https:\u002F\u002Fprofiles.wordpress.org\u002Fapi2cartdev\u002F","\u003Cp>Enhance Your WooCommerce Integration with Extended Webhook Support\u003Cbr \u002F>\nThis plugin was developed by API2Cart to overcome WooCommerce’s native limitations and provide powerful, event-based automation via webhooks.\u003Cbr \u002F>\nUnlike the default WooCommerce setup, this plugin adds a range of additional webhook topics, enabling deeper integration and improved real-time synchronization.\u003C\u002Fp>\n\u003Cp>✅ Supported webhook events:\u003Cbr \u002F>\nbasket.created\u003Cbr \u002F>\nbasket.updated\u003Cbr \u002F>\nbasket.deleted\u003C\u002Fp>\n\u003Cp>order_shipment.created\u003Cbr \u002F>\norder_shipment.updated\u003Cbr \u002F>\norder_shipment.deleted\u003C\u002Fp>\n\u003Cp>variant.created\u003Cbr \u002F>\nvariant.updated\u003Cbr \u002F>\nvariant.deleted\u003C\u002Fp>\n\u003Cp>category.created\u003Cbr \u002F>\ncategory.updated\u003Cbr \u002F>\ncategory.deleted\u003C\u002Fp>\n\u003Cp>This plugin can be used independently of API2Cart, making it a valuable tool for any developer or business seeking more control over WooCommerce event handling.\u003C\u002Fp>\n\u003Cp>Trusted by developers and eCommerce platforms worldwide, API2Cart provides enterprise-grade API solutions for multichannel retail integrations.\u003Cbr \u002F>\nInstalling this plugin helps you unlock more precise and flexible event tracking in your WooCommerce store — whether or not you use API2Cart.\u003C\u002Fp>\n\u003Cp>WHAT IS API2Cart?\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fapi2cart.com\u002F\" rel=\"nofollow ugc\">API2Cart\u003C\u002Fa> is a unified API to integrate with 60+ shopping carts and marketplaces including Magento, Shopify, BigCommerce, WooCommerce, PrestaShop, Demandware, Amazon and others.\u003Cbr \u002F>\nWe are also constantly expanding our list of platforms to meet the needs of our customers.\u003C\u002Fp>\n\u003Ch3>Experience the API2Cart Advantage\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Seamless Integration:\u003C\u002Fstrong> Integrate seamlessly with WooCommerce and eliminate the hassle of managing multiple platforms.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Real-time Notifications:\u003C\u002Fstrong> Receive instant notifications for cart updates, including item additions and deletions.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Unified API:\u003C\u002Fstrong> Manage 60+ shopping carts and marketplaces with a single API.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Comprehensive Data Management:\u003C\u002Fstrong> Easily retrieve, add, delete, update, and synchronize store data such as orders, customers, products, baskets, and categories from all or any of the supported platforms. See \u003Ca href=\"https:\u002F\u002Fapi2cart.com\u002Fsupported-api-methods\u002F\" rel=\"nofollow ugc\">all methods and platforms\u003C\u002Fa> we support.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Developer-Friendly Tools:\u003C\u002Fstrong> Utilize our \u003Ca href=\"https:\u002F\u002Fapi2cart.com\u002Fdocs\u002Fsdk\u002F\" rel=\"nofollow ugc\">SDK\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fapi2cart.com\u002Fdocs\u002F\" rel=\"nofollow ugc\">detailed documentation\u003C\u002Fa> to connect multiple shopping carts and marketplaces with ease.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Take Your eCommerce Business to New Heights\u003Cbr \u002F>\nIf you have any questions, feel free to contact us at \u003Ca href=\"mailto:manager@api2cart.com\" rel=\"nofollow ugc\">manager@api2cart.com\u003C\u002Fa> or \u003Ca href=\"https:\u002F\u002Fapi2cart.com\u002Fcontact-us\u002F\" rel=\"nofollow ugc\">submit the form\u003C\u002Fa>.\u003C\u002Fp>\n","Enhance Your WooCommerce Integration with Extended Webhook Support",40,3763,"2026-03-05T08:45:00.000Z","4.1","5.6",[133,134,135,136,137],"api2cart","woocommerce-integration","woocommerce-plugin","woocommerce-shopping-cart-updates","woocommerce-webhooks","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fapi2cart-webhook-helper.zip",{"attackSurface":140,"codeSignals":182,"taintFlows":190,"riskAssessment":191,"analyzedAt":198},{"hooks":141,"ajaxHandlers":170,"restRoutes":171,"shortcodes":180,"cronEvents":181,"entryPointCount":33,"unprotectedCount":33},[142,148,154,160,165],{"type":143,"name":144,"callback":145,"file":146,"line":147},"action","after_setup_theme","Meloniq\\GpTranslateUpdateApi\\setup","gp-translate-update-api.php",55,{"type":143,"name":149,"callback":150,"priority":151,"file":152,"line":153},"admin_menu","add_menu_page",10,"src\\class-admin-page.php",21,{"type":155,"name":156,"callback":157,"priority":151,"file":158,"line":159},"filter","gpzip_file_name","modify_zip_file_name","src\\class-core.php",26,{"type":143,"name":161,"callback":162,"priority":151,"file":163,"line":164},"rest_api_init","register_routes","src\\class-rest.php",32,{"type":143,"name":166,"callback":167,"priority":151,"file":168,"line":169},"admin_init","init_settings","src\\class-settings.php",23,[],[172],{"namespace":173,"route":174,"methods":175,"callback":177,"permissionCallback":178,"file":163,"line":179},"gp\u002Ftranslations","\u002Fupdate-check\u002F0.1",[176],"POST","handle_update_check","__return_true",41,[],[],{"dangerousFunctions":183,"sqlUsage":184,"outputEscaping":186,"fileOperations":11,"externalRequests":11,"nonceChecks":11,"capabilityChecks":11,"bundledLibraries":189},[],{"prepared":11,"raw":11,"locations":185},[],{"escaped":187,"rawEcho":11,"locations":188},7,[],[],[],{"summary":192,"deductions":193},"The \"gp-translate-update-api\" v1.0 plugin exhibits a mixed security posture.  On the positive side, the code demonstrates strong adherence to secure coding practices, with 100% of SQL queries using prepared statements and all output correctly escaped. There are no known vulnerabilities or CVEs associated with this plugin, suggesting a history of responsible development and maintenance.  Furthermore, the absence of dangerous functions, file operations, external HTTP requests, and bundled libraries reduces the potential for common attack vectors.\n\nHowever, a significant concern arises from the plugin's attack surface. It exposes one REST API route that lacks permission callbacks. This means that any unauthenticated user could potentially interact with this endpoint, creating a vulnerability if the endpoint performs sensitive actions or exposes private data. The lack of nonce checks on this endpoint further exacerbates this risk, as it could be susceptible to Cross-Site Request Forgery (CSRF) attacks. While no taint flows were detected, the unprotected REST API route represents a clear and present danger that requires immediate attention.",[194,196],{"reason":195,"points":71},"REST API route without permission callbacks",{"reason":197,"points":187},"No nonce checks on entry points","2026-03-17T07:33:27.775Z",{"wat":200,"direct":209},{"assetPaths":201,"generatorPatterns":204,"scriptPaths":205,"versionParams":206},[202,203],"\u002Fwp-content\u002Fplugins\u002Fgp-translate-update-api\u002Fassets\u002Fcss\u002Fadmin.css","\u002Fwp-content\u002Fplugins\u002Fgp-translate-update-api\u002Fassets\u002Fjs\u002Fadmin.js",[],[],[207,208],"gp-translate-update-api\u002Fassets\u002Fcss\u002Fadmin.css?ver=","gp-translate-update-api\u002Fassets\u002Fjs\u002Fadmin.js?ver=",{"cssClasses":210,"htmlComments":211,"htmlAttributes":212,"restEndpoints":213,"jsGlobals":215,"shortcodeOutput":216},[],[],[],[214],"\u002Fwp-json\u002Fgp\u002Ftranslations\u002Fupdate-check\u002F0.1",[],[],{"error":218,"url":219,"statusCode":220,"statusMessage":221,"message":221},true,"http:\u002F\u002Flocalhost\u002Fapi\u002Fplugins\u002Fgp-translate-update-api\u002Fbundle",404,"no bundle for this plugin yet",{"slug":4,"current_version":6,"total_versions":33,"versions":223},[224],{"version":6,"download_url":23,"svn_tag_url":225,"released_at":25,"has_diff":226,"diff_files_changed":227,"diff_lines":25,"trac_diff_url":25,"vulnerabilities":228,"is_current":218},"https:\u002F\u002Fplugins.svn.wordpress.org\u002Fgp-translate-update-api\u002Ftags\u002F1.0\u002F",false,[],[]]