[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fP2GRmKIdL4jzj6kaGiD_wuGdwu1bl9HhID_Ppo5Hz3k":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":13,"last_updated":14,"tested_up_to":15,"requires_at_least":14,"requires_php":14,"tags":16,"homepage":22,"download_link":23,"security_score":24,"vuln_count":13,"unpatched_count":13,"last_vuln_date":25,"fetched_at":26,"vulnerabilities":27,"developer":28,"crawl_stats":25,"alternatives":36,"analysis":141,"fingerprints":196},"offline-updater","Offline Updater","1.3","Link","https:\u002F\u002Fprofiles.wordpress.org\u002Fplayes\u002F","\u003Cp>For those sites can’t update online, like some read-only cloud or recover-after-restart server, now you can just check out those updating files and easily deal with them, See Dashboard -> Offline Updater.\u003C\u002Fp>\n\u003Cp>对一些无法在线升级的网站，例如一些只读云或者重启恢复的服务器，本插件可直接查看需要升级的所有对象（包括主程序、插件、主题、语言包），然后可自行下载手动更新。\u003C\u002Fp>\n","For those sites can't update online, like some read-only cloud or recover-after-restart server, now you can just check out those updating files a &hellip;",10,1435,0,"","5.3.21",[17,18,19,20,21],"check","cloud","offline","readonly","update","https:\u002F\u002Fwww.xiaomac.com\u002Foffline-updater.html","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Foffline-updater.zip",100,null,"2026-03-15T10:48:56.248Z",[],{"slug":29,"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},"playes",4,90,89,30,86,"2026-04-04T15:27:58.219Z",[37,63,85,107,126],{"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":59,"download_link":60,"security_score":61,"vuln_count":13,"unpatched_count":13,"last_vuln_date":25,"fetched_at":62},"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",[54,55,56,57,58],"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",85,"2026-03-15T15:16:48.613Z",{"slug":64,"name":65,"version":66,"author":67,"author_profile":68,"description":69,"short_description":70,"active_installs":71,"downloaded":72,"rating":24,"num_ratings":73,"last_updated":74,"tested_up_to":75,"requires_at_least":40,"requires_php":76,"tags":77,"homepage":83,"download_link":84,"security_score":24,"vuln_count":13,"unpatched_count":13,"last_vuln_date":25,"fetched_at":62},"change-quantity-on-checkout-for-woocommerce","Change Quantity on Checkout for WooCommerce","4.0","bhavik.kiri","https:\u002F\u002Fprofiles.wordpress.org\u002Fbhavikkiri\u002F","\u003Cp>This lightweight plugin enhances the WooCommerce checkout experience by enabling quantity updates and product removal options directly on the checkout page.\u003C\u002Fp>\n\u003Ch4>Key Features\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Quantity Management\u003C\u002Fstrong>: Add WooCommerce standard quantity fields directly on the checkout page.\u003Cbr \u002F>\n\u003Cstrong>Product Removal\u003C\u002Fstrong>: One-click product deletion from checkout.\u003Cbr \u002F>\n\u003Cstrong>Dual Compatibility\u003C\u002Fstrong>: Supports both \u003Cstrong>Classic and Block-based\u003C\u002Fstrong> WooCommerce checkout.\u003Cbr \u002F>\n\u003Cstrong>Seamless Integration\u003C\u002Fstrong>: Uses native WooCommerce styling and functionality.\u003Cbr \u002F>\n\u003Cstrong>Mobile Friendly\u003C\u002Fstrong>: Responsive design that works on all devices.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Note on Compatibility\u003C\u002Fstrong>: This plugin works with the default WooCommerce quantity input. If your theme replaces or customizes the quantity selector (e.g., with plus\u002Fminus buttons), the functionality may not work as expected.\u003C\u002Fp>\n\u003Ch4>Important Compatibility Note\u003C\u002Fh4>\n\u003Cp>This plugin is designed to work exclusively with the standard WooCommerce Checkout page (including the new Checkout Blocks and the Classic shortcode). It is not compatible with custom checkout pages built using third-party page builders like:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>Elementor (WooCommerce Builder)\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Divi BodyCommerce\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>WooLentor \u002F CoBlocks\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Perfect For\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Stores wanting to reduce checkout abandonment.\u003C\u002Fli>\n\u003Cli>Improving user experience by removing the “back to cart” step.\u003C\u002Fli>\n\u003Cli>Modern WooCommerce stores using block-based checkout.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Upgrade to Pro\u003C\u002Fh3>\n\u003Cp>Need better compatibility with custom themes or advanced filtering options?\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Upgrade to Change Quantity on Checkout Pro for:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Advanced Compatibility:\u003C\u002Fstrong> Works with themes that use custom plus\u002Fminus quantity buttons.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Category Filters:\u003C\u002Fstrong> Choose exactly which product categories show quantity selectors.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Premium Support:\u003C\u002Fstrong> Get faster response times and direct technical assistance.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>AJAX Updates:\u003C\u002Fstrong> Faster, refresh-free experience for your customers.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.navonmeshsolution.com\u002Fproduct\u002Fcqoc-pro\u002F\" rel=\"nofollow ugc\">View Pro Version Features &raquo;\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Support\u003C\u002Fh3>\n\u003Cp>For support, feature requests, or bug reports, please visit \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fsupport\u002Fplugin\u002Fchange-quantity-on-checkout-for-woocommerce\u002F\" rel=\"ugc\">Support\u003C\u002Fa>.\u003C\u002Fp>\n","Allow customers to change product quantities and remove products directly from both Classic and Block-based WooCommerce checkout pages.",5000,62039,52,"2025-12-21T19:35:00.000Z","6.9.4","5.6",[78,79,80,81,82],"checkout","quantity","remove-product","update-quantity","woocommerce","https:\u002F\u002Fwww.navonmeshsolution.com\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fchange-quantity-on-checkout-for-woocommerce.4.0.zip",{"slug":86,"name":87,"version":88,"author":89,"author_profile":90,"description":91,"short_description":92,"active_installs":93,"downloaded":94,"rating":24,"num_ratings":95,"last_updated":96,"tested_up_to":97,"requires_at_least":98,"requires_php":14,"tags":99,"homepage":14,"download_link":104,"security_score":24,"vuln_count":105,"unpatched_count":13,"last_vuln_date":106,"fetched_at":62},"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,70179,15,"2025-11-11T13:14:00.000Z","6.8.5","5.0",[54,100,101,102,103],"log","requests","update-checks","wp_http","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Flog-http-requests.zip",1,"2022-10-05 00:00:00",{"slug":108,"name":109,"version":110,"author":111,"author_profile":112,"description":113,"short_description":114,"active_installs":115,"downloaded":116,"rating":24,"num_ratings":117,"last_updated":118,"tested_up_to":119,"requires_at_least":98,"requires_php":52,"tags":120,"homepage":14,"download_link":124,"security_score":125,"vuln_count":13,"unpatched_count":13,"last_vuln_date":25,"fetched_at":62},"force-update-check-for-plugins-and-themes","Force Update Check for Plugins and Themes","1.0.1","WP Zone","https:\u002F\u002Fprofiles.wordpress.org\u002Faspengrovestudios\u002F","\u003Cp>Force Update Check for Plugins and Themes forces WordPress to run a theme and plugin update check whenever you visit the WordPress updates page (\u003Ccode>\u002Fwp-admin\u002Fupdate-core.php\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>Force Update Check Features:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Automatic checks (no need to click the “check again” button)\u003C\u002Fli>\n\u003Cli>No configurations or settings page\u003C\u002Fli>\n\u003Cli>Eliminates action for developer or QA\u003C\u002Fli>\n\u003Cli>Get new features and security patches faster\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>How it works\u003C\u002Fp>\n\u003Cp>By default, WordPress checks for updates approximately every 12 hours. This plugin clears the theme\u002Fplugin updates cache and triggers a new update check each time the updates page is visited.\u003C\u002Fp>\n\u003Cp>When activated on your site it runs automatically and has no configurations page or settings to worry about. Each time you visit the updates page WordPress will run a new check.\u003C\u002Fp>\n\u003Cp>Force Update Check for Plugins and Themes is specifically a plugin and theme check and will not force a WordPress core update check.\u003C\u002Fp>\n\u003Cp>Third-party plugins and themes that do not update from the WordPress.org repository may not be cleared by the Force Update Check for Plugins and Themes plugin. If the plugin or theme does not update via the WordPress.org repository, and forcing an update check with this plugin does not work, check with your plugin or theme developer for a force check option.\u003C\u002Fp>\n\u003Cp>Looking for more simple developer tools?\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwpzone.co\u002F\" title=\"WP Zone\" rel=\"nofollow ugc\">WP Zone\u003C\u002Fa> has built a whole bunch of add-ons, services, plugins and themes and are committed to quality code that follows WordPress best practices. Check out some of our other developer favorites and don’t forget to leave a ⭐️⭐️⭐️⭐️⭐️ review to help others in the community decide.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwpzone.co\u002Fproduct\u002Fcustom-css-and-javascript-developer-edition\u002F\" title=\"Custom CSS and JavaScript\" rel=\"nofollow ugc\">Custom CSS and JavaScript\u003C\u002Fa> – Quickly add custom site-wide CSS styles and JavaScript code to your WordPress site\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwplayouts.space\u002F\" title=\"WP Layouts\" rel=\"nofollow ugc\">WP Layouts\u003C\u002Fa> – Organize, import, and export your theme layouts from the cloud\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Freplace-image\u002F\" title=\"Replace Image\" rel=\"ugc\">Replace Image\u003C\u002Fa> – Keep the same URL when uploading to the WordPress media library\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fsupport\u002Fplugin\u002Fdonations-for-woocommerce\u002F\" title=\"Potent Donations for WooCommerce\" rel=\"ugc\">Potent Donations for WooCommerce\u003C\u002Fa> – Acceptance donations through your WooCommerce store\u003Cbr \u002F>\nEnjoy!\u003C\u002Fli>\n\u003C\u002Ful>\n","The Force Update Check For Plugins And Themes will run each time this page is loaded. Update statuses may still be cached by third-party updaters.",200,5681,5,"2024-08-12T19:51:00.000Z","6.6.5",[17,121,122,21,123],"checker","force","updates","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fforce-update-check-for-plugins-and-themes.1.0.1.zip",92,{"slug":127,"name":128,"version":129,"author":130,"author_profile":131,"description":132,"short_description":133,"active_installs":24,"downloaded":134,"rating":24,"num_ratings":135,"last_updated":136,"tested_up_to":97,"requires_at_least":137,"requires_php":14,"tags":138,"homepage":139,"download_link":140,"security_score":24,"vuln_count":13,"unpatched_count":13,"last_vuln_date":25,"fetched_at":62},"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",4738,2,"2025-05-14T23:00:00.000Z","3.0.1",[54,100,101,102,103],"https:\u002F\u002Fwww.expresstechsoftwares.com\u002Finspect-http-requests","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Finspect-http-requests.1.0.10.zip",{"attackSurface":142,"codeSignals":156,"taintFlows":188,"riskAssessment":189,"analyzedAt":195},{"hooks":143,"ajaxHandlers":152,"restRoutes":153,"shortcodes":154,"cronEvents":155,"entryPointCount":13,"unprotectedCount":13},[144,150],{"type":145,"name":146,"callback":147,"file":148,"line":149},"action","network_admin_menu","admin_menu","offline-updater.php",14,{"type":145,"name":147,"callback":147,"file":148,"line":151},16,[],[],[],[],{"dangerousFunctions":157,"sqlUsage":158,"outputEscaping":160,"fileOperations":13,"externalRequests":13,"nonceChecks":13,"capabilityChecks":13,"bundledLibraries":187},[],{"prepared":13,"raw":13,"locations":159},[],{"escaped":13,"rawEcho":161,"locations":162},12,[163,166,168,170,172,174,176,178,179,181,183,185],{"file":148,"line":164,"context":165},39,"raw output",{"file":148,"line":167,"context":165},41,{"file":148,"line":169,"context":165},45,{"file":148,"line":171,"context":165},46,{"file":148,"line":173,"context":165},47,{"file":148,"line":175,"context":165},48,{"file":148,"line":177,"context":165},54,{"file":148,"line":47,"context":165},{"file":148,"line":180,"context":165},63,{"file":148,"line":182,"context":165},66,{"file":148,"line":184,"context":165},74,{"file":148,"line":186,"context":165},77,[],[],{"summary":190,"deductions":191},"The static analysis of the \"offline-updater\" v1.3 plugin reveals a seemingly strong security posture based on the provided metrics. There is no detected attack surface with unprotected entry points, no dangerous functions are used, and all SQL queries are properly prepared. Furthermore, the plugin has no recorded vulnerability history, with zero known CVEs of any severity. This indicates a potentially well-developed and securely coded plugin, especially concerning its handling of database interactions and external threats.\n\nHowever, a significant concern arises from the complete lack of output escaping. With 12 outputs analyzed and 0% properly escaped, this indicates a high potential for Cross-Site Scripting (XSS) vulnerabilities. Any data that is processed and then displayed back to the user without proper sanitization could be manipulated by an attacker. The absence of nonce and capability checks, while not explicitly tied to entry points in this analysis, could also become a risk if new entry points are introduced or if the plugin relies on other mechanisms for access control that are not apparent here.\n\nIn conclusion, while the plugin demonstrates good practices in areas like SQL handling and avoiding known vulnerabilities, the severe lack of output escaping presents a significant, actionable risk. The absence of vulnerability history is a positive sign, but it does not negate the immediate threats posed by unescaped output. Further investigation into how the plugin handles user-generated or external data displayed on the frontend is highly recommended.",[192],{"reason":193,"points":194},"0% output escaping",8,"2026-03-16T23:26:39.368Z",{"wat":197,"direct":202},{"assetPaths":198,"generatorPatterns":199,"scriptPaths":200,"versionParams":201},[],[],[],[],{"cssClasses":203,"htmlComments":205,"htmlAttributes":206,"restEndpoints":207,"jsGlobals":208,"shortcodeOutput":209},[204],"wrap",[],[],[],[],[]]