Выше уже предложили вариант с
коммерческими плагинами. Если это не устраивает, то можете писать сами.
Полный цикл разработки описывать не буду, только укажу на те моменты, которые были заданы в вопросе и, по факту, являются ключевыми, про защиту, оптимизацию кода, структуры БД и прочее думайте сами.
1.Организовать хранение ключей.
Поскольку ключи, по определению уникальны, но активируют конкретный продукт, то хранить их нужно в отдельной таблице, связанной с таблицей товаров через внешний ключ. Какие еще поля будут в этой таблице - зависит только от потребностей заказчика.
2.Организовать выборку так, чтобы один ключ мог купить только один покупатель.
Как работает wordpress не знаю, но в sql* есть конструкция
select ... for update
, которая блокирует дальнейшую выборку строк до тех пор, пока не закончится текущая транзакция (включающая и блокировку и изменение нужных данных).
простой примерSTART TRANSACTION;
-- заблокировать нужное
SELECT value FROM counters WHERE id = 1 FOR UPDATE;
-- увеличить значение.
UPDATE counters SET value = value + 1 WHERE id = 1;
COMMIT;
Как именно разделять проданные и не проданные товары - опять же, решать вам, вариантов - несколько.
3.Загружать ключи.
Есть такой замечательный формат как csv. Как по мне, для загрузки большого количества данных он подходит наиболее хорошо. Плагины для работы с ним должны быть. С другой стороны это больше вопрос к тому, в каком формате вы их будете получать и уже от этого будет зависеть то, как выгружать их в базу.
* - точно есть в mysql и postgresql (и, по идее, любых других бд, поддерживающих транзакции)