SEO Tips : UX pattern for listing pages to improve page experience

Choosing the correct UX pattern for the listing pages is the key to improve the page experience on sites. It is very crucial which approach you follow for breaking content into number of pages on listing and search pages. Following UX patterns can be utilized based on the use case and business requirement:

Pagination: In ecommerce sites with products where aim is to show finite/available products to the users and improve the ease to purchase, pagination with links such as “next”, “previous”, and page numbers to navigate through pages is recommended. Pagination displays finite number of results on each page, allow the user to switch between pages easily to search for their desired product and bookmark/share the page with specific number with results if required. This will improve the user or page experience and purchases. Choosing the pagination for site may require you to do following:

  • Make sure google indexes each page.
  • Consider using preload, preconnect, or prefetch to optimize the performance for a user moving to the next page. Google no longer recognizes “next” and “pre” in link tags in header.
  • Don’t use the first page as canonical page
  • Choose the right numbering technique for pagination.

Load more: You can allow subset of results in initial load for better performance to appear and then increase the content based on the user interaction or click on load more, as fetching and displaying everything at once will be time taking. Incrementally increasing the content on the page will help in improving user experience, page performance and reducing network traffic. Content is displayed on the single page and user tend to see/visit more result pages as compared to pagination technique.

Infinite scroll: If you have pages like recipes, news, etc. where goal is to increase user engagement on site, then infinite scroll is a good choice. This will keep user engaged on the page for longer duration and keep giving results to user on each scroll while staying on the same page. There will not be any need to navigate between pages in this technique and everything will be displaying on single page.

Better the page experience, better will be the google ranking. However, do follow best practices for pagination, canonical links, etc. Duplicate content on pages may have negative impact on SEO.

Choosing the techniques for your site is dependent on your business goals and what end result you want.

Advertisement

How to fix – “A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)”

Recently I installed new Sitecore XP instance and when I have created tenant folder and tenant, I saw warning related to license on the top which says current license does not support SXA.

So I switched the license which supports SXA. And then yellow page with above error pops up.

Resolution:

Fix the certificate value in the connection string file in your wwroot folder. This has resolved the issue for me.

You can check learn.microsoft.com for more insights into the issue and troubleshooting ways.

How to know 2Ws of last executed PowerShell script in Sitecore

Does your team need to run scripts for adding, deleting or updating bulk content in sitecore?

Are you working with team of many resources, multiple environment and working remotely?

If any of the above is true for you, then at times you may also faced issues when some powershell script execution went into wrong direction and whole team just suffered/stuck after that.

If working with big teams and large amount of work in queue, it may become difficult to reach out to all and spend time to figure out cause and then resolve the solution. We do get information from the logs about script ran in past. However, it is not really wise to spend much time to troubleshoot a problem.

……………………………………………………………………………………………………………………………………………………………………………………………..

Sitecore has out of the box ISE in system folder to see WHO has ran the script previously in Sitecore and moreover it let us know WHAT exactly was last executed. This really helps to expedite the troubleshooting process.

You will find this at location – /sitecore/system/Modules/PowerShell/Settings/ISE (refer below image)

By default, Save last executed script checkbox is enabled.

Hope you find it useful!

Integrate Sitecore form with Sitecore Send to send data

In this blog, I will give you a walkthrough on how we can connect Sitecore form to our new marketing automation friend Sitecore send to submit data.

Create a Sitecore send account before going ahead. You can choose from different plans available with different features at different prices or you can also use the trail/free version for one month to explore. However, all features are not available in the free version for one month.

If you already have Sitecore send account. Lets start by following below steps:

1. Create a Email List in Sitecore send

Create a Email List from email list option available under audience menu option(refer below image). It is really easy to create and add members with just few clicks. By default, there are Name, Mobile and Email fields for each member in Email list. Email is the mandatory field here. You can also add custom fields if required and perform computations. We will discuss that in another blog.

2. Create a Sitecore form

Create a Sitecore form with email as mandatory field, name and few other fields if required(refer below for an example)

For more details, refer https://doc.sitecore.com/xp/en/users/93/sitecore-experience-platform/creating-forms.html

3. Create a Sitecore custom submit action

a. Create a submit action item under /sitecore/system/Settings/Forms/Submit Actions and add the Submit Action class to the model type field.

b. Then, add the custom submit action to the form’s submit button.

c. Create a custom submit action class

First copy the IDs of email list and Sitecore Send API Key from Sitecore Send(refer below images) that we will use while making a call to Sitecore send:

API Key:

Email List ID

