1) списки. (плейлисты в ютуб)
Пользователь создает новый "список" - добавляет в него элементы.
"список" - это суб-структура "избранного"
Каждый "список" храниться в таблице списков, имеет: ИД, Имя, Владельца.
2) уникальный набор
Пользователь указывает в своем "избранном" чем хочет поделиться -> список ИД элементов приходит на сервер -> (https://hashids.org/php/) -> получаете уникальный идентификатор (который сам по себе содержит список ИД)
Такой вариант не требует хранения в БД
Вариант без новых таблиц в бд:
- сохраняйте id записей в поле пользователя (в WP есть метаполя пользователей)
- создайте страницу, которая сможет обработать запрос типа yoursite/favourites/?list={$id}, где $id это собственно id пользователя
- заберите id‘шки записей массивом из метапонятие, и этот массив передайте в WP_Query
- готово
Вариант с таблицами: примерно то же самое, но нужно создать таблицу, где хранить id пользователей и записей, вытаскивая по необходимости. Для этого нужен wpdb.
Второй вариант предпочтительнее, первый быстрее и проще.