Задача
Оформить дружелюбно для поиска Google страницы сайта с пейджингом
Теория
На английскомSEO Guide to Google Webmaster Recommendations for Pagination
https://moz.com/blog/seo-guide-to-google-webmaster-recommendations-for-pagination
На русском
Постраничная верстка rel=«next|prev»
https://habr.com/ru/post/128746/
Сухая выжимка.
Для страниц каталога , которые реализованы в виде пейджинга рекомендуется прописывать в заголовке страницы
<link rel="prev" href="http://www.example.com/article?story=abc&page=2" /> <link rel="next" href="http://www.example.com/article?story=abc&page=4" />
причем link rel="prev" не нужен на первой странице, а
link rel="next" не нужен на последней
Решение на C#
public static class UtilsSeo{
private const string pageParamName = "page";
public static string FindUrlPagePrev(
string url,
int? pageNumber,
int pageSize,
int itemTotalCount
)
{
var pageNumberStrongDefined = GetStrongDefinedPageNumber(pageNumber);
if (pageNumberStrongDefined <= 1) return null;
if (pageNumberStrongDefined > GetMaxPageNumber(pageSize, itemTotalCount)) return null;
return devuaUtils2014.Urls.UrlParamAddOrChange(url, pageParamName, (pageNumberStrongDefined - 1).ToString());
}
private static int GetStrongDefinedPageNumber(int? pageNumber)
{
var pageNumberStrongDefined = pageNumber ?? 0;
if (pageNumberStrongDefined <= 0) pageNumberStrongDefined = 1;
return pageNumberStrongDefined;
}
public static bool IsLastPage(
int? pageNumber,
int pageSize,
int itemTotalCount
)
{
return GetStrongDefinedPageNumber(pageNumber) >= GetMaxPageNumber(pageSize, itemTotalCount);
}
private static double GetMaxPageNumber(int pageSize, int itemTotalCount)
{
return Math.Ceiling( (double)itemTotalCount / (double)pageSize );
}
public static string FindUrlPageNext(
string url,
int? pageNumber,
int pageSize,
int itemTotalCount
)
{
if (IsLastPage(pageNumber, pageSize, itemTotalCount)) return null;
var pageNumberStrongDefined = GetStrongDefinedPageNumber(pageNumber);
return devuaUtils2014.Urls.UrlParamAddOrChange(url, pageParamName,
(pageNumberStrongDefined + 1).ToString());
}
}
Утилиты
namespace devuaUtils2014
{
public static class Urls
{
public static string UrlParamRemove(string absoluteUri, string paramName)
{
var uriBuilder = new UriBuilder(absoluteUri);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query.Remove(paramName);
uriBuilder.Query = query.ToString();
return GetUriBuilderAsStringWithoutDefaultPort(uriBuilder);
}
private static string GetUriBuilderAsStringWithoutDefaultPort(UriBuilder uriBuilder)
{
if (uriBuilder.Uri.IsDefaultPort)
{
uriBuilder.Port = -1;
}
return uriBuilder.ToString();
}
public static string UrlParamChange(string absoluteUri, string paramName, string paramValue)
{
var uriBuilder = new UriBuilder(absoluteUri);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query[paramName] = paramValue;
uriBuilder.Query = query.ToString();
return GetUriBuilderAsStringWithoutDefaultPort(uriBuilder);
}
public static string UrlParamAdd(string absoluteUri, string paramName, string paramValue)
{
var uriBuilder = new UriBuilder(absoluteUri);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query.Add(paramName,paramValue); //[paramName] = paramValue;
uriBuilder.Query = query.ToString();
return GetUriBuilderAsStringWithoutDefaultPort(uriBuilder);
}
public static string UrlParamAddOrChange(string absoluteUri, string paramName, string paramValue)
{
var uriBuilder = new UriBuilder(absoluteUri);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
var res = "";
if (string.IsNullOrEmpty(query[paramName]))
{
res = UrlParamAdd(absoluteUri, paramName, paramValue);
}
else
{
res = UrlParamChange(absoluteUri, paramName, paramValue);
}
return res;
}
}
}
Пример
https://childcourse.com.ua/course?page=2
Комментариев нет:
Отправить комментарий