How to programmatically disable products? Commerce v8


Hi all,

Is it possible to programmatically make products (and all child variations) unavailable?

I currently have this, but it doesn't seem to work:

SiteProductContent productContent;
if (_catalogRepository.TryGetByEntryCode(productInclusion, out productContent))
    var product = productContent.CreateWritableClone();
    product.OnSale = false;

    _contentRepository.Save(product, SaveAction.Publish, AccessLevel.NoAccess);

If I fetch the product again immediately after, the OnSale value is null and when checking in Commerce Manager, it still shows as available...

I had thought there'd be plenty of docs on doing this kind of thing already but I've not been able to find any, so thought I'd try here.

Any help would be greatly appreciated,



Aug 02, 2018 18:23

Might be wrong, haven't worked with Commerce 8 (because it's a tad old, you should upgrade if you have the green bills to do it :D), but since it seems to already be content, set the content to expired and hopefully it'll work.

Aug 02, 2018 18:37

To be honest version handling in Commerce 8 was a bit sloppy (well, that might be an understatement depending on who you ask). To handle versions better you should upgrade to at least Commerce 9 - and latest version is always recommended.

There are several way to make a product unavailable:

  • Add a boolean property to the product content and use that as filter. This is of course more work for you but it is fairly version-independent.
  • Set CatalogEntryDto.CatalogEntry.IsActive to false. This means you would have to use ICatalogSystem.
  • Set CatalogEntryDto.CatalogEntry StartDate to the future, or EndDate to the past. This relates to IContent StartPublish/StopPublish, but is not 1:1 equivalent, and it can be fairly complicated.

So in short you would need to use ICatalogSystem/IsActive to control it. Note that this will make all languages "unpublished" - which I guess is what you want.

Aug 02, 2018 18:51

Thanks for the advice, guys.

Unfortunately, this piece of work is to help bridge the gap between a major upgrade project, so I can't really embark on upgrading this codebase further.

I've tried a combination of things and at some point, one of them seemed to work and mark the product as unavailable in Commerce Manager, however, I'd iterated a few times before I noticed and now I'm not sure what the magic combination was that worked.

Below is what I currently have -

var endDate = DateTime.UtcNow.AddDays(-1);
var dto = CatalogContext.Current.GetCatalogEntryDto(productInclusion);
dto.CatalogEntry[0].IsActive = false;
dto.CatalogEntry[0].EndDate = endDate;

if (_catalogRepository.TryGetByEntryCode(productInclusion, out SiteProductContent productContent))
	var product = productContent.CreateWritableClone<SiteProductContent>();

	//product.IsPendingPublish = true;
	product.StopPublish = endDate;
	product.AvailableDate = DateTime.UtcNow.AddYears(31);
	product.OnSale = false;

	_contentRepository.Save(product, SaveAction.Publish, AccessLevel.NoAccess);


	OnContentDisabled(product, result.DisableCount, total);

It's a bit of a mess but if either of you could narrow it down to the bits that should work, that'd be great. I'd hoped the top five lines alone would work but that hasn't appeared to be the case. undecided

Aug 03, 2018 15:40

The block inside the if should not be needed :)

Aug 03, 2018 17:29

Yep, had literally just gotten it working based off of this article -

Thanks for all your help!

Aug 03, 2018 17:34
This topic was created over six months ago and has been resolved. If you have a similar question, please create a new topic and refer to this one.