Учебник по схеме
Учебник по схемеУрок 8: Миграция сайта

Урок 8: Миграция сайта

Мы можем выполнить пакет GraphQL queries для адаптации контента сайта при его миграции на новый домен, переносе страниц на другой URL и в других случаях.

Чтобы этот GraphQL query работал, в Конфигурации схемы, применённой к эндпоинту, должны быть включены Вложенные мутации

Адаптация контента к новому домену

Этот GraphQL query сначала фильтрует все записи, содержащие "https://my-old-domain.com" в своём контенте, и заменяет эту строку на "https://my-new-domain.com":

mutation ReplaceOldWithNewDomainInPosts {
  posts(
    filter: {
      search: "https://my-old-domain.com"
    }
  ) {
    id
    rawContent
    adaptedRawContent: _strReplace(
      search: "https://my-old-domain.com"
      replaceWith: "https://my-new-domain.com"
      in: $__rawContent
    )
    update(input: {
      contentAs: { html: $__adaptedRawContent }
    }) {
      status
      errors {
        __typename
        ...on ErrorPayload {
          message
        }
      }
      post {
        id
        rawContent
      }
    }
  }
}

Адаптация контента к новому URL записи или страницы

После изменения слага записи или страницы мы можем обновить весь контент, чтобы он указывал на новый URL.

Этот GraphQL query сначала получает домен из настройки WordPress "siteurl", чтобы воссоздать старый и новый URL страницы:

query ExportData(
  $oldPageSlug: String!
  $newPageSlug: String!
) {
  siteURL: optionValue(name: "siteurl")
 
  oldPageURL: _strAppend(
    after: $__siteURL,
    append: $oldPageSlug
  ) @export(as: "oldPageURL")
 
  newPageURL: _strAppend(
    after: $__siteURL,
    append: $newPageSlug
  ) @export(as: "newPageURL")
}
 
mutation ReplaceOldWithNewURLInPosts
  @depends(on: "ExportData")
{
  posts(
    filter: {
      search: $oldPageURL
    },
    sort: { by: ID, order: ASC }
  ) {
    id
    rawContent
    adaptedRawContent: _strReplace(
      search: $oldPageURL
      replaceWith: $newPageURL
      in: $__rawContent
    )
    update(input: {
      contentAs: { html: $__adaptedRawContent }
    }) {
      status
      errors {
        __typename
        ...on ErrorPayload {
          message
        }
      }
      post {
        id
        rawContent
      }
    }
  }
}

Затем мы передаём старый и новый слаги страницы через словарь variables:

{
  "oldPageSlug": "/privacy/",
  "newPageSlug": "/user-privacy/"
}