У меня есть функция, которая сохраняет статус «как» для поста как мета поста. Я хочу связать это «лайк» с пользователем, которому он понравился, поэтому я настраиваю настраиваемое поле с именем «like_status_ {user_id}» (где {user_id} - идентификатор текущего пользователя, вошедшего в систему), которое я сохраняю как 0 или 1. Так что для поста с несколькими «лайками» в БД будет несколько мета-значений, которые настроены так:
'meta_key' = 'like_status_0'
'meta_value' = 1
'meta_key' = 'like_status_2'
'meta_value' = 1
'meta_key' = 'like_status_34'
'meta_value' = 1
....и так далее.
На определенном посте потенциально могут быть тысячи лайков. Как бы я запустил запрос, показывающий, нравится ли кому-то еще этот пост?
Я думал что-то вроде этого:
$query = new WP_Query(array(
'meta_key' => 'like_status_{user_id}',
'meta_value' => 1,
));
Я пытаюсь разослать уведомление всем, кому понравился пост, когда кому-то еще нравится этот пост ... что-то вроде: "Эй, кому-то еще понравился этот пост, который вам понравился. Вы должны проверить его!" Но мне нужен способ узнать, понравился ли кому-то еще этот пост, и если да, то кем он будет, чтобы я мог уведомить их.
Если это невозможно, не могли бы вы предложить лучший способ хранения этих данных в виде post_meta, сохраняя при этом эффективность быстрого обновления статуса одного пользователя в сообщении?
Сложно конкретно ответить на ваш вопрос. Первая часть проста, хотя. Я недавно сделал что-то похожее на stackoverflow
Мета-ключи сравниваются и точно совпадают.
WP_Query
у нас нет средств для настройки этого поведения с помощью простого параметра, но мы всегда можем сами его ввести, а затем настроитьposts_where
предложение дляLIKE
сравнения мета-ключей.ФИЛЬТР
Это просто базовый фильтр, настройте его по мере необходимости.
Как видите, фильтр срабатывает только тогда, когда мы устанавливаем наш новый пользовательский параметр
wildcard_on_key
вtrue
. Когда это проверяется, мы просто меняем=
компаратор наLIKE
компараторПросто отметим, что
LIKE
сравнения по своей природе обходятся дороже, чем другие сравненияВОПРОС
Вы можете просто запросить ваши сообщения, как следует, чтобы получить все сообщения с мета-ключами
like_status_{user_id}
ДРУГОЙ ВОПРОС
Пользовательские поля не влияют на производительность, вы можете прочитать мой пост на эту тему здесь . Однако я обеспокоен тем, что вы говорите, что каждый пост может иметь сотни или тысячи лайков. Это может повлиять на производительность при получении и кэшировании такого большого количества данных настраиваемых полей. Он также может засорить вашу базу данных огромным количеством ненужных данных настраиваемых полей, что делает его довольно сложным в обслуживании.
Я не очень большой поклонник хранения сериализованных данных в пользовательских полях, так как нельзя выполнять поиск или сортировку по сериализованным данным. Однако я бы предложил хранить все идентификаторы пользователя в массиве под одним настраиваемым полем. Вы можете просто обновить массив с идентификатором пользователя, когда пользователю нравится сообщение. Получить данные настраиваемого поля и циклы по массиву идентификаторов и сделать что-то с идентификаторами очень просто. Просто посмотрите на
get_post_meta()
Обновление настраиваемого поля также легко. Для этого вам нужно разобраться
update_post_meta()
, я не знаю, как вы создаете свои настраиваемые поля, ноupdate_post_meta()
это определенно то, что вы хотели бы использовать.Если вам нужно отправлять электронные письма или push-уведомления при обновлении настраиваемого поля, у вас есть следующие хуки, с которыми можно работать. ( См.
update_metadata()
Для контекста )update_postmeta
обновлено _ {$ meta_type} _meta
updated_postmeta
обновление _ {$ meta_type} _meta
обновление _ {$ meta_type} _metadata
ВЫВОД
Непосредственно перед тем, как я опубликую это, еще раз, прежде чем идти по сериализованному маршруту, убедитесь, что вам не нужно будет сортировать отсортированные данные или искать конкретные данные внутри сериализованных данных.
источник
Начиная с Wordpress 5.1 теперь возможно использовать мета-запрос, например:
источник
Если позже вы захотите расширить это, добавив более подробную статистику, функции и т. Д., Тогда еще одной альтернативой может быть: пользовательские таблицы
Плюсы : с учетом ваших потребностей и могут быть проиндексированы для повышения производительности.
минусы : больше работы
Может также существовать обходной путь, использующий пользовательскую таксономию, который может дать лучшую производительность запросов, чем пост-мета-запросы, из-за того, как индексируются основные таблицы.
Не уверен, какие уведомления вы имеете в виду здесь, но это может быстро стать громоздким.
Пример : пользователь, которому нравится ~ 1000 сообщений, и каждое сообщение получает ~ 1000 лайков, тогда в каналах есть 1M уведомлений, только для этого пользователя! Если это почтовые уведомления, то хост-провайдер может быть недоволен, и пользователь сходит с ума. Это также может быть дорого с почтовым сервисом третьей стороны.
источник
Согласно документации WP_Meta_Query вы можете использовать
compare
аргумент вmeta_query
аргументе WP_Query. Тем не менее, вы можете сравнить только с,value
а не с,key
поэтому вы можете пересмотреть, как вы это структурируете.like
Аргумент будет выглядеть следующим образом :Учитывая, что вы не можете выполнить поиск "LIKE" в разделе,
key
я бы предложил вам добавить понравившиеся посты в пользовательскую мета и выполнить поиск WP_User_Query для пользователей, которым понравился этот пост:источник