d. Now inherit the SubmitActionBase and override Execute method to add a code snippet by which a POST request is made to the Uri(refer below code) asynchronously. You will get a Boolean response from the API call about status.

using Newtonsoft.Json;
using Sitecore.Diagnostics;
using Sitecore.ExperienceForms.Models;
using Sitecore.ExperienceForms.Mvc.Models.Fields;
using Sitecore.ExperienceForms.Processing;
using Sitecore.ExperienceForms.Processing.Actions;
using System;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using static Demo.Foundation.SitecoreExtensions.Models.SitecoreSendModel;

namespace Demo.Foundation.SitecoreExtensions.Actions
{
    public partial class SitecoreSend : SubmitActionBase<string>
    {
        private readonly Uri baseAddress = new Uri("https://api.moosend.com/v3/");
        private readonly string emailListID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"; // Add email list ID here, refer above images
        private readonly string SitecoreSendApiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"; // Add sitecore send api key here, refer above images

        public SitecoreSend(ISubmitActionData submitActionData) : base(submitActionData)
        {
        }

        protected override bool TryParse(string value, out string target)
        {
            target = string.Empty;
            return true;
        }

        protected override bool Execute(string data, FormSubmitContext formSubmitContext)
        {
            Assert.ArgumentNotNull(formSubmitContext, "formSubmitContext");
			var txtFirstName = GetFieldValue(this.GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("FirstName"))));
            var txtLastName = GetFieldValue(this.GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("LastName"))));
			var emailAddress = GetFieldValue(this.GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("Email"))));
            var mobile= GetFieldValue(this.GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("Mobile"))));
            var SitecoreSendModel = new SitecoreSendData
            {
                Name = txtFirstName +" "+ txtLastName,
                Email = emailAddress,
                Mobile = mobile
            };
            Task<bool> executePost = Task.Run(async () => await ExecuteCall(JsonConvert.SerializeObject(SitecoreSendData)));
            return executePost.Result;
        }

        private async Task<bool> ExecuteCall(string data)
        {
            try
            {
                using (var httpClient = new HttpClient { BaseAddress = baseAddress })
                {
                    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("accept", "application/json");

                    using (var content = new StringContent(data, Encoding.Default, "application/json"))
                    {
                        using (var response = await httpClient.PostAsync($"subscribers/{emailListID}/subscribe.json?apiKey={SitecoreSendApiKey}", content))
                        {
                            string response = await response.Content.ReadAsStringAsync();
							if(!string.IsNullOrEmpty(response))
							{
								return true;
							}
							else
							{
								return false;
							}
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message.ToString(), "ExecuteCall");
                return false;
            }
        }

        private string GetFieldValue(IViewModel field)
        {
                if (field != null && field is ListViewModel)
				{
					PropertyInfo property = field.GetType().GetProperty("Value");
                    string str = (object)property != null ? property.GetValue(field, (object[])null)?.ToString() : (string)null;
                    return str;
			}
        }
    }
    public partial class SitecoreSendModel
    {
            public string Name { get; set; }
            public string Email { get; set; }
            public string Mobile { get; set; }
    }
}

For more details, refer https://doc.sitecore.com/xp/en/developers/90/sitecore-experience-manager/walkthrough–creating-a-custom-submit-action.html

4. Submit form

After submitting the data successfully, you will be able to see that the one with source as API integration are submissions via API from Sitecore form and others were done manually into email list.

Hope you like this blog! 🙂

Sitecore send – a composable offering for Email automation and marketing

Sitecore is moving towards a SaaS-based platform offering for enterprise solution and a composable digital experience platform (DXP) centered around content. Sitecore has acquired in May 2021 with the effort of adding best of the breed to the class of composable offerings.

Moosend is microservices-based, API-first and cloud-native marketing platform that offers greater personalization and customer engagement with AI-powered analytics and reporting. Moosend has been working with around 2500+ small to large and massive organizations like hewlett packard enterprise, Forbes, NASA, CITYAM, Tedx, health organizations like UNICEF, etc. All these organizations are using moosend for different business cases and marketing needs for market automation, newsletter, better website experience, etc.

It simplifies the way we execute email marketing and customer engagements by providing :

  1. Complete SaaS Platform
  2. Holistic Customer database
  3. Omnichannel digital experience
  4. AI driven Email Experience
  5. Campaign management
  6. Advanced list segmentation
  7. Reduce developer dependency
  8. Simple marketing automation workflows
  9. Powerful real time reporting and analytics
  10. Fast and real time customer journeys

