<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>How To Archives - WP Software License for WooCommerce</title>
	<atom:link href="https://wpsoftwarelicense.com/documentation_category/how-to/feed/" rel="self" type="application/rss+xml" />
	<link>https://wpsoftwarelicense.com/documentation_category/how-to/</link>
	<description>An easy and secure way to manage product licensing for WooCommerce</description>
	<lastBuildDate>Fri, 23 Jan 2026 10:10:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Selling Licensed Products workflow</title>
		<link>https://wpsoftwarelicense.com/documentation/selling-licensed-products-workflow/</link>
					<comments>https://wpsoftwarelicense.com/documentation/selling-licensed-products-workflow/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 09 Jul 2024 04:17:30 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=541</guid>

					<description><![CDATA[<p>Selling licensed products online has never been easier or more integrated. Whether you&#8217;re offering software licenses, digital content, or other licensed goods, the process is designed to be as seamless as selling any regular product. This approach not only simplifies the setup for store owners but also ensures a smooth shopping experience for customers. Seamless [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/selling-licensed-products-workflow/">Selling Licensed Products workflow</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Selling licensed products online has never been easier or more integrated. Whether you&#8217;re offering software licenses, digital content, or other licensed goods, the process is designed to be as seamless as selling any regular product. This approach not only simplifies the setup for store owners but also ensures a smooth shopping experience for customers.</p>
<h4>Seamless Integration with all existing Products</h4>
<p>One of the standout features of this system is its ability to seamlessly integrate licensed products with regular products in the same store. This means that a customer can add both types of products—licensed and non-licensed—to their cart in a single transaction without any disruptions or complications. For example, a customer might purchase a piece of physical hardware (a non-licensed product) alongside a software license or a digital download (licensed products) in the same order.</p>
<p>This seamless integration eliminates the need for multiple transactions and makes the shopping process more efficient. Customers appreciate the convenience of being able to purchase everything they need in one go, whether they’re buying a combination of licensed and non-licensed products or just one type. This also opens up the possibility for store owners to create bundles or special offers that mix and match these types of products, enhancing sales potential.<span id="more-541"></span></p>
<h4>Compatibility with Various Product Types</h4>
<p>The system is highly versatile, supporting a wide range of product types beyond just simple products. It’s designed to work flawlessly with:</p>
<ul>
<li><strong>Simple Products</strong>: Basic products with no variations or options.</li>
<li><strong>Variable Products</strong>: Products that come in different variations, such as size, color, or configuration, each potentially requiring a unique license.</li>
<li><strong>Grouped Products</strong>: Collections of related products that are sold together as a group. For example, a software suite could be offered as a grouped product, with each application requiring its own license.</li>
<li><strong>Subscription Products</strong>: Products that are sold on a recurring basis, such as monthly or annual software licenses. These can be combined with licensed products to offer ongoing access to updates and support.</li>
</ul>
<p>This flexibility allows you to sell a wide variety of products in the same store, all while maintaining the integrity of the licensing process. For instance, you could sell a subscription to a service that includes access to licensed software, or you could offer a physical product with a digital license included as a bonus. The possibilities are virtually endless, and this versatility is a key strength of the system.</p>
<h4>Consistent Cart and Checkout Layout</h4>
<p>Despite the added complexity of dealing with licensed products, the customer experience remains straightforward and consistent. The cart layout and the checkout process remain the same regardless of whether the products in the cart are licensed or not. This consistency is crucial for maintaining a user-friendly shopping experience, as customers don’t have to navigate different processes or layouts depending on the type of product they’re purchasing.</p>
<p>Here’s an example of how this works in practice:</p>
<ol>
<li><strong>Cart Page</strong>: When a customer adds products to their cart—whether they’re regular or licensed—the cart page displays all items in a unified layout. The customer can review their selections, adjust quantities, and proceed to checkout without encountering any unexpected steps or screens. The example below shows a cart page that includes both regular and licensed products:<img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-542" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/07/plugin-cart.jpg" sizes="(max-width: 600px) 100vw, 600px" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/07/plugin-cart.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/07/plugin-cart-300x215.jpg 300w" alt="Example of a default cart page for licensed products" width="600" height="430" /></li>
<li><strong>Checkout Page</strong>: The checkout process is similarly streamlined. Customers provide their payment and shipping details as usual, and the system automatically handles the generation of license keys for any licensed products. The checkout page does not change in appearance or functionality when licensed products are included, ensuring a smooth and predictable experience for all customers.After the purchase is complete, license keys are automatically generated for each licensed product in the order. These keys are then displayed on the Order Details page and are also sent to the customer via email along with the standard purchase confirmation. This ensures that customers receive everything they need immediately, without any additional steps required on their part.<br />
<img decoding="async" class="alignnone size-full wp-image-543" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/07/plugin-order-details.jpg" sizes="(max-width: 600px) 100vw, 600px" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/07/plugin-order-details.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/07/plugin-order-details-300x165.jpg 300w" alt="Example of an Order Details page displaying generated license keys" width="600" height="330" /></li>
</ol>
<p>&nbsp;</p>
<h4>Extending Functionality with Additional Features</h4>
<p>One of the greatest strengths of this system is its flexibility and extensibility. While the out-of-the-box features are robust, there’s always the option to extend functionality to meet your specific needs. Whether you need to add custom licensing rules, integrate with third-party services, or enhance the customer experience, the system is designed to accommodate these modifications.</p>
<p>For developers and store owners looking to expand their store’s capabilities, the Documentation area offers a wealth of resources. These include:</p>
<ul>
<li><strong>Code Examples</strong>: Practical examples that show how to implement common customizations or extend functionality. This could include adding new types of license keys, integrating with external APIs, or customizing the way license keys are generated and delivered.</li>
<li><strong>API Documentation</strong>: Detailed information on the system’s API, allowing for deeper integrations with other systems or services. For example, you might want to link your licensing system with a CRM or marketing automation platform to enhance your post-purchase engagement with customers.</li>
<li><strong>Hooks and Filters</strong>: A comprehensive guide to the hooks and filters available in the system, enabling developers to modify behavior without altering the core code. This is particularly useful for creating custom workflows or automating certain tasks.</li>
</ul>
<p>These resources make it easier to tailor the system to your unique requirements, ensuring that your store remains flexible and future-proof. Whether you’re a developer looking to build something truly custom or a store owner wanting to make small tweaks, the documentation provides the guidance needed to make these changes confidently.</p>
<p>&nbsp;</p>
<p>Selling licensed products in your eCommerce store doesn’t have to be a complex process. With seamless integration, support for a wide range of product types, and a consistent user experience, this system makes it easy to manage both licensed and regular products side by side. The ability to extend functionality further enhances its value, ensuring that your store can adapt to your needs as they evolve.</p>
<p>Whether you’re just starting with licensed products or looking to expand your offerings, this system provides the tools and flexibility you need to succeed. And with comprehensive documentation to guide you, implementing and customizing the system to fit your specific requirements is both straightforward and accessible.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/selling-licensed-products-workflow/">Selling Licensed Products workflow</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/selling-licensed-products-workflow/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Set Pre-Generated Licence Keys with WooCommerce Software License</title>
		<link>https://wpsoftwarelicense.com/documentation/set-pre-generated-licence-keys-woocommerce-software-license/</link>
					<comments>https://wpsoftwarelicense.com/documentation/set-pre-generated-licence-keys-woocommerce-software-license/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Wed, 02 Aug 2017 13:15:32 +0000</pubDate>
				<guid isPermaLink="false">https://woosoftwarelicense.com/?post_type=documentation&#038;p=624</guid>

					<description><![CDATA[<p>Set Pre-Generated License Keys with WooCommerce Software License The WooCommerce Software License plugin introduces a powerful new feature: the ability to assign and manage pre-generated license keys—also known as manual or admin-provided keys—alongside the plugin&#8217;s automated licensing system. This feature is especially valuable for resellers, software distributors, and developers who already have a pool of [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/set-pre-generated-licence-keys-woocommerce-software-license/">Set Pre-Generated Licence Keys with WooCommerce Software License</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h4 data-start="141" data-end="208">Set Pre-Generated License Keys with WooCommerce Software License</h4>
<p class="" data-start="210" data-end="470">The <strong data-start="237" data-end="269">WooCommerce Software License</strong> plugin introduces a powerful new feature: the ability to assign and manage <strong data-start="345" data-end="375">pre-generated license keys</strong>—also known as manual or admin-provided keys—alongside the plugin&#8217;s automated licensing system.</p>
<p class="" data-start="472" data-end="775">This feature is especially valuable for <strong data-start="512" data-end="525">resellers</strong>, <strong data-start="527" data-end="552">software distributors</strong>, and <strong data-start="558" data-end="572">developers</strong> who already have a pool of license keys generated by third-party systems or external software platforms. Now, you can easily import and manage those existing keys directly within your WooCommerce store.</p>
<h3 data-start="782" data-end="813"></h3>
<h4 data-start="782" data-end="813">Why Use Pre-Generated Keys?</h4>
<p class="" data-start="815" data-end="914">There are many cases where automatic key generation may not fit your business needs. For example:</p>
<ul data-start="915" data-end="1190">
<li class="" data-start="915" data-end="978">
<p class="" data-start="917" data-end="978">You&#8217;re distributing licenses for a third-party app or SaaS.</p>
</li>
<li class="" data-start="979" data-end="1054">
<p class="" data-start="981" data-end="1054">You already purchased or generated license keys from a software vendor.</p>
</li>
<li class="" data-start="1055" data-end="1132">
<p class="" data-start="1057" data-end="1132">You want to handle activation offline or outside of the automated system.</p>
</li>
<li class="" data-start="1133" data-end="1190">
<p class="" data-start="1135" data-end="1190">You need full control over key formatting and delivery.</p>
</li>
</ul>
<p class="" data-start="1192" data-end="1367">Pre-generated keys allow you to bring your own keys into the licensing workflow—<strong data-start="1272" data-end="1293">without giving up</strong> the advanced features offered by the WooCommerce Software License plugin.</p>
<h4 data-start="1374" data-end="1421">
Seamless Integration with Existing Features</h4>
<p class="" data-start="1423" data-end="1553">Even when using your own manually created license keys, you can still benefit from all the existing licensing controls, such as:</p>
<ul data-start="1554" data-end="1854">
<li class="" data-start="1554" data-end="1633">
<p class="" data-start="1556" data-end="1633"><strong data-start="1556" data-end="1575">Allowed Clients</strong> – Restrict license usage to specific customer accounts.</p>
</li>
<li class="" data-start="1634" data-end="1706">
<p class="" data-start="1636" data-end="1706"><strong data-start="1636" data-end="1657">Instances per Key</strong> – Limit the number of activations per license.</p>
</li>
<li class="" data-start="1707" data-end="1768">
<p class="" data-start="1709" data-end="1768"><strong data-start="1709" data-end="1732">Expiration Settings</strong> – Apply validity periods to keys.</p>
</li>
<li class="" data-start="1769" data-end="1854">
<p class="" data-start="1771" data-end="1854"><strong data-start="1771" data-end="1798">License Status Tracking</strong> – Monitor which keys are used, remaining, or pending.</p>
</li>
</ul>
<p class="" data-start="1856" data-end="1995">Your pre-generated keys are fully compatible with the system&#8217;s licensing groups, activation tracking, and customer email delivery features.</p>
<h4 data-start="2002" data-end="2039">
Combine Manual and Automated Keys</h4>
<p class="" data-start="2041" data-end="2175">The plugin allows you to create multiple <strong data-start="2082" data-end="2102">Licensing Groups</strong>, which makes it easy to mix and match key types. For example, you can:</p>
<ul data-start="2176" data-end="2458">
<li class="" data-start="2176" data-end="2266">
<p class="" data-start="2178" data-end="2266">Deliver a <strong data-start="2188" data-end="2198">bundle</strong> that includes both a pre-generated key and an auto-generated one.</p>
</li>
<li class="" data-start="2267" data-end="2380">
<p class="" data-start="2269" data-end="2380">Use automated keys for standard purchases, and pre-generated keys for volume licensing or enterprise clients.</p>
</li>
<li class="" data-start="2381" data-end="2458">
<p class="" data-start="2383" data-end="2458">Segment key pools by product line or platform (e.g., Mac vs. Windows keys).</p>
</li>
</ul>
<p class="" data-start="2460" data-end="2615">This flexibility makes WooCommerce Software License an ideal solution for both direct software sellers and resellers managing external license inventories.</p>
<h4 data-start="2622" data-end="2665">
Getting Started with Pre-Generated Keys</h4>
<ol data-start="2667" data-end="3081">
<li class="" data-start="2667" data-end="2735">
<p class="" data-start="2670" data-end="2735"><strong data-start="2670" data-end="2679">Go to</strong> WooCommerce Products → Product → Product Data → License → <strong data-start="2713" data-end="2732">Predefined Keys</strong>.</p>
</li>
<li class="" data-start="2736" data-end="2809">
<p class="" data-start="2739" data-end="2809">Add your license keys.</p>
</li>
<li class="" data-start="2810" data-end="2866">
<p class="" data-start="2813" data-end="2866">Assign them to the appropriate <strong data-start="2844" data-end="2863">Licensing Group</strong>.</p>
</li>
<li class="" data-start="2867" data-end="2945">
<p class="" data-start="2870" data-end="2945">Optionally set usage limits, expiration dates, and customer access rules.</p>
</li>
<li class="" data-start="2946" data-end="3081">
<p class="" data-start="2949" data-end="3081">When a customer purchases a product associated with that group, the next available key will be automatically assigned and delivered.</p>
</li>
</ol>
<h3 data-start="3088" data-end="3111"><img decoding="async" class="size-full wp-image-625 aligncenter" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-predefined-keys.jpg" alt="" width="613" height="567" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-predefined-keys.jpg 613w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-predefined-keys-600x555.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-predefined-keys-300x277.jpg 300w" sizes="(max-width: 613px) 100vw, 613px" /></h3>
<h3 data-start="3088" data-end="3111"></h3>
<h4 data-start="3088" data-end="3111">Use Case Highlights</h4>
<ul data-start="3113" data-end="3524">
<li class="" data-start="3113" data-end="3221">
<p class="" data-start="3115" data-end="3221"><strong data-start="3115" data-end="3137">Software Resellers</strong>: Easily upload vendor-provided license batches and sell them through WooCommerce.</p>
</li>
<li class="" data-start="3222" data-end="3328">
<p class="" data-start="3224" data-end="3328"><strong data-start="3224" data-end="3249">Educational Licensing</strong>: Distribute license keys in bulk to schools or students with usage tracking.</p>
</li>
<li class="" data-start="3329" data-end="3419">
<p class="" data-start="3331" data-end="3419"><strong data-start="3331" data-end="3353">Enterprise Clients</strong>: Offer pre-arranged keys with customized limits and expiration.</p>
</li>
<li class="" data-start="3420" data-end="3524">
<p class="" data-start="3422" data-end="3524"><strong data-start="3422" data-end="3439">Offline Sales</strong>: Sell licenses at trade shows or events, and activate them later within WooCommerce.</p>
</li>
</ul>
<p class="" data-start="3531" data-end="3879">
With the new <strong data-start="3544" data-end="3573">Pre-Generated License Key</strong> support, WooCommerce Software License gives you the best of both worlds—automation where you need it, and manual control where it matters. Whether you&#8217;re selling your own software or acting as a reseller for others, this feature empowers you to deliver licenses in the exact format your business requires.</p>
<p>&nbsp;</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/set-pre-generated-licence-keys-woocommerce-software-license/">Set Pre-Generated Licence Keys with WooCommerce Software License</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/set-pre-generated-licence-keys-woocommerce-software-license/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Licence Keys Management &#8211; Client interface</title>
		<link>https://wpsoftwarelicense.com/documentation/product-licence-management-client-interface/</link>
					<comments>https://wpsoftwarelicense.com/documentation/product-licence-management-client-interface/#comments</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 11:37:03 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=544</guid>

					<description><![CDATA[<p>Any customer can manage the license keys through default WooCommerce MyAccount Page. Once a purchase is completed a new button Licence Manage appear within the Recent Orders table. The My Order License Keys page, allow customer to administrate all details related to it’s purchase license details, update, delete, transfer, un-assign a domain key, generate more licence keys. [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/product-licence-management-client-interface/">Licence Keys Management &#8211; Client interface</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Any customer can manage the license keys through default WooCommerce MyAccount Page. Once a purchase is completed a new button <strong>Licence Manage</strong> appear within the Recent Orders table.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-545" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-recent-orders.jpg" alt="" width="600" height="300" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-recent-orders.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-recent-orders-300x150.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><span id="more-544"></span></p>
<p>The My Order License Keys page, allow customer to administrate all details related to it’s purchase license details, update, delete, transfer, un-assign a domain key, generate more licence keys. Additional details regarding the licence type are show:</p>
<ul>
<li>A brief description of it for making it easy to identify.</li>
<li>The number of keys left and allowed to generate.</li>
<li>Number of instances a key can be assigned for current licence type.</li>
<li>Number of keys generated and already in use.</li>
</ul>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-546" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-license-keys.jpg" alt="" width="600" height="350" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-license-keys.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-license-keys-300x175.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><img decoding="async" src="file:///D:/rentacod/Propriu/2%20-%20woo%20sl/doc/assets/images/plugin-license-keys.jpg" alt="" /></p>
<p>The process of generating a new key is very simple, selecting the product then <strong>Generate Licence Key</strong>. The drop-down interface element contain details upon products and license keys for current order, as they where defined by shop administrator and availability for current purchase. Once more keys are not available for any of licensed products, the option appear disabled.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-547" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-licence-key-generator.jpg" alt="" width="600" height="200" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-licence-key-generator.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-licence-key-generator-300x100.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>This interface can be modified through filters or copy the <strong>templates/myaccount/my-licence-manage.php </strong>template name to your theme <strong>woocommerce/myaccount/my-licence-manage.php</strong> This is the folder where you will deploy the WooCommerce templates too.</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/product-licence-management-client-interface/">Licence Keys Management &#8211; Client interface</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/product-licence-management-client-interface/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Licence Keys Management – Admin Interface</title>
		<link>https://wpsoftwarelicense.com/documentation/product-licence-management-admin-interface/</link>
					<comments>https://wpsoftwarelicense.com/documentation/product-licence-management-admin-interface/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 12:08:56 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=548</guid>

					<description><![CDATA[<p>The shop administrator can manage any licence aspects of a product purchase through the WooCommerce Orders interface. Administrators can delete keys, generate new ones, un-assign etc. Main Licence Keys interface consist of a list of all keys from all orders. This facilitate an easy management through the interface functions which include filters and search. Full [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/product-licence-management-admin-interface/">Licence Keys Management – Admin Interface</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The shop administrator can manage any licence aspects of a product purchase through the WooCommerce Orders interface. Administrators can delete keys, generate new ones, un-assign etc.</p>
<p>Main Licence Keys interface consist of a list of all keys from all orders. This facilitate an easy management through the interface functions which include filters and search.</p>
<p><img loading="lazy" decoding="async" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/admin-all-licences-interface.jpg" alt="" width="1190" height="568" class="alignnone size-full wp-image-689" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/admin-all-licences-interface.jpg 1190w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/admin-all-licences-interface-600x286.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/admin-all-licences-interface-300x143.jpg 300w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/admin-all-licences-interface-768x367.jpg 768w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/admin-all-licences-interface-1024x489.jpg 1024w" sizes="auto, (max-width: 1190px) 100vw, 1190px" /></p>
<p>Full control of each license is available through an additional metabox interface at the admin order page.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-549" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-admin-interface-orders.jpg" alt="" width="600" height="535" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-admin-interface-orders.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/plugin-admin-interface-orders-300x268.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></p>
<p>Admin can modify order license details individually from original data.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-550" src="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface.jpg" alt="" width="773" height="436" srcset="https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface.jpg 773w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-600x338.jpg 600w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-300x169.jpg 300w, https://wpsoftwarelicense.com/wp-content/uploads/2017/08/woocommerce-software-licence-order-licence-admin-interface-768x433.jpg 768w" sizes="auto, (max-width: 773px) 100vw, 773px" /></p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/product-licence-management-admin-interface/">Licence Keys Management – Admin Interface</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/product-licence-management-admin-interface/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>API Methods</title>
		<link>https://wpsoftwarelicense.com/documentation/api-methods/</link>
					<comments>https://wpsoftwarelicense.com/documentation/api-methods/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 12:11:26 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=551</guid>

					<description><![CDATA[<p>The built-in API interface is a convenient way to allow your software to communication with the WooCommerce Software License API. Calls are initiated through GET/POST method. Additional code examples are included within the plugin download, also in our documentation area Software API Integration code example. The following methods are available: activate deactivate status-check plugin_update plugin_information theme_update [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/api-methods/">API Methods</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The built-in API interface is a convenient way to allow your software to communication with the WooCommerce Software License API. Calls are initiated through <strong>GET</strong>/<strong>POST</strong> method. Additional code examples are included within the plugin download, also in our documentation area <a href="https://wpsoftwarelicense.com/documentation/software-api-integration-code-example/" target="_blank" rel="noopener">Software API Integration code example</a>.<br />
The following methods are available:</p>
<ul>
<li>activate</li>
<li>deactivate</li>
<li>status-check</li>
<li>plugin_update</li>
<li>plugin_information</li>
<li>theme_update</li>
<li>code_version</li>
<li>key_delete</li>
</ul>
<p>Each function generally requires some combination of the following input values:</p>
<ul>
<li><strong>woo_sl_action</strong>: plugin function requested</li>
<li><strong>licence_key</strong>: the license key that was sent to the user</li>
<li><strong>product_unique_id</strong>: the Software Unique ID as defined in the WooCommerce product License tab</li>
<li><strong>domain</strong>: the URL to a WordPress site using a plugin or a unique hash for standalone software</li>
<li><strong>api_version</strong>: an API version to use, if not specified 1.0 will be used. Latest available is 1.1</li>
</ul>
<p>For each function, the returned values are:</p>
<ul>
<li>status =&gt; error or success message (string)</li>
<li>status_code =&gt; result code (integer)</li>
<li>message =&gt; explanation of result (string)</li>
<li>update_data ( specific methods ) =&gt; code update details (object)</li>
</ul>
<p>&nbsp;</p>
<p>The <strong>domain</strong> input ( unique hash ) is processed on API calls using regex, so it should be also validated on the client, before sending the request, to include the following allowed chars:</p>
<ul>
<li>alphanumeric characters ( lowercase and uppercases)</li>
<li>dots</li>
<li>minus</li>
<li>underlines</li>
<li>forward slashes</li>
<li>spaces</li>
</ul>
<p>&nbsp;</p>
<h4><strong>activate</strong></h4>
<p>This method allows a license key to be synchronized with your software for activation. The following arguments are required for a typical software-license call:</p>
<ul>
<li>woo_sl_action = ‘activate’</li>
<li>product_unique_id</li>
<li>licence_key</li>
<li>domain</li>
</ul>
<h4><strong>deactivate</strong></h4>
<p>This method facilitate a licence key de-activation. Once de-activated a key is released from being set as used status, and it can be integrated with another domain / hash. The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘deactivate’</li>
<li>product_unique_id</li>
<li>licence_key</li>
<li>domain</li>
</ul>
<h4><strong>status-check</strong></h4>
<p>The status-check API method allow a certain software key to be verified for being still active, valid, assigned to a certain domain. The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘status-check’</li>
<li>product_unique_id</li>
<li>licence_key</li>
<li>domain</li>
</ul>
<h4><strong>plugin_update</strong></h4>
<p>The plugin_update API method return basic details regarding software update. The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘plugin_update’</li>
<li>product_unique_id</li>
<li>licence_key</li>
<li>version</li>
<li>domain</li>
</ul>
<h4><strong>theme_update</strong></h4>
<p>The theme_update API method return basic details regarding theme software update. The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘theme_update’</li>
<li>product_unique_id</li>
<li>licence_key</li>
<li>version</li>
<li>domain</li>
</ul>
<h4><strong>plugin_information</strong></h4>
<p>The plugin_information API method return detailed information’s regarding software as download link, latest software, upgrade notice, requires, description details, installation, faq, screenshot, changelog etc. The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘plugin_information’</li>
<li>product_unique_id</li>
<li>licence_key</li>
<li>version</li>
<li>domain</li>
</ul>
<h4><strong>code_version</strong></h4>
<p>The method return detailed information’s regarding a licenced product, latest version, upgrade notice, requires, description details, installation, faq, screenshot, changelog etc. The difference from other API methods,this does not require a key, but there’s no download / update link provided.<br />
The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘code_version’</li>
<li>product_unique_id</li>
</ul>
<h4><strong>key_delete</strong></h4>
<p>Through this API method a key can be removed from the customer dashboard. By deleting a key, a new slot will be open so another licence key can be generated. The following arguments are required for a call:</p>
<ul>
<li>woo_sl_action = ‘key_delete’</li>
<li>product_unique_id</li>
<li>licence_key</li>
</ul>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/api-methods/">API Methods</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/api-methods/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Explain API status codes</title>
		<link>https://wpsoftwarelicense.com/documentation/explain-api-status-codes/</link>
					<comments>https://wpsoftwarelicense.com/documentation/explain-api-status-codes/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Mon, 05 Mar 2018 21:06:48 +0000</pubDate>
				<category><![CDATA[News]]></category>
		<guid isPermaLink="false">https://woosoftwarelicense.com/?post_type=documentation&#038;p=800</guid>

					<description><![CDATA[<p>The post <a href="https://wpsoftwarelicense.com/documentation/explain-api-status-codes/">Explain API status codes</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<section class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element " >
		<div class="wpb_wrapper">
			<p>On site interaction using any <a href="https://wpsoftwarelicense.com/documentation/api-methods/">API methods</a>, the system reply through an JSON encoded message including a status code to makes interpretation easier.</p>
<h4><strong>Success</strong></h4>
<ul>
<li><strong>s100</strong><br />
Licence Key Successfully activated for &#8216;domain&#8217;</li>
<li><strong>s101</strong><br />
Licence Key Successfully activated for &#8216;domain&#8217; &#8211; *<small>first pass</small></li>
<li><strong>s201</strong><br />
Licence Key Successfully Unassigned</li>
<li><strong>s203</strong><br />
Licence Key Is Unassigned</li>
<li><strong>s205</strong><br />
Licence key Is Active and Valid for Domain ( when assign_domain_to_key_on_status_check option active )</li>
<li><strong>s215</strong><br />
Licence key Is Active and Valid for Domain</li>
<li><strong>s401</strong><br />
*<small>a full response with code metadata on calling plugin_update or theme_update methods</small></li>
<li><strong>s402</strong><br />
*<small>a full response with code metadata on calling plugin_information method</small></li>
<li><strong>s403</strong><br />
*<small>a full response with code metadata on calling code_information method</small></li>
<li><strong>s610</strong><br />
*<small>Licence Key Successfully Deleted</small></li>
</ul>
<h4><strong>Error</strong></h4>
<ul>
<li><strong>e001</strong><br />
Invalid provided data</li>
<li><strong>e002</strong><br />
Invalid licence key</li>
<li><strong>e003</strong><br />
Order does not exist anymore</li>
<li><strong>e004</strong><br />
Order status not allowed</li>
<li><strong>e104</strong><br />
The machine ID / domain is required.</li>
<li><strong>e110</strong><br />
Invalid licence key or licence not active for domain</li>
<li><strong>e111</strong><br />
Invalid Data</li>
<li><strong>e112</strong><br />
You had reached the maximum number of domains for this key</li>
<li><strong>e204</strong><br />
Licence key not active for current domain</li>
<li><strong>e301</strong><br />
Licence Key does not match this product</li>
<li><strong>e312</strong><br />
Licence is not Active, current status is &#8216;STATUS&#8217;</li>
<li><strong>e419</strong><br />
Invalid Product Unique ID</li>
</ul>

		</div>
	</div>
</div></div></div></div>
</section><p>The post <a href="https://wpsoftwarelicense.com/documentation/explain-api-status-codes/">Explain API status codes</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/explain-api-status-codes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Software API Integration code example</title>
		<link>https://wpsoftwarelicense.com/documentation/software-api-integration-code-example/</link>
					<comments>https://wpsoftwarelicense.com/documentation/software-api-integration-code-example/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 12:32:54 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=555</guid>

					<description><![CDATA[<p>Any software can use API functionality. We can provide full code in a form of WordPress plugin which can be used as staring base for further implementation. This is a sample usage on a licence key activation call: The first part of the code consist of few constants definition which are being used later within the [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/software-api-integration-code-example/">Software API Integration code example</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Any software can use API functionality. We can provide full code in a form of WordPress plugin which can be used as staring base for further implementation.</p>
<p>This is a sample usage on a licence key activation call:</p>
<p>The first part of the code consist of few constants definition which are being used later within the code.</p>
<pre class="brush: php; title: ; notranslate">

//the url where the WooCommerce Software License plugin is being installed
define('SL_APP_API_URL',      'http://YourDomainWhereSoftwareManagement.com/index.php');

//the Software Unique ID as defined within product admin page
define('SL_PRODUCT_ID',           'APTO');


$protocol = (!empty($_SERVER&#x5B;'HTTPS']) &amp;&amp; $_SERVER&#x5B;'HTTPS'] !== 'off' || $_SERVER&#x5B;'SERVER_PORT'] == 443) ? &quot;https://&quot; : &quot;http://&quot;;
define('SL_INSTANCE',             str_replace($protocol, &quot;&quot;, get_bloginfo('wpurl')));

</pre>
<p>A simple activation calls will looks like this:</p>
<pre class="brush: php; title: ; notranslate">
    $args = array(
                    'woo_sl_action'         =&gt; 'activate',
                        'licence_key'       =&gt; $license_key,
                        'product_unique_id'        =&gt; SL_PRODUCT_ID,
                        'domain'          =&gt; SL_INSTANCE
                    );
    $request_uri    = SL_APP_API_URL . '?' . http_build_query( $args );
    $data           = wp_remote_get( $request_uri );

    if(is_wp_error( $data ) || $data&#x5B;'response']&#x5B;'code'] != 200)
        {
            //there was a problem establishing a connection to the API server
        }

    $response_block = json_decode( wp_remote_retrieve_body( $data ) );
                      
    if(!is_array($response_block) || count($response_block) &lt; 1)
        return $checked_data;

    //retrieve the last message within the $response_block
    $response_block = $response_block&#x5B;count($response_block) - 1];
    if(isset($response_block-&gt;status))
        {
            if( $response_block-&gt;status == 'success' &amp;&amp; ( $response_block-&gt;status_code == 's100' || $response_block-&gt;status_code == 's101' ) )
                {
                    //the license is active and the software is active
                    //doing further actions like saving the license and allow the plugin to run

                }
                else
                {
                    //there was a problem activating the license
                }
        }
        else
        {
            //there was a problem establishing a connection to the API server
        }
</pre>
<p>The API $data_body response include also a &#8216;message&#8217; argument with <a href="https://wpsoftwarelicense.com/documentation/explain-api-status-codes/">detailed text information of the response</a>. This is always an English text, which can be translated to the local site language using <a href="https://developer.wordpress.org/reference/functions/_e/" target="_blank" rel="noopener">_e</a>, <a href="https://developer.wordpress.org/reference/functions/__/" target="_blank" rel="noopener">__</a> and other WordPress translation functions.</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/software-api-integration-code-example/">Software API Integration code example</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/software-api-integration-code-example/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Plugin autoupdate API integration code example</title>
		<link>https://wpsoftwarelicense.com/documentation/wordpress-plugin-autoupdate-api-integration-code-example/</link>
					<comments>https://wpsoftwarelicense.com/documentation/wordpress-plugin-autoupdate-api-integration-code-example/#comments</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 13:06:14 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=557</guid>

					<description><![CDATA[<p>The first part of the code consist of few constants definition which are being used later within the code. //the url where the WooCommerce Software License plugin is being installed define('SL_APP_API_URL', 'http://YourDomainWhereSoftwareManagement.com/index.php'); //the Software Unique ID as defined within product admin page define('SL_PRODUCT_ID', 'APTO'); //A code variable constant is required, which is the user application [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/wordpress-plugin-autoupdate-api-integration-code-example/">WordPress Plugin autoupdate API integration code example</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The first part of the code consist of few constants definition which are being used later within the code.</p>
<pre class="brush: php; title: ; notranslate">

//the url where the WooCommerce Software License plugin is being installed
define('SL_APP_API_URL',      'http://YourDomainWhereSoftwareManagement.com/index.php');

//the Software Unique ID as defined within product admin page
define('SL_PRODUCT_ID',           'APTO');

//A code variable constant is required, which is the user application code version. This will be used by API to compare against the new version on shop server.
define('SL_VERSION', '1.4.2');

$protocol = (!empty($_SERVER&#x5B;'HTTPS']) &amp;&amp; $_SERVER&#x5B;'HTTPS'] !== 'off' || $_SERVER&#x5B;'SERVER_PORT'] == 443) ? &quot;https://&quot; : &quot;http://&quot;;
define('SL_INSTANCE',             str_replace($protocol, &quot;&quot;, get_bloginfo('wpurl')));

</pre>
<p>A plugin auto-update code can be inserted within the plugin, here is an example:</p>
<pre class="brush: php; title: ; notranslate">

        class WOOSL_CodeAutoUpdate
        {

            // URL to check for updates, this is where the index.php script goes

            public $api_url;

            private $slug;
            public $plugin;
            
            private $API_VERSION;


            function __construct($api_url, $slug, $plugin)
                {
                    $this-&gt;api_url  =   $api_url;
                    $this-&gt;slug     =   $slug;
                    $this-&gt;plugin   =   $plugin;
                    
                    //use laets available API 
                    $this-&gt;API_VERSION =   1.1;
                    
                }

            public function check_for_plugin_update($checked_data)
                {
                     if ( !is_object( $checked_data ) ||  ! isset ( $checked_data-&gt;response ) )
                        return $checked_data;
                     
                     $request_string = $this-&gt;prepare_request('plugin_update');
                     if($request_string === FALSE)
                        return $checked_data;
                     
                     global $wp_version;
                     
                     // Start checking for an update
                     $request_uri = $this-&gt;api_url . '?' . http_build_query( $request_string , '', '&amp;');
                     
                     //check if cached
                     $data  =   get_site_transient( 'my-custom-plugin-check_for_plugin_update_' . md5( $request_uri ) );
                     if  ( $data    === FALSE )
                         {
                             $data = wp_remote_get( $request_uri, array(
                                                                                'timeout'     =&gt; 20,
                                                                                'user-agent'  =&gt; 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ),
                                                                                ) );
                             
                             if(is_wp_error( $data ) || $data&#x5B;'response']&#x5B;'code'] != 200)
                                return $checked_data;
                                
                             set_site_transient( 'my-custom-plugin-check_for_plugin_update_' . md5( $request_uri ), $data, 60 * 60 * 4 );
                             
                         }
                                                  
                     $response_block = json_decode( wp_remote_retrieve_body( $data ) );
                      
                     if(!is_array($response_block) || count($response_block) &lt; 1)
                        return $checked_data;
                     
                     //retrieve the last message within the $response_block
                     $response_block = $response_block&#x5B;count($response_block) - 1];
                     
                     $response  =   $this-&gt;postprocess_response( $response_block );
                     if ( $response ) 
                        {
                            //update any licensing data
                            if ( $refresh )
                                {
                                    if ( isset ( $response_block-&gt;licence_status ) )
                                        $this-&gt;licence&#x5B;'licence_status']    =   $response_block-&gt;licence_status;
                                    if ( isset ( $response_block-&gt;licence_expire ) )
                                        $this-&gt;licence&#x5B;'licence_expire']    =   $response_block-&gt;licence_expire;
                                        else
                                        $this-&gt;licence&#x5B;'licence_expire']    =   '';
                                    
                                     WooGC_licence::update_licence_data( $this-&gt;licence );
                                }
                            
                            if ( ! isset ( $response-&gt;new_version ) )
                                return $checked_data;
                            
                            //check if the returned version is higher
                            if ( isset ( $response-&gt;new_version )   &amp;&amp;  version_compare( $response-&gt;new_version, WOOGC_VERSION, '&lt;'  ) )
                                return $checked_data;
                                
                            $checked_data-&gt;response&#x5B;$this-&gt;plugin] = $response;
                            
                            
                        }
                        
                     return $checked_data;
                }

            public function plugins_api_call($def, $action, $args)
                {
                     if (!is_object($args) || !isset($args-&gt;slug) || $args-&gt;slug != $this-&gt;slug)
                        return $def;
    
                     $request_string = $this-&gt;prepare_request($action, $args);
                     if($request_string === FALSE)
                        return new WP_Error('plugins_api_failed', __('An error occour when try to identify the pluguin.' , 'woo-global-cart') . '&amp;lt;/p&gt; &amp;lt;p&gt;&amp;lt;a href=&amp;quot;?&amp;quot; onclick=&amp;quot;document.location.reload(); return false;&amp;quot;&gt;'. __( 'Try again', 'woo-global-cart' ) .'&amp;lt;/a&gt;');;
                     
                     global $wp_version;
                     
                     $request_uri = $this-&gt;api_url . '?' . http_build_query( $request_string , '', '&amp;');
                     $data = wp_remote_get( $request_uri, array(
                                                                        'timeout'     =&gt; 20,
                                                                        'user-agent'  =&gt; 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ),
                                                                        ) );
                     
                     if(is_wp_error( $data ) || $data&#x5B;'response']&#x5B;'code'] != 200)
                        return new WP_Error('plugins_api_failed', __('An Unexpected HTTP Error occurred during the API request.' , 'woo-global-cart') . '&amp;lt;/p&gt; &amp;lt;p&gt;&amp;lt;a href=&amp;quot;?&amp;quot; onclick=&amp;quot;document.location.reload(); return false;&amp;quot;&gt;'. __( 'Try again', 'woo-global-cart' ) .'&amp;lt;/a&gt;', $data-&gt;get_error_message());
                     
                     $response_block = json_decode( wp_remote_retrieve_body( $data ) );
                     
                     if( ! is_array($response_block) || count( $response_block ) &lt; 1 )
                        return $def;
                        
                     //retrieve the last message within the $response_block
                     $response_block = $response_block&#x5B; count( $response_block ) - 1 ];
                     
                     $response  =   $this-&gt;postprocess_response( $response_block );
                     if ( $response ) 
                        return $response;
                }

            public function prepare_request($action, $args = array())
                {
                    global $wp_version;
                    
                    return array(
                        'woo_sl_action'         =&gt; $action,
                        'version'               =&gt; SL_VERSION,
                        'product_unique_id'     =&gt; SL_PRODUCT_ID,
                        'licence_key'           =&gt; LICENSE_KEY,
                        'domain'                =&gt; SL_INSTANCE,
                        'wp-version'            =&gt; $wp_version,
                        
                        'api_version'           =&gt; $this-&gt;API_VERSION
                    );
                }
            
            private function postprocess_response( $response_block )
                 {
                     $response = isset( $response_block-&gt;update_data ) ? $response_block-&gt;update_data : '';
                     
                     if ( is_object( $response ) &amp;&amp; ! empty ( $response ) )
                         {
                             //include slug and plugin data
                             $response-&gt;slug    =   $this-&gt;slug;
                             $response-&gt;plugin  =   $this-&gt;plugin;
                             
                             //if sections are being set
                             if ( isset ( $response-&gt;sections ) )
                                $response-&gt;sections = (array)$response-&gt;sections;
                             
                             //if banners are being set
                             if ( isset ( $response-&gt;banners ) )
                                $response-&gt;banners = (array)$response-&gt;banners;
                               
                             //if icons being set, convert to array
                             if ( isset ( $response-&gt;icons ) )
                                $response-&gt;icons    =   (array)$response-&gt;icons;
                             
                             return $response;
                         }
      
                     return FALSE;
                     
                 }
        }

        function WOOSL_run_updater()
            {
                $wp_plugin_auto_update = new WOOSL_CodeAutoUpdate(SL_APP_API_URL, 'plugin-slug', 'plugin-folder/plugin-filename.php');

                // Take over the update check

                add_filter('pre_set_site_transient_update_plugins', array(
                    $wp_plugin_auto_update,
                    'check_for_plugin_update'
                ));

                // Take over the Plugin info screen

                add_filter('plugins_api', array(
                    $wp_plugin_auto_update,
                    'plugins_api_call'
                ) , 10, 3);
            }

        add_action('after_setup_theme', 'WOOSL_run_updater');

</pre>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/wordpress-plugin-autoupdate-api-integration-code-example/">WordPress Plugin autoupdate API integration code example</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/wordpress-plugin-autoupdate-api-integration-code-example/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Theme autoupdate API integration code example</title>
		<link>https://wpsoftwarelicense.com/documentation/wordpress-theme-autoupdate-api-integration-code-example/</link>
					<comments>https://wpsoftwarelicense.com/documentation/wordpress-theme-autoupdate-api-integration-code-example/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Tue, 01 Aug 2017 13:08:04 +0000</pubDate>
				<guid isPermaLink="false">http://127.0.0.1/sites/woo-software-license/?post_type=documentation&#038;p=558</guid>

					<description><![CDATA[<p>This is an API example on how to use the Theme AutoUpdate functionality. define('WOO_SLT_APP_API_URL', 'http://YourDomainWhereSoftwareManagement.com/index.php'); define('WOO_SLT_PRODUCT_ID', 'Unitque Software ID #@3'); define('WOO_SLT_VERSION', '1.0'); define('WOO_SLT_INSTANCE', str_replace(array (&#34;https://&#34; , &#34;http://&#34;), &#34;&#34;, network_site_url()));; define('WOO_SLT_THEME_SLUG', 'my-theme-slug' ); define('WOO_SLT_CHANGELOG_URL', 'http://YourDomainWhereSoftwareManagement.com/changelog/'); class WOO_SLT_CodeAutoUpdate { # URL to check for updates, this is where the index.php script goes public $api_url; private $slug; public [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/wordpress-theme-autoupdate-api-integration-code-example/">WordPress Theme autoupdate API integration code example</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This is an API example on how to use the Theme AutoUpdate functionality.</p>
<pre class="brush: php; title: ; notranslate">
    
        define('WOO_SLT_APP_API_URL',      'http://YourDomainWhereSoftwareManagement.com/index.php');
        define('WOO_SLT_PRODUCT_ID',       'Unitque Software ID #@3');
        define('WOO_SLT_VERSION',          '1.0');
        
        define('WOO_SLT_INSTANCE',         str_replace(array (&quot;https://&quot; , &quot;http://&quot;), &quot;&quot;, network_site_url()));;
        define('WOO_SLT_THEME_SLUG',        'my-theme-slug' );
        define('WOO_SLT_CHANGELOG_URL',     'http://YourDomainWhereSoftwareManagement.com/changelog/');

            class WOO_SLT_CodeAutoUpdate
                {
                    # URL to check for updates, this is where the index.php script goes
                    public $api_url;

                    private $slug;

                    public function __construct( $api_url, $slug )
                    {
                    $this-&gt;api_url = $api_url;

                    $this-&gt;slug    = $slug;                 
                    }


                    public function check_for_theme_update($checked_data)
                        {
                            if ( !is_object( $checked_data ) ||  ! isset ( $checked_data-&gt;response ) )
                                return $checked_data;

                            $request_string = $this-&gt;prepare_request('theme_update');
                            if($request_string === FALSE)
                                return $checked_data;

                            // Start checking for an update
                            $request_uri = $this-&gt;api_url . '?' . http_build_query( $request_string , '', '&amp;');
                            $data = wp_remote_get( $request_uri );

                            if(is_wp_error( $data ) || $data&#x5B;'response']&#x5B;'code'] != 200)
                                return $checked_data;

                            $response_block = json_decode( wp_remote_retrieve_body( $data ) );

                            if(!is_array($response_block) || count($response_block) &lt; 1)
                                return $checked_data;
                             
                             //retrieve the last message within the $response_block
                             $response_block = $response_block&#x5B;count($response_block) - 1];
                             
                             $response  =   $this-&gt;postprocess_response( $response_block );
                             if ( $response ) 
                                {                                    
                                    if ( ! isset ( $response-&gt;new_version ) )
                                        return $checked_data;
                                    
                                    //check if the returned version is higher
                                    if ( isset ( $response-&gt;new_version )   &amp;&amp;  version_compare( $response-&gt;new_version, WOOGC_VERSION, '&lt;'  ) )
                                        return $checked_data;
                                        
                                    $checked_data-&gt;response&#x5B;$this-&gt;plugin] = $response;                                    
                                }
                                
                             return $checked_data;
                        }


                    public function theme_api_call($def, $action, $args)
                        {
                            if (!is_object($args) || !isset($args-&gt;slug) || $args-&gt;slug != $this-&gt;slug)
                                return $def;
                             
                            $request_string = $this-&gt;prepare_request($action, $args);
                            if($request_string === FALSE)
                                return new WP_Error('theme_api_failed', __('An error occour when try to identify the pluguin.' , 'wooslt') . '&amp;lt;/p&gt; &amp;lt;p&gt;&amp;lt;a href=&amp;quot;?&amp;quot; onclick=&amp;quot;document.location.reload(); return false;&amp;quot;&gt;'. __( 'Try again', 'wooslt' ) .'&amp;lt;/a&gt;');;

                            $request_uri = $this-&gt;api_url . '?' . http_build_query( $request_string , '', '&amp;');
                            $data = wp_remote_get( $request_uri );

                            if(is_wp_error( $data ) || $data&#x5B;'response']&#x5B;'code'] != 200)
                            return new WP_Error('theme_api_failed', __('An Unexpected HTTP Error occurred during the API request.' , 'wooslt') . '&amp;lt;/p&gt; &amp;lt;p&gt;&amp;lt;a href=&amp;quot;?&amp;quot; onclick=&amp;quot;document.location.reload(); return false;&amp;quot;&gt;'. __( 'Try again', 'wooslt' ) .'&amp;lt;/a&gt;', $data-&gt;get_error_message());

                            $response_block = json_decode( wp_remote_retrieve_body( $data ) );
                     
                             if( ! is_array($response_block) || count( $response_block ) &lt; 1 )
                                return $def;
                                
                             //retrieve the last message within the $response_block
                             $response_block = $response_block&#x5B; count( $response_block ) - 1 ];
                             
                             $response  =   $this-&gt;postprocess_response( $response_block );
                             if ( $response ) 
                                return $response;
                        }

                        
                    public function prepare_request($action, $args = array())
                        {
                            global $wp_version;

                            $license_data = get_site_option('slt_license'); 

                            return array(
                                         'woo_sl_action'        =&gt; $action,
                                         'version'              =&gt; WOO_SLT_VERSION,
                                         'product_unique_id'    =&gt; WOO_SLT_PRODUCT_ID,
                                         'licence_key'          =&gt; $license_data&#x5B;'key'],
                                         'domain'               =&gt; WOO_SLT_INSTANCE,
                                         
                                         'wp-version'           =&gt; $wp_version,
                                         'api_version'          =&gt; '1.1'
                                         
                            );
                        }


                    private function postprocess_response( $response_block )
                         {
                             $response = isset( $response_block-&gt;update_data ) ? $response_block-&gt;update_data : '';
                             
                             if ( is_object( $response ) &amp;&amp; ! empty ( $response ) )
                                 {
                                     //include slug and plugin data
                                     $response-&gt;slug    =   $this-&gt;slug;
                                     $response-&gt;plugin  =   $this-&gt;plugin;
                                     
                                     //if sections are being set
                                     if ( isset ( $response-&gt;sections ) )
                                        $response-&gt;sections = (array)$response-&gt;sections;
                                     
                                     //if banners are being set
                                     if ( isset ( $response-&gt;banners ) )
                                        $response-&gt;banners = (array)$response-&gt;banners;
                                       
                                     //if icons being set, convert to array
                                     if ( isset ( $response-&gt;icons ) )
                                        $response-&gt;icons    =   (array)$response-&gt;icons;
                                     
                                     return $response;
                                 }
                             
                             return FALSE;
                             
                         }

                }
             
             
        function WOO_SLT_run_updater()
             {
             
                 $wp_theme_auto_update = new WOO_SLT_CodeAutoUpdate( WOO_SLT_APP_API_URL, WOO_SLT_THEME_SLUG );
                 
                 // Take over the update check
                 add_filter('site_transient_update_themes',                                        array($wp_theme_auto_update, 'check_for_theme_update'));
                 
                 // Take over the Plugin info screen
                 add_filter('theme_api',                                                          array($wp_theme_auto_update, 'theme_api_call'), 10, 3);
             
             }
        add_action( 'after_setup_theme', 'WOO_SLT_run_updater' );
    
</pre>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/wordpress-theme-autoupdate-api-integration-code-example/">WordPress Theme autoupdate API integration code example</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/wordpress-theme-autoupdate-api-integration-code-example/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>API v1.2: Update Data Separation and Migration Guide for old Codes</title>
		<link>https://wpsoftwarelicense.com/documentation/api-v1-2-update-data-separation-and-migration-guide-for-old-codes/</link>
					<comments>https://wpsoftwarelicense.com/documentation/api-v1-2-update-data-separation-and-migration-guide-for-old-codes/#respond</comments>
		
		<dc:creator><![CDATA[woocommerce-sl]]></dc:creator>
		<pubDate>Fri, 23 Jan 2026 09:09:41 +0000</pubDate>
				<guid isPermaLink="false">https://wpsoftwarelicense.com/?post_type=documentation&#038;p=2355</guid>

					<description><![CDATA[<p>WP Software License has introduced API version 1.2 to improve response handling and provide better structured data for update operations. While API 1.1 is deprecated, we understand that installations still run older plugins/themes versions that depend on the legacy format. This guide explains the differences between versions and how to maintain backwards compatibility. Key Differences [&#8230;]</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/api-v1-2-update-data-separation-and-migration-guide-for-old-codes/">API v1.2: Update Data Separation and Migration Guide for old Codes</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>WP Software License has introduced API version 1.2 to improve response handling and provide better structured data for update operations. While API 1.1 is deprecated, we understand that installations still run older plugins/themes versions that depend on the legacy format. This guide explains the differences between versions and how to maintain backwards compatibility.<br />
<span id="more-2355"></span></p>
<h4>Key Differences Between API 1.1 and 1.2</h4>
<p><strong>API 1.1 (Deprecated)</strong></p>
<p>In API 1.1, update data was embedded directly within the <strong>message</strong> field. When calling update-related endpoints like <code>plugin_update</code>, <code>theme_update</code>, <code>plugin_information</code>, or <code>code_version</code>, the entire response structure contained serialized update information within a single field.</p>
<p><strong>API 1.2 (Current)</strong></p>
<p>API 1.2 introduces a cleaner, more structured approach:</p>
<ul>
<li><strong>Dedicated update_data field</strong>: All update details are now contained in a separate, clearly defined entry</li>
<li><strong>Clean message field</strong>: Contains human-readable text messages (e.g., &#8220;Plugin update check completed&#8221;) for logging and debugging purposes</li>
</ul>
<p>&nbsp;</p>
<h4>Update Data Structure (API 1.2)</h4>
<p>The update_data field in API 1.2 includes:</p>
<ul>
<li>new_version: The latest available version number (e.g., &#8220;1.4.6&#8221;)</li>
<li>date: Release date in YYYY-MM-DD format (e.g., &#8220;2023-09-18&#8221;)</li>
<li>package: Download URL with authentication parameters for secure retrieval</li>
<li>upgrade_notice: User-facing information about the update</li>
<li>author: Plugin/theme author name</li>
<li>tested: WordPress version compatibility indicator</li>
<li>homepage: Official product homepage URL</li>
<li>icons: SVG or image assets for display purposes</li>
</ul>
<p><strong>Managing Backwards Compatibility</strong></p>
<p>The primary challenge occurs when older plugin installations continue to expect the API 1.1 format. To solve this without requiring immediate updates across all installations, implement a response adapter, through a custom code, can be used.  Older plugins that expect the full update payload inside <code data-start="1613" data-end="1622">message</code> will fail or ignore updates when talking to a v1.2 server.</p>
<p>The custom code should detect the requesting plugin version and adjust the response accordingly:</p>
<ol>
<li><strong>Version Detection</strong>: Check the API request for a version header or parameter indicating which format the caller expects</li>
<li><strong>Conditional Response Formatting</strong>: If the request originates from API 1.1-compatible code, reformat the API 1.2 response to match the legacy structure</li>
<li><strong>Transparent Migration</strong>: This approach allows old plugins to continue functioning while new versions benefit from the improved structure</li>
</ol>
<p>The following code should be inserted within <code>/wp-content/mu-plugins/woosl-custom.php</code>  to ensure that when caching is active, the code is loaded:</p>
<pre class="brush: php; title: ; notranslate">
    add_filter('WOOSL/API_call/response', '_woosl_api_response_convert_to_outdated_plugins', 10, 3);
    function _woosl_api_response_convert_to_outdated_plugins( $response, $args, $api_object )
        {
            //The plugin slug for which we check the API response
            $PluginSlug     =   'my_custom_plugin_slug';
            
            //The plugin version considered outdated, which will receive the response in the old API format.
            //If the call does not include a version, it will be considered an old plugin version
            $PluginOutdatedVersion  =   '1.2';
            
            
            
            
            If ( $args&#x5B;'product_unique_id'] !== $PluginSlug )
                return $response; 
            
            If ( ! empty ( $args&#x5B;'version'] ) &amp;&amp;  version_compare( $args&#x5B;'version'], $PluginOutdatedVersion, '&gt;'))
                return $response;
            
            //check if the API call method is not activate
            $allowed_methods    =   array ( 
                                                'plugin_update',
                                                'theme_update',
                                                'plugin_information',
                                                'code_version',
                                                );
            if  ( ! in_array ( $args&#x5B;'woo_sl_action'], $allowed_methods) ) 
                return $response;
                
            if ( !is_array ( $response )    ||  count ( $response ) &lt;   1 )
                return $response;
                
            foreach ( $response as  $key    =&gt;  $response_block )
                {
                    if ( isset ( $response_block&#x5B;'update_data'] ) )
                        $response&#x5B; $key ]&#x5B;'message']    =   $response_block&#x5B;'update_data'];
                }
                  
                        
            return $response;
        }
</pre>
<p>In the code above, update $PluginSlug to match your plugin&#8217;s identifier and set $PluginOutdatedVersion to the highest version number still using the API 1.1 format. This ensures the adapter correctly routes legacy requests to the appropriate response structure.</p>
<p>This ensures that:</p>
<ul>
<li>New plugins receive clean, structured API 1.2 responses</li>
<li>Legacy plugins continue to function without modification</li>
<li>You maintain a single API endpoint serving both formats</li>
<li>Plugin authors can migrate to the new format at their own pace</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The post <a href="https://wpsoftwarelicense.com/documentation/api-v1-2-update-data-separation-and-migration-guide-for-old-codes/">API v1.2: Update Data Separation and Migration Guide for old Codes</a> appeared first on <a href="https://wpsoftwarelicense.com">WP Software License for WooCommerce</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpsoftwarelicense.com/documentation/api-v1-2-update-data-separation-and-migration-guide-for-old-codes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
