"Where can I edit this text in Sitecore?"
"Can you find out where this content can be changed in Sitecore?
"I tried changing this content in Sitecore here, but it's not reflecting on the front-end after I publish."
I hear that a lot.
When maintaining multiple Sitecore solutions - knowing every template, rendering, and how the data ties in to what you see on the front-end - is nearly impossible. Prior to Helix, developers were free to develop using various patterns. Some are built in MVC, others are WebForms. Some components rely on datasource items, others rely on data from the items template. Regardless of architecture, we need to be able to help Content Authors change content if they can't find what they're looking to change.
There are typically a few options to obtain the information for the Content Author's request:
- If you have access to the solution - inspect the page elements, grab a common class or id, do a Entire Solution search, find some files and follow the code to determine how it populates the component.
- Start with the page item in Sitecore and determine whether the content is located on the item's template, or in within a data source item.
Simply start a new query in SQL MS on the Sitecore DB you want to search in (Web or Master), modify the @SEARCHTERM variable (include the percent symbols eg. '%content goes here%'), and execute this handy script:
DECLARE @SITECOREROOTID NVARCHAR(MAX), @FULLPATHSEARCH NVARCHAR(MAX), @SEARCHTERM NVARCHAR(MAX)
SET @SITECOREROOTID = '11111111-1111-1111-1111-111111111111';
SET @FULLPATHSEARCH = 'sitecore/content/%';
SET @SEARCHTERM = '%search term%';
WITH FullPathItems (ID, NAME, ITEMPATH, TEMPLATEID)
AS (SELECT ID,
NAME,
CAST(NAME AS NVARCHAR(MAX)) AS itempath,
TEMPLATEID
FROM [dbo].ITEMS
WHERE ID = @SITECOREROOTID
UNION ALL
SELECT i.ID,
i.NAME,
CAST(( ITEMPATH + '/' + i.NAME ) AS NVARCHAR(MAX)) AS itempath,
i.TEMPLATEID
FROM [dbo].ITEMS i
INNER JOIN FullPathItems a
ON i.PARENTID = a.ID)
SELECT fieldsX.ITEMID,
fpi.NAME AS ITEMNAME,
fieldsX.VALUE,
fpi.TEMPLATEID AS TEMPLATEID,
templatesX.NAME AS TEMPLATENAME,
ITEMPATH,
fieldsX.FIELDID,
itemsX.NAME AS FIELDNAME,
fieldsX.LANGUAGE AS ITEMLANGUAGE
FROM [dbo].[FIELDS] fieldsX
INNER JOIN FullPathItems fpi
ON fpi.ID = fieldsX.ITEMID
INNER JOIN [dbo].ITEMS itemsX
ON itemsX.ID = fieldsX.FIELDID
INNER JOIN [dbo].ITEMS templatesX
ON templatesX.ID = fpi.TEMPLATEID
WHERE fieldsX.VALUE LIKE @SEARCHTERM
AND fpi.ITEMPATH LIKE @FULLPATHSEARCH
/*INCLUDE THE FOLLOWING LINE TO INCLUDE ITEM ID CONDITION */
-- AND fieldsX.ItemId = 'B3F15B8C-BAE5-40F4-A139-BA7B3EC6E1ED'
/*INCLUDE THE FOLLOWING LINE TO INCLUDE ITEM NAME CONDITION */
-- AND fpi.Name LIKE '%My Item%'
/* INCLUDE THE FOLLOWING LINE TO INCLUDE TEMPLATE NAME CONDITION */
--AND templatesX.Name = 'My Template'
/* INCLUDE THE FOLLOWING LINE TO ADD LANGUAGE CONDITION */
-- AND fieldsX.Language = 'en-US'
ORDER BY fpi.ITEMPATH
The result includes the following columns:
Sometimes, you'll be presented with several instances of a specific keyword, in which case you can uncomment various lines near the bottom of the script to drill down and filter the results even further.
I find myself using this script on a daily basis and hope that sharing this script helps others track down content quickly and effectively, too.