diff --git a/plugins/woocommerce-admin/changelogs/add-7445_include_subscriptions b/plugins/woocommerce-admin/changelogs/add-7445_include_subscriptions
new file mode 100644
index 00000000000..2c6dc7da2e0
--- /dev/null
+++ b/plugins/woocommerce-admin/changelogs/add-7445_include_subscriptions
@@ -0,0 +1,4 @@
+Significance: minor
+Type: Add
+
+Store Profiler and Product task - include Subscriptions #7734
diff --git a/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/index.js b/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/index.js
index 6e443018fbc..dd4060b09dd 100644
--- a/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/index.js
+++ b/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/index.js
@@ -178,22 +178,41 @@ export const SelectiveExtensionsBundle = ( {
const [ showExtensions, setShowExtensions ] = useState( false );
const [ values, setValues ] = useState( baseValues );
- const { freeExtensions, isResolving } = useSelect( ( select ) => {
- const { getFreeExtensions, hasFinishedResolution } = select(
- ONBOARDING_STORE_NAME
- );
+ const { freeExtensions, isResolving, profileItems } = useSelect(
+ ( select ) => {
+ const {
+ getFreeExtensions,
+ getProfileItems,
+ hasFinishedResolution,
+ } = select( ONBOARDING_STORE_NAME );
- return {
- freeExtensions: getFreeExtensions(),
- isResolving: ! hasFinishedResolution( 'getFreeExtensions' ),
- };
- } );
+ return {
+ freeExtensions: getFreeExtensions(),
+ isResolving: ! hasFinishedResolution( 'getFreeExtensions' ),
+ profileItems: getProfileItems(),
+ };
+ }
+ );
const installableExtensions = useMemo( () => {
+ const { product_types: productTypes } = profileItems;
return freeExtensions.filter( ( list ) => {
+ if (
+ window.wcAdminFeatures &&
+ window.wcAdminFeatures.subscriptions
+ ) {
+ if ( productTypes.includes( 'subscriptions' ) ) {
+ list.plugins = list.plugins.filter(
+ ( extension ) =>
+ extension.key !== 'woocommerce-payments' ||
+ ( extension.key === 'woocommerce-payments' &&
+ ! extension.is_activated )
+ );
+ }
+ }
return ALLOWED_PLUGIN_LISTS.includes( list.key );
} );
- }, [ freeExtensions ] );
+ }, [ freeExtensions, profileItems ] );
useEffect( () => {
const initialValues = createInitialValues( installableExtensions );
diff --git a/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/test/index.js b/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/test/index.js
index 64b09a576b4..065b4d09ec2 100644
--- a/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/test/index.js
+++ b/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/selective-extensions-bundle/test/index.js
@@ -1,7 +1,6 @@
/**
* External dependencies
*/
-import { createElement } from '@wordpress/element';
import { render } from '@testing-library/react';
import { useSelect } from '@wordpress/data';
import userEvent from '@testing-library/user-event';
@@ -84,11 +83,14 @@ const freeExtensions = [
},
];
+const profileItems = { product_types: [] };
+
describe( 'Selective extensions bundle', () => {
it( 'should list installable free extensions in footer only basics', () => {
useSelect.mockReturnValue( {
freeExtensions,
isResolving: false,
+ profileItems,
} );
const { getByText, queryByText } = render(
@@ -113,6 +115,7 @@ describe( 'Selective extensions bundle', () => {
useSelect.mockReturnValue( {
freeExtensions,
isResolving: false,
+ profileItems,
} );
const { getAllByRole, getByText, queryByText } = render(
diff --git a/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/index.js b/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/index.js
index b29ee63aba2..94f1759d79e 100644
--- a/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/index.js
+++ b/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/index.js
@@ -16,12 +16,13 @@ import { includes, filter, get } from 'lodash';
import { getSetting } from '@woocommerce/wc-admin-settings';
import { recordEvent } from '@woocommerce/tracks';
import { withDispatch, withSelect } from '@wordpress/data';
-import { ONBOARDING_STORE_NAME } from '@woocommerce/data';
+import { ONBOARDING_STORE_NAME, PLUGINS_STORE_NAME } from '@woocommerce/data';
import { Text } from '@woocommerce/experimental';
/**
* Internal dependencies
*/
+import { createNoticesFromResponse } from '~/lib/notices';
import ProductTypeLabel from './label';
import './style.scss';
@@ -57,17 +58,45 @@ export class ProductTypes extends Component {
}
onContinue() {
+ const { selected } = this.state;
+ const { installedPlugins = [] } = this.props;
+
if ( ! this.validateField() ) {
return;
}
- const { createNotice, goToNextStep, updateProfileItems } = this.props;
+ const {
+ createNotice,
+ goToNextStep,
+ installAndActivatePlugins,
+ updateProfileItems,
+ } = this.props;
recordEvent( 'storeprofiler_store_product_type_continue', {
- product_type: this.state.selected,
+ product_type: selected,
} );
- updateProfileItems( { product_types: this.state.selected } )
+ const promises = [ updateProfileItems( { product_types: selected } ) ];
+
+ if (
+ window.wcAdminFeatures &&
+ window.wcAdminFeatures.subscriptions &&
+ ! installedPlugins.includes( 'woocommerce-payments' ) &&
+ selected.includes( 'subscriptions' )
+ ) {
+ promises.push(
+ installAndActivatePlugins( [ 'woocommerce-payments' ] )
+ .then( ( response ) => {
+ createNoticesFromResponse( response );
+ } )
+ .catch( ( error ) => {
+ createNoticesFromResponse( error );
+ throw new Error();
+ } )
+ );
+ }
+
+ Promise.all( promises )
.then( () => goToNextStep() )
.catch( () =>
createNotice(
@@ -104,7 +133,11 @@ export class ProductTypes extends Component {
render() {
const { productTypes = {} } = getSetting( 'onboarding', {} );
const { error, isMonthlyPricing, selected } = this.state;
- const { isProfileItemsRequesting } = this.props;
+ const {
+ installedPlugins = [],
+ isInstallingActivating,
+ isProfileItemsRequesting,
+ } = this.props;
return (
@@ -166,9 +199,14 @@ export class ProductTypes extends Component {
);
@@ -214,6 +268,9 @@ export default compose(
getOnboardingError,
isOnboardingRequesting,
} = select( ONBOARDING_STORE_NAME );
+ const { getInstalledPlugins, isPluginsRequesting } = select(
+ PLUGINS_STORE_NAME
+ );
return {
isError: Boolean( getOnboardingError( 'updateProfileItems' ) ),
@@ -221,14 +278,20 @@ export default compose(
isProfileItemsRequesting: isOnboardingRequesting(
'updateProfileItems'
),
+ installedPlugins: getInstalledPlugins(),
+ isInstallingActivating:
+ isPluginsRequesting( 'installPlugins' ) ||
+ isPluginsRequesting( 'activatePlugins' ),
};
} ),
withDispatch( ( dispatch ) => {
const { updateProfileItems } = dispatch( ONBOARDING_STORE_NAME );
const { createNotice } = dispatch( 'core/notices' );
+ const { installAndActivatePlugins } = dispatch( PLUGINS_STORE_NAME );
return {
createNotice,
+ installAndActivatePlugins,
updateProfileItems,
};
} )
diff --git a/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/test/index.js b/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/test/index.js
index fb89a1319f2..7bee3a2e6c0 100644
--- a/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/test/index.js
+++ b/plugins/woocommerce-admin/client/profile-wizard/steps/product-types/test/index.js
@@ -32,6 +32,7 @@ describe( 'ProductTypes', () => {
afterEach( () => {
setSetting( 'onboarding', {} );
+ window.wcAdminFeatures.subscriptions = false;
} );
test( 'should render product types', () => {
@@ -86,4 +87,27 @@ describe( 'ProductTypes', () => {
expect( mockGoToNextStep ).toHaveBeenCalled();
} );
} );
+ test( 'should show a warning message at the bottom of the step', () => {
+ setSetting( 'onboarding', {
+ productTypes: {
+ subscriptions: {
+ label: 'Subscriptions',
+ },
+ },
+ } );
+ window.wcAdminFeatures.subscriptions = true;
+
+ render( );
+
+ const subscription = screen.getByText( 'Subscriptions', {
+ selector: 'label',
+ } );
+ userEvent.click( subscription );
+
+ expect(
+ screen.queryByText(
+ 'The following extensions will be added to your site for free: WooCommerce Payments. An account is required to use this feature.'
+ )
+ ).toBeInTheDocument();
+ } );
} );
diff --git a/plugins/woocommerce-admin/client/task-list/task-list.js b/plugins/woocommerce-admin/client/task-list/task-list.js
index 1dded4b7025..eb6032fadae 100644
--- a/plugins/woocommerce-admin/client/task-list/task-list.js
+++ b/plugins/woocommerce-admin/client/task-list/task-list.js
@@ -353,7 +353,7 @@ export const TaskList = ( {
? () => dismissTask( task )
: undefined
}
- remindMeLater={
+ onSnooze={
task.allowRemindMeLater
? () => remindTaskLater( task )
: undefined
diff --git a/plugins/woocommerce-admin/client/task-list/tasks/products/product-template-modal.js b/plugins/woocommerce-admin/client/task-list/tasks/products/product-template-modal.js
index 91423ba1e27..cd47ae9dc29 100644
--- a/plugins/woocommerce-admin/client/task-list/tasks/products/product-template-modal.js
+++ b/plugins/woocommerce-admin/client/task-list/tasks/products/product-template-modal.js
@@ -4,9 +4,13 @@
import { __ } from '@wordpress/i18n';
import { Button, Modal, RadioControl } from '@wordpress/components';
import { useState } from '@wordpress/element';
-import { useDispatch } from '@wordpress/data';
-import { applyFilters } from '@wordpress/hooks';
-import { ITEMS_STORE_NAME } from '@woocommerce/data';
+import { useDispatch, useSelect } from '@wordpress/data';
+import { addFilter, applyFilters } from '@wordpress/hooks';
+import {
+ ITEMS_STORE_NAME,
+ ONBOARDING_STORE_NAME,
+ PLUGINS_STORE_NAME,
+} from '@woocommerce/data';
import { getAdminLink } from '@woocommerce/wc-admin-settings';
import { recordEvent } from '@woocommerce/tracks';
@@ -44,18 +48,46 @@ const PRODUCT_TEMPLATES = [
'woocommerce-admin'
),
},
+ {
+ key: 'subscription',
+ title: __( 'Subscription product', 'woocommerce-admin' ),
+ subtitle: __(
+ 'Products that customers receive or gain access to regularly by paying in advance',
+ 'woocommerce-admin'
+ ),
+ },
];
export default function ProductTemplateModal( { onClose } ) {
const [ selectedTemplate, setSelectedTemplate ] = useState( null );
const [ isRedirecting, setIsRedirecting ] = useState( false );
const { createProductFromTemplate } = useDispatch( ITEMS_STORE_NAME );
+ const { profileItems } = useSelect( ( select ) => {
+ const { getProfileItems } = select( ONBOARDING_STORE_NAME );
+
+ return {
+ profileItems: getProfileItems(),
+ };
+ } );
+ const { installedPlugins } = useSelect( ( select ) => {
+ const { getInstalledPlugins } = select( PLUGINS_STORE_NAME );
+
+ return {
+ installedPlugins: getInstalledPlugins(),
+ };
+ } );
const createTemplate = () => {
setIsRedirecting( true );
recordEvent( 'tasklist_product_template_selection', {
product_type: selectedTemplate,
} );
+ if ( selectedTemplate === 'subscription' ) {
+ window.location = getAdminLink(
+ 'post-new.php?post_type=product&subscription_pointers=true'
+ );
+ return;
+ }
if ( selectedTemplate ) {
createProductFromTemplate(
{
@@ -84,6 +116,22 @@ export default function ProductTemplateModal( { onClose } ) {
}
};
+ if (
+ ( window.wcAdminFeatures && ! window.wcAdminFeatures.subscriptions ) ||
+ ! profileItems.product_types.includes( 'subscriptions' ) ||
+ ! installedPlugins.includes( 'woocommerce-payments' )
+ ) {
+ addFilter(
+ ONBOARDING_PRODUCT_TEMPLATES_FILTER,
+ 'woocommerce-admin',
+ ( productTemplates ) => {
+ return productTemplates.filter(
+ ( template ) => template.key !== 'subscription'
+ );
+ }
+ );
+ }
+
const templates = applyFilters(
ONBOARDING_PRODUCT_TEMPLATES_FILTER,
PRODUCT_TEMPLATES
diff --git a/plugins/woocommerce-admin/client/task-list/tasks/products/products.js b/plugins/woocommerce-admin/client/task-list/tasks/products/products.js
index d49a2a74e2d..cf7b2e48afa 100644
--- a/plugins/woocommerce-admin/client/task-list/tasks/products/products.js
+++ b/plugins/woocommerce-admin/client/task-list/tasks/products/products.js
@@ -12,6 +12,8 @@ import {
archive,
download,
} from '@wordpress/icons';
+import { ONBOARDING_STORE_NAME, PLUGINS_STORE_NAME } from '@woocommerce/data';
+import { useSelect } from '@wordpress/data';
import { List, Pill } from '@woocommerce/components';
import { getAdminLink } from '@woocommerce/wc-admin-settings';
import { recordEvent } from '@woocommerce/tracks';
@@ -90,6 +92,35 @@ const subTasks = [
export default function Products() {
const [ selectTemplate, setSelectTemplate ] = useState( null );
+ const { profileItems } = useSelect( ( select ) => {
+ const { getProfileItems } = select( ONBOARDING_STORE_NAME );
+
+ return {
+ profileItems: getProfileItems(),
+ };
+ } );
+ const { installedPlugins } = useSelect( ( select ) => {
+ const { getInstalledPlugins } = select( PLUGINS_STORE_NAME );
+
+ return {
+ installedPlugins: getInstalledPlugins(),
+ };
+ } );
+
+ if (
+ window.wcAdminFeatures &&
+ window.wcAdminFeatures.subscriptions &&
+ profileItems.product_types.includes( 'subscriptions' ) &&
+ installedPlugins.includes( 'woocommerce-payments' )
+ ) {
+ const task = subTasks.find(
+ ( { key } ) => key === 'addProductTemplate'
+ );
+ task.content = __(
+ 'Use a template to add physical, digital, variable, and subscription products',
+ 'woocommerce-admin'
+ );
+ }
const onTaskClick = ( task ) => {
task.onClick();
diff --git a/plugins/woocommerce-admin/client/task-list/test/products.js b/plugins/woocommerce-admin/client/task-list/test/products.js
deleted file mode 100644
index 70a31b8a6bc..00000000000
--- a/plugins/woocommerce-admin/client/task-list/test/products.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * External dependencies
- */
-import { render, screen, fireEvent } from '@testing-library/react';
-import '@testing-library/jest-dom/extend-expect';
-
-/**
- * Internal dependencies
- */
-import { Products, ProductTemplateModal } from '../tasks/products';
-
-describe( 'products', () => {
- describe( 'Products', () => {
- afterEach( () => jest.clearAllMocks() );
-
- it( 'should render 4 different options to add products', () => {
- render( );
-
- expect(
- screen.queryByText( 'Start with a template' )
- ).toBeInTheDocument();
- expect( screen.queryByText( 'Add manually' ) ).toBeInTheDocument();
- expect(
- screen.queryByText( 'Import via CSV' )
- ).toBeInTheDocument();
- expect(
- screen.queryByText( 'Import from another service' )
- ).toBeInTheDocument();
- } );
-
- it( 'should not render the product template modal right away', () => {
- render( );
-
- expect( screen.queryByText( '[ProductTemplateModal]' ) ).toBeNull();
- } );
-
- it( 'should render product template modal when start with template task is selected', () => {
- render( );
-
- fireEvent(
- screen.queryByText( 'Start with a template' ),
- // eslint-disable-next-line no-undef
- new MouseEvent( 'click', { bubbles: true } )
- );
- expect(
- screen.queryByText( 'Physical product' )
- ).toBeInTheDocument();
- expect(
- screen.queryByText( 'Digital product' )
- ).toBeInTheDocument();
- expect(
- screen.queryByText( 'Variable product' )
- ).toBeInTheDocument();
- } );
-
- it( 'should allow the user to close the template modal', () => {
- render( );
-
- fireEvent(
- screen.queryByText( 'Start with a template' ),
- // eslint-disable-next-line no-undef
- new MouseEvent( 'click', { bubbles: true } )
- );
- expect(
- screen.queryByText( 'Physical product' )
- ).toBeInTheDocument();
- const closeButton = screen.getByRole( 'button', {
- name: 'Close dialog',
- } );
- fireEvent.click( closeButton );
- expect(
- screen.queryByText( 'Physical product' )
- ).not.toBeInTheDocument();
- } );
- } );
-
- describe( 'ProductWithTemplate', () => {
- afterEach( () => jest.clearAllMocks() );
-
- it( 'should render 3 different product types', () => {
- render( );
-
- expect(
- screen.queryByText( 'Physical product' )
- ).toBeInTheDocument();
- expect(
- screen.queryByText( 'Digital product' )
- ).toBeInTheDocument();
- expect(
- screen.queryByText( 'Variable product' )
- ).toBeInTheDocument();
- } );
- } );
-} );
diff --git a/plugins/woocommerce-admin/client/tasks/fills/products/product-template-modal.js b/plugins/woocommerce-admin/client/tasks/fills/products/product-template-modal.js
index 91423ba1e27..cd47ae9dc29 100644
--- a/plugins/woocommerce-admin/client/tasks/fills/products/product-template-modal.js
+++ b/plugins/woocommerce-admin/client/tasks/fills/products/product-template-modal.js
@@ -4,9 +4,13 @@
import { __ } from '@wordpress/i18n';
import { Button, Modal, RadioControl } from '@wordpress/components';
import { useState } from '@wordpress/element';
-import { useDispatch } from '@wordpress/data';
-import { applyFilters } from '@wordpress/hooks';
-import { ITEMS_STORE_NAME } from '@woocommerce/data';
+import { useDispatch, useSelect } from '@wordpress/data';
+import { addFilter, applyFilters } from '@wordpress/hooks';
+import {
+ ITEMS_STORE_NAME,
+ ONBOARDING_STORE_NAME,
+ PLUGINS_STORE_NAME,
+} from '@woocommerce/data';
import { getAdminLink } from '@woocommerce/wc-admin-settings';
import { recordEvent } from '@woocommerce/tracks';
@@ -44,18 +48,46 @@ const PRODUCT_TEMPLATES = [
'woocommerce-admin'
),
},
+ {
+ key: 'subscription',
+ title: __( 'Subscription product', 'woocommerce-admin' ),
+ subtitle: __(
+ 'Products that customers receive or gain access to regularly by paying in advance',
+ 'woocommerce-admin'
+ ),
+ },
];
export default function ProductTemplateModal( { onClose } ) {
const [ selectedTemplate, setSelectedTemplate ] = useState( null );
const [ isRedirecting, setIsRedirecting ] = useState( false );
const { createProductFromTemplate } = useDispatch( ITEMS_STORE_NAME );
+ const { profileItems } = useSelect( ( select ) => {
+ const { getProfileItems } = select( ONBOARDING_STORE_NAME );
+
+ return {
+ profileItems: getProfileItems(),
+ };
+ } );
+ const { installedPlugins } = useSelect( ( select ) => {
+ const { getInstalledPlugins } = select( PLUGINS_STORE_NAME );
+
+ return {
+ installedPlugins: getInstalledPlugins(),
+ };
+ } );
const createTemplate = () => {
setIsRedirecting( true );
recordEvent( 'tasklist_product_template_selection', {
product_type: selectedTemplate,
} );
+ if ( selectedTemplate === 'subscription' ) {
+ window.location = getAdminLink(
+ 'post-new.php?post_type=product&subscription_pointers=true'
+ );
+ return;
+ }
if ( selectedTemplate ) {
createProductFromTemplate(
{
@@ -84,6 +116,22 @@ export default function ProductTemplateModal( { onClose } ) {
}
};
+ if (
+ ( window.wcAdminFeatures && ! window.wcAdminFeatures.subscriptions ) ||
+ ! profileItems.product_types.includes( 'subscriptions' ) ||
+ ! installedPlugins.includes( 'woocommerce-payments' )
+ ) {
+ addFilter(
+ ONBOARDING_PRODUCT_TEMPLATES_FILTER,
+ 'woocommerce-admin',
+ ( productTemplates ) => {
+ return productTemplates.filter(
+ ( template ) => template.key !== 'subscription'
+ );
+ }
+ );
+ }
+
const templates = applyFilters(
ONBOARDING_PRODUCT_TEMPLATES_FILTER,
PRODUCT_TEMPLATES
diff --git a/plugins/woocommerce-admin/client/tasks/fills/products/products.js b/plugins/woocommerce-admin/client/tasks/fills/products/products.js
index 30818805d71..efb26da637d 100644
--- a/plugins/woocommerce-admin/client/tasks/fills/products/products.js
+++ b/plugins/woocommerce-admin/client/tasks/fills/products/products.js
@@ -12,6 +12,8 @@ import {
archive,
download,
} from '@wordpress/icons';
+import { ONBOARDING_STORE_NAME, PLUGINS_STORE_NAME } from '@woocommerce/data';
+import { useSelect } from '@wordpress/data';
import { List, Pill } from '@woocommerce/components';
import { getAdminLink } from '@woocommerce/wc-admin-settings';
import { recordEvent } from '@woocommerce/tracks';
@@ -92,6 +94,35 @@ const subTasks = [
const Products = () => {
const [ selectTemplate, setSelectTemplate ] = useState( null );
+ const { profileItems } = useSelect( ( select ) => {
+ const { getProfileItems } = select( ONBOARDING_STORE_NAME );
+
+ return {
+ profileItems: getProfileItems(),
+ };
+ } );
+ const { installedPlugins } = useSelect( ( select ) => {
+ const { getInstalledPlugins } = select( PLUGINS_STORE_NAME );
+
+ return {
+ installedPlugins: getInstalledPlugins(),
+ };
+ } );
+
+ if (
+ window.wcAdminFeatures &&
+ window.wcAdminFeatures.subscriptions &&
+ profileItems.product_types.includes( 'subscriptions' ) &&
+ installedPlugins.includes( 'woocommerce-payments' )
+ ) {
+ const task = subTasks.find(
+ ( { key } ) => key === 'addProductTemplate'
+ );
+ task.content = __(
+ 'Use a template to add physical, digital, variable, and subscription products',
+ 'woocommerce-admin'
+ );
+ }
const onTaskClick = ( task ) => {
task.onClick();
diff --git a/plugins/woocommerce-admin/config/core.json b/plugins/woocommerce-admin/config/core.json
index 590927ab74d..5d0549cfd1d 100644
--- a/plugins/woocommerce-admin/config/core.json
+++ b/plugins/woocommerce-admin/config/core.json
@@ -15,6 +15,7 @@
"payment-gateway-suggestions": true,
"settings": false,
"shipping-label-banner": true,
+ "subscriptions": false,
"store-alerts": true,
"tasks": false,
"transient-notices": true,
diff --git a/plugins/woocommerce-admin/config/development.json b/plugins/woocommerce-admin/config/development.json
index 529117f1293..6c98aa3acb5 100644
--- a/plugins/woocommerce-admin/config/development.json
+++ b/plugins/woocommerce-admin/config/development.json
@@ -15,6 +15,7 @@
"remote-free-extensions": true,
"settings": false,
"shipping-label-banner": true,
+ "subscriptions": true,
"store-alerts": true,
"tasks": true,
"transient-notices": true,
diff --git a/plugins/woocommerce-admin/config/plugin.json b/plugins/woocommerce-admin/config/plugin.json
index ff4ca9470f8..b0347a62634 100644
--- a/plugins/woocommerce-admin/config/plugin.json
+++ b/plugins/woocommerce-admin/config/plugin.json
@@ -15,6 +15,7 @@
"payment-gateway-suggestions": true,
"settings": false,
"shipping-label-banner": true,
+ "subscriptions": false,
"store-alerts": true,
"tasks": false,
"transient-notices": true,
diff --git a/plugins/woocommerce-admin/src/Features/Onboarding.php b/plugins/woocommerce-admin/src/Features/Onboarding.php
index 19b6964b3bf..c55f718e3db 100644
--- a/plugins/woocommerce-admin/src/Features/Onboarding.php
+++ b/plugins/woocommerce-admin/src/Features/Onboarding.php
@@ -433,37 +433,38 @@ class Onboarding {
* @return array
*/
public static function get_allowed_product_types() {
- $product_types = self::append_product_data(
- array(
- 'physical' => array(
- 'label' => __( 'Physical products', 'woocommerce-admin' ),
- 'default' => true,
- ),
- 'downloads' => array(
- 'label' => __( 'Downloads', 'woocommerce-admin' ),
- ),
- 'subscriptions' => array(
- 'label' => __( 'Subscriptions', 'woocommerce-admin' ),
- 'product' => 27147,
- ),
- 'memberships' => array(
- 'label' => __( 'Memberships', 'woocommerce-admin' ),
- 'product' => 958589,
- ),
- 'bookings' => array(
- 'label' => __( 'Bookings', 'woocommerce-admin' ),
- 'product' => 390890,
- ),
- 'product-bundles' => array(
- 'label' => __( 'Bundles', 'woocommerce-admin' ),
- 'product' => 18716,
- ),
- 'product-add-ons' => array(
- 'label' => __( 'Customizable products', 'woocommerce-admin' ),
- 'product' => 18618,
- ),
- )
+ $products = array(
+ 'physical' => array(
+ 'label' => __( 'Physical products', 'woocommerce-admin' ),
+ 'default' => true,
+ ),
+ 'downloads' => array(
+ 'label' => __( 'Downloads', 'woocommerce-admin' ),
+ ),
+ 'subscriptions' => array(
+ 'label' => __( 'Subscriptions', 'woocommerce-admin' ),
+ ),
+ 'memberships' => array(
+ 'label' => __( 'Memberships', 'woocommerce-admin' ),
+ 'product' => 958589,
+ ),
+ 'bookings' => array(
+ 'label' => __( 'Bookings', 'woocommerce-admin' ),
+ 'product' => 390890,
+ ),
+ 'product-bundles' => array(
+ 'label' => __( 'Bundles', 'woocommerce-admin' ),
+ 'product' => 18716,
+ ),
+ 'product-add-ons' => array(
+ 'label' => __( 'Customizable products', 'woocommerce-admin' ),
+ 'product' => 18618,
+ ),
);
+ if ( ! Features::is_enabled( 'subscriptions' ) ) {
+ $products['subscriptions']['product'] = 27147;
+ }
+ $product_types = self::append_product_data( $products );
return apply_filters( 'woocommerce_admin_onboarding_product_types', $product_types );
}
diff --git a/plugins/woocommerce-admin/src/Features/RemoteFreeExtensions/EvaluateExtension.php b/plugins/woocommerce-admin/src/Features/RemoteFreeExtensions/EvaluateExtension.php
index 01247fd3c92..352f279c391 100644
--- a/plugins/woocommerce-admin/src/Features/RemoteFreeExtensions/EvaluateExtension.php
+++ b/plugins/woocommerce-admin/src/Features/RemoteFreeExtensions/EvaluateExtension.php
@@ -31,7 +31,9 @@ class EvaluateExtension {
}
$installed_plugins = PluginsHelper::get_installed_plugin_slugs();
+ $activated_plugins = PluginsHelper::get_active_plugin_slugs();
$extension->is_installed = in_array( explode( ':', $extension->key )[0], $installed_plugins, true );
+ $extension->is_activated = in_array( explode( ':', $extension->key )[0], $activated_plugins, true );
return $extension;
}