If you like to use Sitecore send, you will get package starting from $10/month that includes up to 2,000 subscribers and an enterprise plan with custom pricing. Sitecore also offer trial version of 1 month to explore Sitecore send however, you may not be able to explore all in trial version.

What XM cloud brought to us?

Recently, Sitecore has officially released their Sitecore Experience Manager, XM Cloud and as the tweet by Sitecore CEO, Steve Tzikakis, it is most significant milestone in Sitecore history.

So, we are going to discuss how Sitecore Experience Manager, XM cloud going to be such significant milestone in Sitecore History and what it has brought to us that will make customer experience mind blowing?

Image from Sitecore

Sitecore XM Cloud is a step towards the Sitecore’s 100% SaaS platform offering for enterprise solution and a composable digital experience platform (DXP) centered around content. With this, Sitecore took its core CMS solution to modern cloud architecture achieving speed to market with implementation of the immersive customer experience and overcoming challenges faced in flexibility, scaling, including variable traffic, multi brand architectures, and site security.

Following are some of the features and challenges overcame by XM cloud:

  • Continued innovation – with XM cloud, there are various new features, and all features are SaaS based. These features and capabilities will continue to receive updates and innovation going forward. In addition to this, new features will be released seamlessly as part of the product lifecycle.
  • Elastic scaling – It manages scaling and elasticity and easily set-and-forget traffic volume demands.
  • Composability – XM cloud follows the composable architecture and any Sitecore’s platform solution can now be purchased independently and will fit in any marketing technology stack easily
  • On-the-Fly Engagement – XM cloud makes it possible to cope with changing demands in the market at high rate and create experiences to fulfilling market needs.
  • Multichannel content management – Following headless architecture makes it achieve omni channel content delivery without any challenges.
  • Simplicity for marketers– XM cloud brought content authors with easy to use, business-focused tools and intuitive content authoring workflows
  • Agility for developers – XM cloud follows agility workflow for deployment with customized builds utilizing modern frameworks.
  • Future Upgrades – with the continuous innovation, there will no longer be need for significant cost and effort spent on upgrades.  The XM cloud has its own automatic upgrades. However, there can be costs involved while switching from existing Sitecore customers to Sitecore XM cloud.
  • Edge Caching & GraphQL Querying Sitecore XM Cloud uses a technology called Experience Edge that will provide a level of performance better traditional web server architecture. Experience edge is kind of network of servers all around to cache to deliver your content quickly.

Prefill Sitecore form fields with query parameters using custom value provider

Recently we had a requirement that if some user wants to buy the same product again on site then he/she can scan the QR code provided to him/her in the first purchase. By scanning the QR code, user will be navigated to form with prefilled fields

After Sitecore 9.3 version, we have Value Providers for pre filling the data in Sitecore form fields. These can be found in Sitecore at location – /sitecore/system/Settings/Forms/Value Providers.

By default, we can prefill your Sitecore Form with contact data from the xDB profile. However, prefilling the fields from query string needs custom value providers.

Following are the steps to accomplish this:

Create custom value provider:

  1. You may create a folder ValueProviders.
  2. In that folder, you may create your custom value provider classes and inherit from the IFieldValueProvider class.
  3. Implement the GetValue method to return an object of any type. You can pass any type of parameters and then parse it to be using in custom class.

    Following is the example of code for pre filling first name from query string parameter ‘shiptoname
using Sitecore.ExperienceForms.ValueProviders;
using System.Web;

namespace Demo.Classes.ValueProvider
{
    /// <summary>
    /// Defines the "FirstNameQueryString" />.
    /// </summary>
    public class FirstNameQueryString : IFieldValueProvider
    {
        public FieldValueProviderContext ValueProviderContext { get; set; }

        public object GetValue(string parameters)
        {
            HttpContext httpContext = System.Web.HttpContext.Current;
            string fName = HttpUtility.ParseQueryString(httpContext.Request.Url.Query).Get(parameters);

            if (string.IsNullOrWhiteSpace(fName))
            {
                return string.Empty;
            }

            return fName;
        }
    }
}

Create corresponding value provider items and link the custom methods:

  1. In /sitecore/system/Settings/Forms,  create a separate folder for query string value providers.
  2. Create value provider items from /sitecore/templates/System/Forms/Value Provider template. Add model class details on the item in field Model Type.
  3. Save the item.

Link the value provider to Sitecore form fields:

  1. Click the Name field, and in the Form elements pane, in the Advanced settings section, in the Value provider field, select the custom provider you have created.
  2. In the Value provider parameters field, enter shiptoname.
  3. Save the form.

Similarly, any type of logic can be used Custom value provider to autofill fields based on the requirement.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s