Когда дело доходит до такого рода задач, я обычно сам пишу сценарий быстрой консоли разработчика, который выполнит эту работу за меня, вместо того, чтобы полагаться на приложение.
Вот сценарий, который вы можете использовать в консоли разработчика на странице администратора 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