Как удалить все товары из коллекции - Shopify

У меня есть это отложенное количество продуктов в коллекции на Shopify (более 50 тысяч продуктов), и мне нужно будет удалить их все, есть ли способ автоматизировать это? Все, что я могу найти в Интернете, - это использовать инструмент массового редактирования, который является самой бесполезной вещью, которую я когда-либо видел, поскольку он может захватывать только 50 продуктов за раз.

Я пробовал автоматизировать сценарий для обновления строк с помощью файла экспорта CSV, но для импорта 20K товаров требуется более 6 часов. Кроме того, поскольку в заголовке и дескрипторе есть хэштеги, по какой-то причине он, по-видимому, не перезаписывает продукты. Так что я просто больше не могу пользоваться архивом ...

Кто-нибудь сталкивался с этой проблемой и нашел решение?

Спасибо!


person MathieuAuclair    schedule 24.11.2020    source источник


Ответы (1)


Когда дело доходит до такого рода задач, я обычно сам пишу сценарий быстрой консоли разработчика, который выполнит эту работу за меня, вместо того, чтобы полагаться на приложение.

Вот сценарий, который вы можете использовать в консоли разработчика на странице администратора shopify (просто скопируйте / вставьте):

let productsArray = [];

// Recursive function that will grab all products from a collection
const requestCollection = (collectionId, url = `https://${window.location.host}/admin/api/2020-10/collections/${collectionId}/products.json?limit=250`) => {
    fetch(url).then(async res  => {
        const link = res.headers.get('link');
        const data = await res.json();
        productsArray = [...productsArray, ...data.products];

        if(link && link.match(/<([^\s]+)>;\srel="next"/)){
            const nextLink = link.match(/<([^\s]+)>;\srel="next"/)[1];
            requestCollection(collectionId, nextLink)
        } else {
            initDelete(productsArray)
        }
    })
}

// Get CSRF token or the request will require password
const getCSRFToken = () => fetch('/admin/settings/files',{
    headers: {
        "x-requested-with": "XMLHttpRequest",
        "x-shopify-web": 1,
        "x-xhr-referer": `https://${window.location.host}/admin/settings/files`
    }
}).then(res => res.text()).then(res => {
    const parser = new DOMParser();
    const doc = parser.parseFromString(res, 'text/html');
    return doc.querySelector('meta[name="csrf-token"]').getAttribute('content')
})

// The function that will start the deleting process
const initDelete = async (products) => {
    const csrfToken = await getCSRFToken();
    products.forEach(item => {
        fetch(`https://${window.location.host}/admin/api/2020-10/products/${item.id}.json`, {
            method: "delete",
            credentials: 'include',
            headers: {
                "x-csrf-token": csrfToken,
                "x-requested-with": "XMLHttpRequest",
                "x-shopify-web": 1,
                "x-xhr-referer": `https://${window.location.host}/admin/settings/files`
            }
        })
    })
}

И вы запускаете это с помощью requestCollection(ADD_YOUR_COLLECTION_ID_HERE).

Чтобы прояснить сценарий, можно выделить 3 основные функции:

  • requestCollection - обрабатывает получение товара из коллекции. Это рекурсивная функция, поскольку мы не можем получить более 250 товаров одновременно.
  • getCSRFToken - это захватывает токен CSRF, так как большая часть запросов на публикацию / обновление / удаление требует этого, иначе они потерпят неудачу (я беру его со страницы файлов)
  • initDelete - эта функция запускает процесс удаления, в котором мы складываем все запросы один из других, не дожидаясь ожидания, вы можете дождаться каждого запроса, но даже если вы сломаете свой браузер, я думаю, будет еще быстрее повторить процесс, чем ждать для каждого запроса, чтобы закончить.

Если вы планируете использовать этот скрипт, пожалуйста, ПРОВЕРЬТЕ ЕГО ПЕРЕД ИСПОЛЬЗОВАНИЕМ. Создайте коллекцию из нескольких продуктов и работайте с ней, если возникнут проблемы. Я тестировал его на своей стороне, и он работает, но это код, который я написал через 10 минут после полуночи, там могут быть проблемы.

Имейте в виду, что этот скрипт удалит ВСЕ продукты из коллекции, указанной вами в методе requestCollection(1231254125).

PS: Все это можно сделать с помощью частного приложения, а также с областью действия продуктов, установленной на чтение / запись, с использованием внутреннего языка по вашему выбору. Основное отличие будет заключаться в том, что вам не понадобится токен CSRF и большинство заголовков, которые я установил выше. Но мне нравятся быстрые решения, которые не требуют от вас больших усилий.

person drip    schedule 24.11.2020
comment
Замечательно, спасибо за подробный ответ, работает отлично! Я увидел, что это было просто невозможно без прохождения API по Shopify форум - person MathieuAuclair; 25.11.2020
comment
Замечательно, что этот ответ сработал. Мне пришлось посмеяться, потому что этот сценарий обычно состоит из трех строк кода Ruby. - person David Lazar; 25.11.2020
comment
@DavidLazar: да, но я использую этот подход в большинстве случаев, поскольку вам не нужно создавать частное приложение только для этого (особенно если клиент не дал вам для этого доступа) и позволяет вам получить доступ к элементам, которые API не поддерживает (например, загрузка файлов или клонирование / экспорт / импорт навигации, у которой нет конечной точки API). Имейте в виду, что я работаю в разных магазинах ежедневно, поэтому для меня это хорошо работает, но может не работать для других. Настройка нескольких пользовательских скриптов, которые работают с одним щелчком мыши, экономит много времени. ;) - person drip; 25.11.2020
comment
Конечно, если у вашей учетной записи есть разрешение на просмотр их продуктов, это нормально. Интересно. Удаление продуктов остается одной из самых медленных задач, которые вы можете сделать. Я думаю, это понятно. Мой опыт массового удаления больше связан с созданием 50K SKU с помощью скрипта, а затем срывом его, чтобы сделать это снова с изменениями. Довольно забавно, поскольку Delete в SQL обычно выполняется довольно быстро при правильной подаче. - person David Lazar; 25.11.2020