References between pages and content hub items linked in widget properties

2025/04/23 4:50 AM

Hi everyone,


On our project we are using widgets linking reusable content with ContentItemSelectorComponent. Linked content hub items are used as a source of data.
We need to implement FindItemsToReindex method for our Azure Search indexing strategy. How can we retrieve references between content hub items and web pages to implement reindexing correctly?
I can see those references in Content Hub -> Usage -> In channels, please refer to the attached screenshot.


Thanks!

https://imgur.com/jU9l4un


Environment

  • Xperience by Kentico version: [30.2.0]
  • .NET version: [8]
  • Execution environment: [SaaS|Private cloud (Azure/AWS/Virtual machine)]
  • Link to relevant Xperience by Kentico documentation

Answers

2025/04/29 3:31 PM

As a possible solution, I found that this information can be retrieved with the following query using the InfoProvider Query API::

public class ContentItemReferenceService(IInfoProvider<ContentItemReferenceInfo> contentItemReferenceInfoProvider)
{
    public async Task<IEnumerable<Guid>> GetPagesLinkingContentItemIds(int contentItemId)
    {
        var query = contentItemReferenceInfoProvider.Get()
            .Source(cir =>
                cir.InnerJoin<ContentItemCommonDataInfo>(
                        ColumnName((ContentItemReferenceInfo x) => x.ContentItemReferenceSourceCommonDataID),
                        ColumnName((ContentItemCommonDataInfo x) => x.ContentItemCommonDataID))
                    .InnerJoin<ContentItemInfo>(
                        ColumnName((ContentItemCommonDataInfo x) => x.ContentItemCommonDataContentItemID),
                        ColumnName((ContentItemInfo x) => x.ContentItemID))
                    .InnerJoin<DataClassInfo>(
                        ColumnName((ContentItemInfo x) => x.ContentItemContentTypeID),
                        ColumnName((DataClassInfo x) => x.ClassID))
                    .InnerJoin<WebPageItemInfo>(
                        ColumnName((ContentItemInfo x) => x.ContentItemID),
                        ColumnName((WebPageItemInfo x) => x.WebPageItemContentItemID)))
            .WhereEquals(ColumnName((DataClassInfo x) => x.ClassType), "Content")
            .And()
            .WhereEquals(ColumnName((DataClassInfo x) => x.ClassContentTypeType), "Website")
            .And()
            .WhereEquals(ColumnName((ContentItemReferenceInfo x) => x.ContentItemReferenceTargetItemID), contentItemId)
            .Column(ColumnName((WebPageItemInfo x) => x.WebPageItemGUID))
            .Distinct();
            
        return await query.GetEnumerableTypedResultAsync(record => record.GetGuid(0));
    }

    private static string ColumnName<T>(Expression<Func<T, object>> expression) where T : BaseInfo => ObjectQueryHelper.GetFullColumnName(expression);
}

Is there a better way to do this?

2025/05/01 7:43 PM

We don't have a public, supported API to access content item references (usages). I think your custom query might be the best approach at the moment.

If you'd like to see us support programmatic use of usage tracking, give us some feedback on our roadmap with your scenario.

To answer this question, you have to login first.