[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhAp3nefZK7SM0nbZHF2Xb8rWN1KXIKZjUjDul2QrEBE":3},{"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":13,"last_updated":14,"tested_up_to":15,"requires_at_least":16,"requires_php":14,"tags":17,"homepage":14,"download_link":23,"security_score":11,"vuln_count":24,"unpatched_count":24,"last_vuln_date":25,"fetched_at":26,"vulnerabilities":27,"developer":28,"crawl_stats":25,"alternatives":32,"analysis":153,"fingerprints":652},"numbers-generator-and-validator","Numbers generator and validator","2.0.8","axel8721","https:\u002F\u002Fprofiles.wordpress.org\u002Faxel8721\u002F","\u003Cp>Numbers generator and validator is a good plugin for small businesses that want an easy solution to create a large amount of numbers or serials and store them.\u003Cbr \u002F>\nIt can for example be used to create numbers for products and let users validate them on your site.\u003C\u002Fp>\n\u003Ch3>Where do you find it\u003C\u002Fh3>\n\u003Cp>After you have activated the plugin you find it under tools in your WordPress dashboard.\u003C\u002Fp>\n\u003Ch3>Contact\u003C\u002Fh3>\n\u003Cp>You can email me at gryttaxel@gmail.com if you want support or want to leave feedback.\u003Cbr \u002F>\nSincerely from Axel Grytt.\u003C\u002Fp>\n","Numbers generator and validator lets you generate, manage and validate numbers or serials on your site.",100,6177,1,"","5.8.13","2.7",[18,19,20,21,22],"numbers-generator","serial-generator","serials","table-manager","validator","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fnumbers-generator-and-validator.2.0.8.zip",0,null,"2026-03-15T10:48:56.248Z",[],{"slug":7,"display_name":7,"profile_url":8,"plugin_count":13,"total_installs":11,"avg_security_score":11,"avg_patch_time_days":29,"trust_score":30,"computed_at":31},30,94,"2026-04-04T14:17:34.701Z",[33,59,84,107,130],{"slug":34,"name":35,"version":36,"author":37,"author_profile":38,"description":39,"short_description":40,"active_installs":41,"downloaded":42,"rating":43,"num_ratings":44,"last_updated":45,"tested_up_to":46,"requires_at_least":14,"requires_php":47,"tags":48,"homepage":53,"download_link":54,"security_score":55,"vuln_count":56,"unpatched_count":24,"last_vuln_date":57,"fetched_at":58},"serial-codes-generator-and-validator","Serial Codes Generator and Validator with WooCommerce Support","2.8.7","Vollstart","https:\u002F\u002Fprofiles.wordpress.org\u002Fsasonikolov\u002F","\u003Cp>Manage your Serial Codes the easy wat.\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\u002FDoNPvD3c6eM?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>\u003Cbr \u002F>\n\u003Ca href=\"https:\u002F\u002Fyoutu.be\u002FDoNPvD3c6eM\" rel=\"nofollow ugc\">Video\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>Allows you to manage codes (serial numbers) for your digital licensed products and physical products. Your user enters the code on your page and checks if the code is valid.\u003C\u002Fp>\n\u003Cp>Optional for you is the included support for Woocommerce products and WooCommerce PDF Invoices – generate your WooCommerce serial directly with a purchase.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=DoNPvD3c6eM\" rel=\"nofollow ugc\">“Check out the overview video”\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>If you use woocommerce, you can uset the option to auto generate a serial code for each sold product!\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>WooCommerce is NOT required, but just additional supported by our plugin if needed by you.\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Shop:\u003C\u002Fstrong> With Serial Code Generator your will be able to sell license keys and products with a serial number or activation key. The plugin can create the code on the fly or use unused serials from your code list for each sold item.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Validation of serials:\u003C\u002Fstrong> You customer can validate a serial on your page. The code generator gives you a flexible pattern to generate codes upfront. You can also \u003Cstrong>import your existing codes\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Build your own stolen serial database:\u003C\u002Fstrong> Support your customer and yourself to protect stolen products to be sold to others. Mark reported stolen products as stolen and let others check the serials.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>How can you setup the serial code generator?\u003C\u002Fstrong>\u003Cbr \u002F>\nYou can enter your codes within the WP admin area in the serial code section (a new menu point in the wordpress amdin area).\u003Cbr \u002F>\nYou can add your own codes manually using the serial code generator or import existing codes.\u003Cbr \u002F>\nThe codes can also be generated by the plugin. The serial code generator can create a bulk of serials or numbers as codes.\u003Cbr \u002F>\nAnd you are also able to add your own codes by just entering them to the generated codes below the serial code generator.\u003Cbr \u002F>\nIf needed you can assign the codes to a list. The list (code list) helps you to organize the codes. The code list can be assigned to a WooCommerce product, if you want to add a serial code to each sold product.\u003Cbr \u002F>\nCreate one or more code lists to use the WooCommerce functionality.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>How the serial code generator works\u003C\u002Fstrong>\u003Cbr \u002F>\nYou define your look and feel for your codes. The generated codes will be unique. After you are satisfied with the generated codes, you can start the code adding step.\u003Cbr \u002F>\nThe code adding step will check if the code is unique on the server before adding it.\u003Cbr \u002F>\nIf the code (serial number\u002Fticket number) exists already on the server, it will not be added.\u003C\u002Fp>\n\u003Ch4>The generator provides a lot of features:\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Code prefix – you can enter a fixed prefix to each code\u003C\u002Fli>\n\u003Cli>Length of code\u003C\u002Fli>\n\u003Cli>Only letters\u003C\u002Fli>\n\u003Cli>Uppercase, Lowercase or both\u003C\u002Fli>\n\u003Cli>Exclusion of letters that are easy to missread (i,l,o,q,p)\u003C\u002Fli>\n\u003Cli>Delimiter possible: [None, -, :, SPACE] – you decide after how many letters within the code\u003C\u002Fli>\n\u003Cli>CVV code generation (only numbers)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Limit purchase of WooCommerce products to people with a specific code (restriction feature)\u003C\u002Fli>\n\u003Cli>Store WooCommerce orderid, itemid and productid to a serial code that was generated or used for a product sale\u003C\u002Fli>\n\u003Cli>You can now set the serial code format for all WooCommerce product that are using a serial code\u003C\u002Fli>\n\u003Cli>You can now set the serial code format directly on the WooCommerce product detail page if needed\u003C\u002Fli>\n\u003Cli>Use your serials to restrict purchases to allow a purchase of this product only if the buyer has a code for it (purchase allowance code)\u003C\u002Fli>\n\u003Cli>Add your own messages for the serial code validation form for your customers\u003C\u002Fli>\n\u003Cli>Add your own message for the “product stolen” validation message\u003C\u002Fli>\n\u003Cli>Disable the validation form for not logged in wordpress user\u003C\u002Fli>\n\u003Cli>User can register to a code (with wordpress user id if needed) after the code is checked – this makes your code one-time usable\u003C\u002Fli>\n\u003Cli>Display registered user information of a code during the validation if you need this\u003C\u002Fli>\n\u003Cli>One time check is possible (with wordpress user id if needed) – the code will be marked as used after the check\u003C\u002Fli>\n\u003Cli>One time check can have a maximum check amount based on code list or based on the global setting\u003C\u002Fli>\n\u003Cli>Several checks allowed – the code will be marked as used after X confirmed checks\u003C\u002Fli>\n\u003Cli>The user can be forwared (redirected) to an URL after the code was checked – to show more details\u003C\u002Fli>\n\u003Cli>Webhooks – you can inform other systems about code validation steps by entering for serveral serial code status during the validation check\u003C\u002Fli>\n\u003Cli>Display assigned serial codes to your user with a shortcode [sngmbhSerialcodesValidator_code]\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Premium Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Unlimited Codes (the basic allows you 500 serial codes)\u003C\u002Fli>\n\u003Cli>Unlimited Code Lists\u003C\u002Fli>\n\u003Cli>Save IP address of user using the code validation check on your page\u003C\u002Fli>\n\u003Cli>De- and re-activate codes\u003C\u002Fli>\n\u003Cli>Block IPs after x retries within 60 minutes – prevent brute force\u003C\u002Fli>\n\u003Cli>One time usage overuled by code list setting\u003C\u002Fli>\n\u003Cli>Enter expiration date for codes\u003C\u002Fli>\n\u003Cli>Enter expiration date for code lists (code overrule list expiration date)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Try it out first, before you go Premium. \u003Ca href=\"https:\u002F\u002Fvollstart.com\u002F\" rel=\"nofollow ugc\">“Here you can find the premium plugin”\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3>Build your own Stolen products database\u003C\u002Fh3>\n\u003Cp>You can set the status of a serial code to be marked as stolen. This way you can offer your customers a way to report a stolen product. Other buyers of used products can validate the code on your website and will be notified with a “Product is stolen” warning.\u003Cbr \u002F>\nThis could increase sales and help reducing theft of your products.\u003Cbr \u002F>\nThe check behaviour will be like “inactive serial codes” but with the stolen message. You can change the stolen message within the options area of the serial code admin.\u003C\u002Fp>\n\u003Ch3>Protection with CVV\u003C\u002Fh3>\n\u003Cp>You can set a code verification value (CVV) to protect your serial code. This allows you to print your serial code on the visible side of your product and print the CVV number on the open visible part of your packaging of your products. The validation check will ask the user to enter both for a valid check.\u003Cbr \u002F>\nThat way you increase the security of your serial codes and prevent stealing the serial code (If you are able hide the CVV on your packaging).\u003Cbr \u002F>\nIf you use a CVV on a serial code , then the user will be asked to enter this CVV too. If the CVV on your code is not set or empty it will be ignored and your customer is not asked for it.\u003C\u002Fp>\n\u003Ch3>Woocommerce support for auto-generating serial codes\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Supports version 6+\u003C\u002Fstrong>\u003Cbr \u002F>\n\u003Cstrong>You can use this plugin to auto-generate serial codes for your woocommerce products\u003C\u002Fstrong>\u003Cbr \u002F>\n* Create a code list\u003Cbr \u002F>\n* Go to your WooCommerce product and edit the product which should receive a serial code\u003Cbr \u002F>\n* Click on “Serial Codes and Sale Restrictions” in the attribute area of your product\u003Cbr \u002F>\n* Choose the “Code list” that will be used for this product\u003C\u002Fp>\n\u003Cp>Everytime this product is sold, it will get a new generated serial code or use an unused serial code within your list (This need to be activated within the option settings). The new serial code will be added to the code list you set on your WooCommerce product and to the product sale too.\u003Cbr \u002F>\nIf the sold product quantity in the order is more than 1, then a code will be generated for each element. The code will be generated after the purchase. In case of a refund the serial code will be recovered and marked as unused, so that it can be reused.\u003C\u002Fp>\n\u003Cp>\u003Cem>E.g.: Your customer bought 2 of the same product within one order, then 2 serials will be generated and stored to the product item within this order.\u003C\u002Fem>\u003C\u002Fp>\n\u003Ch4>WooCommerce Serial Code Features\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Automatically create and assign serial codes for physical products and digital products\u003C\u002Fli>\n\u003Cli>Recover serial code assigned to refunded orders\u003C\u002Fli>\n\u003Cli>Option to reuse the recovered serial codes with the latest orders\u003C\u002Fli>\n\u003Cli>Automatically deliver the serial codes with the complete order email\u003C\u002Fli>\n\u003Cli>Automatically deliver the serial codes with the optional PDF invoice “WooCommerce PDF Invoices”\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Woocommerce support product purchase restriction\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>You can use this plugin to protect the sale of a product without a purchase code\u003C\u002Fstrong>\u003Cbr \u002F>\n* Create a code list\u003Cbr \u002F>\n* Add codes to this list – these codes will be the allowance-code to purchase a specific product\u003Cbr \u002F>\n* Go to your WooCommerce product and edit the product which should be restricted for buy-only-with-serial-code\u003Cbr \u002F>\n* Click on “Serial Codes and Sale Restrictions” in the attribute area of your product\u003Cbr \u002F>\n* Choose the “Code List for sale restriction”\u003Cbr \u002F>\n* Activate the option “Activate the purchase restrictions of product sales without a valid and unused serial code”\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Please note:\u003C\u002Fstrong>\u003Cbr \u002F>\nIf you exceed your limit (\u003Cem>no limits for premium user\u003C\u002Fem>) of the amount of possible codes, then the code added to the sold product will be a text information: \u003Cstrong>“Please contact our support for the serial code”\u003C\u002Fstrong>.\u003Cbr \u002F>\nThis way your business is not harmed and your customer can contact you to get a serial code manually. The format of the serial code will be \u003Cstrong>12345-12345-12345-12345\u003C\u002Fstrong> if you do not set a generation format within the options.\u003C\u002Fp>\n\u003Ch3>WooCommerce PDF Invoices support to display the serial codes on the PDFs\u003C\u002Fh3>\n\u003Cp>If you use \u003Ca href=\"https:\u002F\u002Fen-gb.wordpress.org\u002Fplugins\u002Fwoocommerce-pdf-invoices-packing-slips\u002F\" rel=\"nofollow ugc\">“WooCommerce PDF Invoices”\u003C\u002Fa>, then the generated serial codes are displayed on the generated PDFs too!\u003Cbr \u002F>\nThe supported PDF plugin is from Ewout Fernhout.\u003C\u002Fp>\n\u003Ch3>WooCommerce Product Sale Restriction to code only\u003C\u002Fh3>\n\u003Cp>You can restrict purchases for a product to a code from a code list or any code you have. The purchase will mark the code as used and cannot be reused for the next purchase.\u003Cbr \u002F>\nThis allows you to offer products that can be only bought by customers, that have received already the purchase code.\u003C\u002Fp>\n\u003Ch3>Frontend\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Use the shortcode \u003Cstrong>[sngmbhSerialcodesValidator]\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>Create a page or use an existing one and add the shortcode to the page\u003C\u002Fli>\n\u003Cli>The shortcode will be replaced for your users by a form to enter the code and a button to validate the serial code. This allows you to surround the form with your own heading and instruction.\u003C\u002Fli>\n\u003Cli>Each code has a display version (e.g. XYZXYZ -> XYZ-XYZ), so it is easier for your user to read the serial code.\u003C\u002Fli>\n\u003Cli>The check will remove the display delimiter “-“, “:”, ” ” for the check automatically.\u003C\u002Fli>\n\u003Cli>So your user can enter the code with or without delimiters.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>If you use CVV on a code and the user enter the code that requires a cvv, then your user will be ask to enter the CVV.\u003Cbr \u002F>\nThe user could enter the CVV immediately with the code. Separate the value with a “:”. E.g: XYZXYZ:1234.\u003C\u002Fp>\n\u003Cp>It is possible to prefill the serial code validation form with a code.\u003Cbr \u002F>\nAdd the parameter “code” to your page URL to create a link that prefills the form.\u003Cbr \u002F>\n\u003Cem>E.g https:\u002F\u002Fvollstart.com\u002Fserial-codes\u002F?code=123-456-789\u003C\u002Fem>\u003C\u002Fp>\n\u003Ch4>Form Options for expert\u003C\u002Fh4>\n\u003Cp>You can use your own input, trigger and output HTML element.\u003Cbr \u002F>\nAdd the id parameter to your HTML elements and pass them to the shortcode as corresponding parameter.\u003Cbr \u002F>\nYou can add also your own JS function name that will be called before the code is checked on the server and also if the result comes back.\u003Cbr \u002F>\n\u003Cem>[sngmbhSerialcodesValidator inputid=”” triggerid=”” outputid=”” jspre=”” jsafter=””]\u003C\u002Fem>\u003Cbr \u002F>\n\u003Ca href=\"https:\u002F\u002Fvollstart.com\u002Fserial-codes-validator-premium\u002Fdocs\u002F#styling\" rel=\"nofollow ugc\">Read here more about this feature\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Quick overview\u003C\u002Fh3>\n\u003Cp>Each code is unique. The list is for your organisation and for your WooCommerce products.\u003C\u002Fp>\n\u003Ch4>Plugin administration – where to find the plugin management area\u003C\u002Fh4>\n\u003Cp>\u003Cem>It will add a new menu entry “Serial Codes Validator” within the settings section.\u003C\u002Fem>\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fvollstart.com\u002Fserial-codes-validator-premium\u002Ffirst-steps\" rel=\"nofollow ugc\">More about the plugin on our website\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Support\u003C\u002Fh3>\n\u003Cp>Write to support@vollstart.com for support request.\u003Cbr \u002F>\nFor both plugins: The basic free and for the premium plugin.\u003Cbr \u002F>\nWe are here to help you.\u003C\u002Fp>\n\u003Ch3>GETTING STARTED\u003C\u002Fh3>\n\u003Cp>A Quick start is shown in this \u003Ca href=\"https:\u002F\u002Fvollstart.com\u002Fserial-codes-validator-premium\u002Ffirst-steps\" rel=\"nofollow ugc\">video\u003C\u002Fa>.\u003Cbr \u002F>\nA good first start is to open the serial code admin area and create a code list first.\u003Cbr \u002F>\nThen add your codes by importing (add button at the code table) or assign the code list to your products.\u003Cbr \u002F>\nCheck out all the possible options in the serial code admin area to understand, how to tweak your usages of serial codes.\u003Cbr \u002F>\nIf you need a validation form for your users, to check the code, then please add the shortcode \u003Cstrong>[sngmbhSerialcodesValidator]\u003C\u002Fstrong> to a page.\u003C\u002Fp>\n\u003Ch4>Steps to start\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Go to the settings and click on menu “Serial Codes Validator”.\u003C\u002Fli>\n\u003Cli>Click on button “Add” next to the heading “Codes”.\u003C\u002Fli>\n\u003Cli>Enter you codes or generate codes using the built in serial code generator.\u003C\u002Fli>\n\u003Cli>Save your codes.\u003C\u002Fli>\n\u003Cli>Add the shortcode \u003Cstrong>[sngmbhSerialcodesValidator]\u003C\u002Fstrong> to a page.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Premium Features\u003C\u002Fh3>\n\u003Cp>The \u003Cstrong>premium plugin\u003C\u002Fstrong> is now available with a lifetime license and 1 year support.\u003C\u002Fp>\n\u003Ch4>Your benefits\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Unlimited Code Lists\u003C\u002Fli>\n\u003Cli>Unlimited Codes\u003C\u002Fli>\n\u003Cli>Upload CSV file for massive codes import\u003C\u002Fli>\n\u003Cli>Assign serials to existing WooCommerce orders\u003C\u002Fli>\n\u003Cli>Save IP address of user using the code validation check on your page\u003C\u002Fli>\n\u003Cli>De- and re-activate codes\u003C\u002Fli>\n\u003Cli>Block IPs after x retries within 60 minutes – prevent brute force\u003C\u002Fli>\n\u003Cli>One time usage overuled by code list setting\u003C\u002Fli>\n\u003Cli>Enter expiration date for codes\u003C\u002Fli>\n\u003Cli>Enter expiration date for code lists (code overrule list expiration date)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Checkout the premium plugin and planned features: \u003Ca href=\"https:\u002F\u002Fvollstart.com\u002Fserial-codes-validator-premium\u002F\" rel=\"nofollow ugc\">Serial Code Generator and Validator Premium\u003C\u002Fa>\u003C\u002Fstrong>\u003C\u002Fp>\n","With support as WooCommerce serial generator for your sale and on your WooCommerce PDF Invoices You can create and generate serials and codes.",800,42258,92,13,"2026-03-02T08:21:00.000Z","6.9.4","7.0",[49,50,51,19,52],"code-generator","code-validator","license-keys","serial-validator","https:\u002F\u002Fvollstart.com\u002Fserial-codes-validator-premium\u002Fdocs\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fserial-codes-generator-and-validator.2.8.7.zip",96,3,"2025-12-31 00:00:00","2026-03-15T15:16:48.613Z",{"slug":60,"name":61,"version":62,"author":63,"author_profile":64,"description":65,"short_description":66,"active_installs":67,"downloaded":68,"rating":69,"num_ratings":70,"last_updated":71,"tested_up_to":72,"requires_at_least":73,"requires_php":74,"tags":75,"homepage":81,"download_link":82,"security_score":83,"vuln_count":24,"unpatched_count":24,"last_vuln_date":25,"fetched_at":58},"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",[76,77,78,79,80],"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,{"slug":85,"name":86,"version":87,"author":88,"author_profile":89,"description":90,"short_description":91,"active_installs":92,"downloaded":93,"rating":30,"num_ratings":94,"last_updated":95,"tested_up_to":96,"requires_at_least":97,"requires_php":98,"tags":99,"homepage":105,"download_link":106,"security_score":83,"vuln_count":24,"unpatched_count":24,"last_vuln_date":25,"fetched_at":58},"woo-phone-validator","Phone Validator for WooCommerce","1.3.0","Precious Omonzejele","https:\u002F\u002Fprofiles.wordpress.org\u002Fpreciousomonze\u002F","\u003Cp>Phone Validator for WooCommerce is a plugin which helps in validating international telephone numbers for woocommerce. It adds a flag dropdown to the Billing phone number field which allows your site users to choose their country base and validate a phone number accordingly on the \u003Cem>checkout\u003C\u002Fem> page and \u003Cem>Billing Account edit\u003C\u002Fem> page of WooCommerce. It forces users to enter a valid phone number before being able to checkout or update their Billing details.\u003C\u002Fp>\n\u003Ch3>Suggestions \u002F Feature Request\u003C\u002Fh3>\n\u003Cp>If you have suggestions or a new feature request, feel free to get in touch with me via twitter. follow me on Twitter! \u003Cstrong>\u003Ca href=\"https:\u002F\u002Ftwitter.com\u002Fpreciousomonze\" rel=\"nofollow ugc\">@preciousomonze\u003C\u002Fa>\u003C\u002Fstrong>\u003C\u002Fp>\n","Phone Validator for WooCommerce Helps in validating international telephone numbers on WooCommerce billing address.",2000,18520,18,"2020-07-31T23:10:00.000Z","5.4.19","5.0","5.6",[100,101,102,103,104],"account-phone-validator","checkout-phone-validator","phone-number-validator","woocommerce","woocommerce-validation","https:\u002F\u002Fgithub.com\u002FPreciousomonze\u002Fwoocommerce-phone-validator","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwoo-phone-validator.1.3.0.zip",{"slug":108,"name":109,"version":110,"author":111,"author_profile":112,"description":113,"short_description":114,"active_installs":115,"downloaded":116,"rating":117,"num_ratings":118,"last_updated":119,"tested_up_to":120,"requires_at_least":121,"requires_php":122,"tags":123,"homepage":128,"download_link":129,"security_score":43,"vuln_count":24,"unpatched_count":24,"last_vuln_date":25,"fetched_at":58},"country-code-selector","Country Code Selector","1.7","intolap","https:\u002F\u002Fprofiles.wordpress.org\u002Fintolap\u002F","\u003Cp>Country Code Selector uses a JavaScript base to allow customers checking out in WooCommerce, Shopp, Contact form 7, Gravity form plugins select the country code using a dropdown field.\u003C\u002Fp>\n\u003Cp>Country Code Selector is a free to use plugin and so we request you to create a ticket for any support before you rate this plugin. We are here to fix any bugs discovered beyond our testing. If you are happy with the support please give us a boost with a 5-star rating which will keep us motivating for further development.\u003C\u002Fp>\n\u003Cp>[+] PRO version \u003Ca href=\"https:\u002F\u002Fwww.intolap.com\u002Fproduct\u002Fcountry-code-selector-pro\u002F\" rel=\"nofollow ugc\">Click Here\u003C\u002Fa>\u003C\u002Fp>\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\u002FLZ0HYpsP-UE?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>\n\u003Ch3>Our Other Premium Add-ons\u003C\u002Fh3>\n\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Insta IM – is a premium WordPress plugin that helps receive Contact Form 7 submissions\u002Fentries directly on the admin set WhatsApp number. This requires Contact Form 7 plugin necessarily. This plugin comes with a very easy-to-use admin settings module that allows you to set the WhatsApp number and receive messages on submission. The message also consumes the contact form fields. This plugin uses WhatsApp’s free click to chat API and does not require any paid subscription.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.intolap.com\u002Fproduct\u002Finstaim\u002F\" rel=\"nofollow ugc\">Click Here for more details\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Order On Mobile For WooCommerce is a WordPress plugin which adds a “Order on WhatsApp” button on the WooCommerce product page, product details page and cart page so your customers can submit their orders via WhatsApp Free Click to Chat API. You can also set custom message which you will receive prepended to the information product id, sku, product name, price, quantity, product variations and product link. You can select selected or all of these information as you wish in the message you receive on a product enquiry or customer order being placed.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.intolap.com\u002Fproduct\u002Forder-on-mobile-for-woocommerce-pro\u002F\" rel=\"nofollow ugc\">Click Here for more details\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Stripe Pay Now – is a WordPress plugin that facilitates Singapore based payment method allowing customers to make a payment using their preferred app from participating banks and participating non-bank financial institutions.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fintolap.com\u002Fproduct\u002Fstripe-pay-now\u002F\" rel=\"nofollow ugc\">Click Here for more details\u003C\u002Fa>\u003C\u002Fp>\n","Country Code Selector uses a JavaScript base to allow customers checking out in WooCommerce, Shopp eCommerce, Contact form 7, Gravity form plugins sel &hellip;",1000,16506,66,12,"2024-06-19T03:48:00.000Z","6.5.8","6.5","7.4",[124,125,102,126,127],"contact-form-7","gravity-form","shopp-checkout","woocommerce-checkout","http:\u002F\u002Fwww.intolap.com\u002Fproducts\u002Fcountry-code-selector\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcountry-code-selector.zip",{"slug":131,"name":132,"version":133,"author":134,"author_profile":135,"description":136,"short_description":137,"active_installs":138,"downloaded":139,"rating":140,"num_ratings":141,"last_updated":142,"tested_up_to":14,"requires_at_least":14,"requires_php":14,"tags":143,"homepage":149,"download_link":150,"security_score":151,"vuln_count":13,"unpatched_count":24,"last_vuln_date":152,"fetched_at":58},"antideo-email-validator","Antideo Email Validator","1.0.11","Antideo","https:\u002F\u002Fprofiles.wordpress.org\u002Fantideo\u002F","\u003Cp>The email validator is designed by Antideo to help combat spam coming in through contact forms. Antideo \u003Ca href=\"https:\u002F\u002Fwww.antideo.com\u002Femail-validation\u002F\" rel=\"nofollow ugc\">validates email addresses\u003C\u002Fa> entered through your contact forms in real time to prevent inquiries from fake email addresses. The email validator plugin comes packed with several features that help you –\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Check the syntax of the email entered, to quickly flag the error to the visitor\u003C\u002Fli>\n\u003Cli>Check for disposable or temporary emails\u003C\u002Fli>\n\u003Cli>Prevent inquiries from free ESP’s like Gmail, Yahoo, etc (Can be switched on and off)\u003C\u002Fli>\n\u003Cli>Prevent inquiries from role-based emails like info@, support@, admin@ etc (Can be switched on and off)\u003C\u002Fli>\n\u003Cli>Check MX records to identify invalid emails\u003C\u002Fli>\n\u003Cli>Create and maintain your own local whitelist of domains and emails \u003C\u002Fli>\n\u003Cli>Create and maintain your own local blacklist of domains and emails\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Armed with the capabilities of our plugin you would be able to eliminate a major portion of contact form spam, as spammers seldom use a valid business email address. Our plugin out of the box is compatible with major forms like\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Contact Form 7\u003C\u002Fli>\n\u003Cli>Gravity Forms\u003C\u002Fli>\n\u003Cli>Mailster Form\u003C\u002Fli>\n\u003Cli>WooCommerce\u003C\u002Fli>\n\u003Cli>MailChimp\u003C\u002Fli>\n\u003Cli>Ninja Forms\u003C\u002Fli>\n\u003Cli>Formidable forms\u003C\u002Fli>\n\u003Cli>JetPack comments and a contact form\u003C\u002Fli>\n\u003Cli>MailPoet\u003C\u002Fli>\n\u003Cli>WP-Members\u003C\u002Fli>\n\u003Cli>Paid Membership Pro\u003C\u002Fli>\n\u003Cli>Form Maker by 10Web\u003C\u002Fli>\n\u003Cli>Visual Form Builder\u003Cbr \u002F>\nAnd pretty much any other form that uses the default WordPress is_email() function. The plugin is very easy to install and activate, no tech knowledge whatsoever is needed to get going with the plugin.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Advantages of our plugin\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>No limits on the number of validations – go crazy, it’s unlimited!!\u003C\u002Fli>\n\u003Cli>Real time validations done in a fraction of a second\u003C\u002Fli>\n\u003Cli>Extensive database of 84K+ disposable email domains and constantly being updated with newer ones\u003C\u002Fli>\n\u003Cli>Clean and super friendly UI that is easy to use\u003C\u002Fli>\n\u003Cli>A powerful free version and an affordable premium version \u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>We are literally eating our own dog food, implementing the \u003Ca href=\"https:\u002F\u002Fwww.antideo.com\u002Fwordpress-email-validation-plugin\u002F\" rel=\"nofollow ugc\">Antideo Email Validation plugin\u003C\u002Fa> on several websites that we own, which has resulted in spam inquiries going down by over 87%.\u003C\u002Fp>\n\u003Cp>You can access more information on the plugin as well as the several aspects of email validation \u003Ca href=\"https:\u002F\u002Fwww.antideo.com\u002Fblog\u002F\" rel=\"nofollow ugc\">here\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Disclaimer: This plugin is an email validator and not an email verifier\u003C\u002Fp>\n","Form email validation, Email Blacklist, Domain Blacklist, Form email check, Real time email validator Requires at least: 4.7 Tested up to: 6.9.",900,13361,70,14,"2026-03-12T08:06:00.000Z",[144,145,146,147,148],"disposable-emails","email-checker","email-syntax-check","email-validation","email-validator","https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fantideo-email-validator\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fantideo-email-validator.zip",97,"2026-01-16 00:00:00",{"attackSurface":154,"codeSignals":194,"taintFlows":457,"riskAssessment":636,"analyzedAt":651},{"hooks":155,"ajaxHandlers":174,"restRoutes":175,"shortcodes":183,"cronEvents":193,"entryPointCount":56,"unprotectedCount":13},[156,162,167,170],{"type":157,"name":158,"callback":159,"file":160,"line":161},"action","init","closure","ngav.php",26,{"type":157,"name":163,"callback":164,"file":165,"line":166},"admin_enqueue_scripts","ngAdminEnqueue","src\\classes\\class-admin.php",62,{"type":157,"name":168,"callback":169,"file":165,"line":140},"admin_menu","adminMenu",{"type":157,"name":171,"callback":159,"file":172,"line":173},"rest_api_init","src\\endpoints.php",15,[],[176],{"namespace":177,"route":178,"methods":179,"callback":181,"permissionCallback":25,"file":172,"line":182},"ngv","validate",[180],"POST","validate_serial",16,[184,189],{"tag":185,"callback":186,"file":187,"line":188},"ngv_my_validator_shortcode","ngvValidatorShortcodeFunction","src\\classes\\class-validator.php",46,{"tag":190,"callback":191,"file":187,"line":192},"ngv_serial_shortcode","ngvGenerateSerial",53,[],{"dangerousFunctions":195,"sqlUsage":196,"outputEscaping":255,"fileOperations":24,"externalRequests":24,"nonceChecks":376,"capabilityChecks":455,"bundledLibraries":456},[],{"prepared":197,"raw":198,"locations":199},6,23,[200,204,208,212,214,216,218,220,223,226,228,230,232,234,236,238,241,243,245,247,249,252,254],{"file":201,"line":202,"context":203},"func.php",21,"$wpdb->get_var() with variable interpolation",{"file":205,"line":206,"context":207},"src\\classes\\class-activity-control.php",36,"$wpdb->get_results() with variable interpolation",{"file":209,"line":210,"context":211},"src\\classes\\class-manager.php",175,"$wpdb->query() with variable interpolation",{"file":209,"line":213,"context":211},240,{"file":209,"line":215,"context":203},293,{"file":209,"line":217,"context":203},306,{"file":209,"line":219,"context":203},337,{"file":221,"line":222,"context":203},"src\\classes\\class-settings.php",212,{"file":224,"line":225,"context":211},"src\\classes\\class-storage.php",176,{"file":224,"line":227,"context":211},241,{"file":187,"line":229,"context":203},80,{"file":187,"line":231,"context":207},82,{"file":187,"line":233,"context":203},110,{"file":187,"line":235,"context":211},123,{"file":187,"line":237,"context":211},127,{"file":239,"line":240,"context":203},"src\\templates\\activity-control-options.php",19,{"file":239,"line":242,"context":207},22,{"file":239,"line":244,"context":211},89,{"file":239,"line":246,"context":203},141,{"file":239,"line":248,"context":211},161,{"file":250,"line":251,"context":203},"src\\views\\template-storage.php",41,{"file":250,"line":253,"context":203},54,{"file":250,"line":83,"context":203},{"escaped":256,"rawEcho":257,"locations":258},27,125,[259,262,263,264,265,266,268,270,271,272,274,276,277,279,280,281,283,284,286,287,288,289,291,293,295,297,299,301,303,305,307,308,310,312,313,314,316,318,320,322,324,326,328,330,332,333,335,337,339,341,343,344,345,346,348,350,352,354,356,357,358,360,362,363,365,366,367,368,370,372,374,377,378,379,380,382,383,385,387,388,390,391,392,394,396,397,398,399,401,403,405,407,408,409,410,412,413,414,416,417,419,421,422,424,426,428,429,430,432,434,435,436,437,438,440,441,442,444,446,447,448,449,450,452,454],{"file":201,"line":260,"context":261},79,"raw output",{"file":201,"line":229,"context":261},{"file":201,"line":231,"context":261},{"file":201,"line":231,"context":261},{"file":201,"line":231,"context":261},{"file":201,"line":267,"context":261},86,{"file":201,"line":269,"context":261},88,{"file":201,"line":269,"context":261},{"file":205,"line":253,"context":261},{"file":205,"line":273,"context":261},61,{"file":205,"line":275,"context":261},65,{"file":205,"line":117,"context":261},{"file":205,"line":278,"context":261},68,{"file":205,"line":229,"context":261},{"file":205,"line":231,"context":261},{"file":205,"line":282,"context":261},83,{"file":205,"line":83,"context":261},{"file":205,"line":285,"context":261},87,{"file":205,"line":269,"context":261},{"file":205,"line":244,"context":261},{"file":205,"line":30,"context":261},{"file":205,"line":290,"context":261},99,{"file":205,"line":292,"context":261},114,{"file":205,"line":294,"context":261},115,{"file":205,"line":296,"context":261},116,{"file":205,"line":298,"context":261},119,{"file":205,"line":300,"context":261},120,{"file":205,"line":302,"context":261},121,{"file":205,"line":304,"context":261},128,{"file":205,"line":306,"context":261},138,{"file":165,"line":285,"context":261},{"file":165,"line":309,"context":261},90,{"file":165,"line":311,"context":261},93,{"file":165,"line":55,"context":261},{"file":165,"line":237,"context":261},{"file":209,"line":315,"context":261},189,{"file":209,"line":317,"context":261},301,{"file":209,"line":319,"context":261},305,{"file":209,"line":321,"context":261},307,{"file":209,"line":323,"context":261},316,{"file":209,"line":325,"context":261},332,{"file":209,"line":327,"context":261},336,{"file":209,"line":329,"context":261},338,{"file":221,"line":331,"context":261},131,{"file":221,"line":331,"context":261},{"file":221,"line":334,"context":261},132,{"file":221,"line":336,"context":261},134,{"file":224,"line":338,"context":261},190,{"file":239,"line":340,"context":261},24,{"file":342,"line":44,"context":261},"src\\views\\template-generator.php",{"file":342,"line":182,"context":261},{"file":342,"line":242,"context":261},{"file":342,"line":242,"context":261},{"file":342,"line":347,"context":261},25,{"file":342,"line":349,"context":261},29,{"file":342,"line":351,"context":261},34,{"file":342,"line":353,"context":261},38,{"file":342,"line":355,"context":261},40,{"file":342,"line":251,"context":261},{"file":342,"line":188,"context":261},{"file":342,"line":359,"context":261},47,{"file":342,"line":361,"context":261},52,{"file":342,"line":69,"context":261},{"file":342,"line":364,"context":261},59,{"file":342,"line":166,"context":261},{"file":342,"line":275,"context":261},{"file":342,"line":278,"context":261},{"file":342,"line":369,"context":261},71,{"file":342,"line":371,"context":261},76,{"file":342,"line":373,"context":261},77,{"file":375,"line":376,"context":261},"src\\views\\template-settings.php",10,{"file":375,"line":141,"context":261},{"file":375,"line":202,"context":261},{"file":375,"line":340,"context":261},{"file":375,"line":381,"context":261},28,{"file":375,"line":349,"context":261},{"file":375,"line":384,"context":261},32,{"file":375,"line":386,"context":261},33,{"file":375,"line":206,"context":261},{"file":375,"line":389,"context":261},37,{"file":375,"line":355,"context":261},{"file":375,"line":251,"context":261},{"file":375,"line":393,"context":261},45,{"file":375,"line":395,"context":261},50,{"file":375,"line":273,"context":261},{"file":375,"line":269,"context":261},{"file":375,"line":30,"context":261},{"file":375,"line":400,"context":261},98,{"file":375,"line":402,"context":261},106,{"file":375,"line":404,"context":261},108,{"file":375,"line":406,"context":261},111,{"file":375,"line":292,"context":261},{"file":375,"line":294,"context":261},{"file":375,"line":296,"context":261},{"file":375,"line":411,"context":261},117,{"file":375,"line":298,"context":261},{"file":375,"line":237,"context":261},{"file":375,"line":415,"context":261},130,{"file":375,"line":336,"context":261},{"file":375,"line":418,"context":261},142,{"file":375,"line":420,"context":261},143,{"file":375,"line":420,"context":261},{"file":375,"line":423,"context":261},146,{"file":375,"line":425,"context":261},150,{"file":375,"line":427,"context":261},151,{"file":375,"line":427,"context":261},{"file":250,"line":197,"context":261},{"file":250,"line":431,"context":261},7,{"file":250,"line":433,"context":261},17,{"file":250,"line":242,"context":261},{"file":250,"line":347,"context":261},{"file":250,"line":353,"context":261},{"file":250,"line":393,"context":261},{"file":250,"line":439,"context":261},49,{"file":250,"line":395,"context":261},{"file":250,"line":192,"context":261},{"file":250,"line":443,"context":261},55,{"file":250,"line":445,"context":261},64,{"file":250,"line":140,"context":261},{"file":250,"line":369,"context":261},{"file":250,"line":371,"context":261},{"file":250,"line":229,"context":261},{"file":250,"line":451,"context":261},81,{"file":250,"line":453,"context":261},84,{"file":250,"line":267,"context":261},2,[],[458,483,494,521,549,588,600,611,626],{"entryPoint":459,"graph":460,"unsanitizedCount":24,"severity":482},"managerTab (src\\classes\\class-manager.php:253)",{"nodes":461,"edges":478},[462,467,472,476],{"id":463,"type":464,"label":465,"file":209,"line":466},"n0","source","$_SERVER['REQUEST_URI']",298,{"id":468,"type":469,"label":470,"file":209,"line":466,"wp_function":471},"n1","sink","echo() [XSS]","echo",{"id":473,"type":464,"label":474,"file":209,"line":475},"n2","$_POST",315,{"id":477,"type":469,"label":470,"file":209,"line":323,"wp_function":471},"n3",[479,481],{"from":463,"to":468,"sanitized":480},true,{"from":473,"to":477,"sanitized":480},"low",{"entryPoint":484,"graph":485,"unsanitizedCount":24,"severity":482},"\u003Cclass-manager> (src\\classes\\class-manager.php:0)",{"nodes":486,"edges":491},[487,488,489,490],{"id":463,"type":464,"label":465,"file":209,"line":466},{"id":468,"type":469,"label":470,"file":209,"line":466,"wp_function":471},{"id":473,"type":464,"label":474,"file":209,"line":475},{"id":477,"type":469,"label":470,"file":209,"line":323,"wp_function":471},[492,493],{"from":463,"to":468,"sanitized":480},{"from":473,"to":477,"sanitized":480},{"entryPoint":495,"graph":496,"unsanitizedCount":56,"severity":482},"endpoints (src\\classes\\class-settings.php:29)",{"nodes":497,"edges":515},[498,500,503,507,509,512],{"id":463,"type":464,"label":499,"file":221,"line":443},"$_POST (x2)",{"id":468,"type":501,"label":502,"file":221,"line":443},"transform","→ ngvSaveValidator()",{"id":473,"type":469,"label":504,"file":221,"line":505,"wp_function":506},"update_option() [Settings Manipulation]",174,"update_option",{"id":477,"type":464,"label":474,"file":221,"line":508},91,{"id":510,"type":501,"label":511,"file":221,"line":508},"n4","→ ngvCustomShortcodeFunction()",{"id":513,"type":469,"label":504,"file":221,"line":514,"wp_function":506},"n5",145,[516,518,519,520],{"from":463,"to":468,"sanitized":517},false,{"from":468,"to":473,"sanitized":517},{"from":477,"to":510,"sanitized":517},{"from":510,"to":513,"sanitized":517},{"entryPoint":522,"graph":523,"unsanitizedCount":548,"severity":482},"ngvSaveValidator (src\\classes\\class-settings.php:154)",{"nodes":524,"edges":543},[525,528,529,532,533,536,537,541],{"id":463,"type":464,"label":526,"file":221,"line":527},"$_POST['validatortitle']",165,{"id":468,"type":469,"label":504,"file":221,"line":527,"wp_function":506},{"id":473,"type":464,"label":530,"file":221,"line":531},"$_POST['validatortext']",169,{"id":477,"type":469,"label":504,"file":221,"line":531,"wp_function":506},{"id":510,"type":464,"label":534,"file":221,"line":535},"$_POST['validatorresponse1']",179,{"id":513,"type":469,"label":504,"file":221,"line":535,"wp_function":506},{"id":538,"type":464,"label":539,"file":221,"line":540},"n6","$_POST['validatorresponse2']",183,{"id":542,"type":469,"label":504,"file":221,"line":540,"wp_function":506},"n7",[544,545,546,547],{"from":463,"to":468,"sanitized":517},{"from":473,"to":477,"sanitized":517},{"from":510,"to":513,"sanitized":517},{"from":538,"to":542,"sanitized":517},4,{"entryPoint":550,"graph":551,"unsanitizedCount":56,"severity":482},"\u003Cclass-settings> (src\\classes\\class-settings.php:0)",{"nodes":552,"edges":578},[553,555,556,557,558,559,560,561,562,564,566,568,570,572,574,576],{"id":463,"type":464,"label":554,"file":221,"line":309},"$_POST (x3)",{"id":468,"type":469,"label":504,"file":221,"line":514,"wp_function":506},{"id":473,"type":464,"label":526,"file":221,"line":527},{"id":477,"type":469,"label":504,"file":221,"line":527,"wp_function":506},{"id":510,"type":464,"label":530,"file":221,"line":531},{"id":513,"type":469,"label":504,"file":221,"line":531,"wp_function":506},{"id":538,"type":464,"label":534,"file":221,"line":535},{"id":542,"type":469,"label":504,"file":221,"line":535,"wp_function":506},{"id":563,"type":464,"label":539,"file":221,"line":540},"n8",{"id":565,"type":469,"label":504,"file":221,"line":540,"wp_function":506},"n9",{"id":567,"type":464,"label":499,"file":221,"line":443},"n10",{"id":569,"type":501,"label":502,"file":221,"line":443},"n11",{"id":571,"type":469,"label":504,"file":221,"line":505,"wp_function":506},"n12",{"id":573,"type":464,"label":474,"file":221,"line":508},"n13",{"id":575,"type":501,"label":511,"file":221,"line":508},"n14",{"id":577,"type":469,"label":504,"file":221,"line":514,"wp_function":506},"n15",[579,580,581,582,583,584,585,586,587],{"from":463,"to":468,"sanitized":480},{"from":473,"to":477,"sanitized":480},{"from":510,"to":513,"sanitized":480},{"from":538,"to":542,"sanitized":480},{"from":563,"to":565,"sanitized":480},{"from":567,"to":569,"sanitized":517},{"from":569,"to":571,"sanitized":517},{"from":573,"to":575,"sanitized":517},{"from":575,"to":577,"sanitized":517},{"entryPoint":589,"graph":590,"unsanitizedCount":24,"severity":482},"storageTab (src\\views\\template-storage.php:2)",{"nodes":591,"edges":597},[592,593,594,596],{"id":463,"type":464,"label":465,"file":250,"line":188},{"id":468,"type":469,"label":470,"file":250,"line":188,"wp_function":471},{"id":473,"type":464,"label":474,"file":250,"line":595},63,{"id":477,"type":469,"label":470,"file":250,"line":445,"wp_function":471},[598,599],{"from":463,"to":468,"sanitized":480},{"from":473,"to":477,"sanitized":480},{"entryPoint":601,"graph":602,"unsanitizedCount":24,"severity":482},"\u003Ctemplate-storage> (src\\views\\template-storage.php:0)",{"nodes":603,"edges":608},[604,605,606,607],{"id":463,"type":464,"label":465,"file":250,"line":188},{"id":468,"type":469,"label":470,"file":250,"line":188,"wp_function":471},{"id":473,"type":464,"label":474,"file":250,"line":595},{"id":477,"type":469,"label":470,"file":250,"line":445,"wp_function":471},[609,610],{"from":463,"to":468,"sanitized":480},{"from":473,"to":477,"sanitized":480},{"entryPoint":612,"graph":613,"unsanitizedCount":13,"severity":625},"ngvValidatorShortcodeFunction (src\\classes\\class-validator.php:144)",{"nodes":614,"edges":622},[615,617,619],{"id":463,"type":464,"label":474,"file":187,"line":616},168,{"id":468,"type":501,"label":618,"file":187,"line":616},"→ ngv_activity_report_checker()",{"id":473,"type":469,"label":620,"file":239,"line":246,"wp_function":621},"get_var() [SQLi]","get_var",[623,624],{"from":463,"to":468,"sanitized":517},{"from":468,"to":473,"sanitized":517},"high",{"entryPoint":627,"graph":628,"unsanitizedCount":13,"severity":625},"\u003Cclass-validator> (src\\classes\\class-validator.php:0)",{"nodes":629,"edges":633},[630,631,632],{"id":463,"type":464,"label":474,"file":187,"line":616},{"id":468,"type":501,"label":618,"file":187,"line":616},{"id":473,"type":469,"label":620,"file":239,"line":246,"wp_function":621},[634,635],{"from":463,"to":468,"sanitized":517},{"from":468,"to":473,"sanitized":517},{"summary":637,"deductions":638},"The 'numbers-generator-and-validator' plugin v2.0.8 exhibits a mixed security posture. While it shows strengths in avoiding dangerous functions, file operations, and external HTTP requests, several concerning areas require attention. The significant percentage of SQL queries that do not use prepared statements (79%) poses a substantial risk of SQL injection vulnerabilities. Furthermore, a high proportion of output escaping (82%) is not properly handled, increasing the likelihood of cross-site scripting (XSS) attacks. The presence of a REST API route without permission callbacks represents a critical entry point that is unprotected, making it vulnerable to unauthorized access and manipulation.\n\nThe taint analysis reveals two high-severity flows, indicating potential for significant security issues, although they are not classified as critical. The limited number of AJAX handlers and cron events, along with the absence of known vulnerabilities in its history, are positive indicators. However, the high percentage of unsanitized paths in the taint analysis, coupled with the unprotected REST API route and the prevalence of unescaped output and non-prepared SQL statements, collectively suggest a moderate to high security risk. Addressing these specific weaknesses is crucial to improving the plugin's overall security.",[639,641,643,646,648],{"reason":640,"points":173},"REST API route without permission callbacks",{"reason":642,"points":376},"High percentage of SQL queries not using prepared statements",{"reason":644,"points":645},"High percentage of output not properly escaped",8,{"reason":647,"points":376},"High severity taint flows",{"reason":649,"points":650},"Unsanitized paths in taint analysis",5,"2026-03-16T20:31:41.472Z",{"wat":653,"direct":664},{"assetPaths":654,"generatorPatterns":658,"scriptPaths":659,"versionParams":660},[655,656,657],"\u002Fwp-content\u002Fplugins\u002Fnumbers-generator-and-validator\u002Fcss\u002Fstyle.css","\u002Fwp-content\u002Fplugins\u002Fnumbers-generator-and-validator\u002Fjs\u002Fdist\u002Fgenerator.js","\u002Fwp-content\u002Fplugins\u002Fnumbers-generator-and-validator\u002Fjs\u002Fdist\u002Ftabs.js",[],[656,657],[661,662,663],"numbers-generator-and-validator\u002Fcss\u002Fstyle.css?ver=","numbers-generator-and-validator\u002Fjs\u002Fdist\u002Fgenerator.js?ver=","numbers-generator-and-validator\u002Fjs\u002Fdist\u002Ftabs.js?ver=",{"cssClasses":665,"htmlComments":671,"htmlAttributes":672,"restEndpoints":675,"jsGlobals":676,"shortcodeOutput":678},[177,666,667,668,669,670],"ngv-flex-row","ngv-top-20","tab","tablinks","main-tab-content",[],[673,674],"data-index","data-target",[],[677],"ajax_object",[679,185],"[ngv_my_validator_shortcode]"]