Intereting Posts
Вставка переменной в короткий код внутри php Как отображать виджеты внутри содержимого страницы без плагина? получить заказную копию архива по месяцам WordPress на локальной машине, перенаправляющей на онлайн-адрес Детские страницы и пользовательские таксономии Добавление аутентификатора google и использование только адреса электронной почты пользователя wp_redirect () – уже отправленные заголовки Добавление элементов в wp_list_pages (внутри <li>, но до <a>) Получите еще 1 сообщение в цикле Включить текст в эхо-гиперссылку Как разместить пользовательскую папку под одним подсайтом Multisite WP? Не показывать html, если функция ничего не возвращает Архивные листинги, отобранные по дате Значения в пользовательском поле / сообщение Meta? Включить выдержки из отрывка в теме wordpress двадцать тринадцать add_rewrite_rule и передача переменных для пользовательских типов сообщений

Создание расширяемого плагина WordPress favouriting – один сериализованный массив метазначений или множество метаданных

Я пытаюсь создать простой плагин WordPress для чтения, который является масштабируемым и может обрабатывать 1000 или 10000 пользователей или более.

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

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

Вариант 1: Хранить как в метафайлах, так и в почтовых метафайлах с сериализованными массивами

Это то, что делает WordPress Post Like System ( https://hofmannsven.com/2013/laboratory/wordpress-post-like-system/ ). После щелчка код извлекает мета-ключ _liked_posts из таблицы метаданных пользователя, в которой хранится в массиве идентификаторы сообщений постов, которые понравились пользователю, и извлекает мета-ключ _user_likes из метатеги сообщений, которая хранится в массиве пользователя идентификаторы пользователей, которым понравился пост.

Затем код добавляет текущий идентификатор сообщения в _liked_posts и текущий идентификатор пользователя к _user_likes. Он также увеличивает два дополнительных метаданных: post like count и пользователь, например count.

Что мне нравится в этой системе, так это то, что она выглядит довольно простой: только одна запись в метателе пользователя и одна запись в мета-хранилище, кому понравилось. Что мне не нравится, так это то, что если у вас есть много пользователей, которым нравится публикация или пользователь, которому нравятся многие сообщения, такие метаданные могут быть очень длинными, что, я полагаю, может вызвать проблемы?

$meta_POSTS = get_user_meta( $user_id, "_liked_posts" ); // post ids from user meta $meta_USERS = get_post_meta( $post_id, "_user_liked" ); // user ids from post meta $meta_POSTS['post-'.$post_id] = $post_id; // Add post id to user meta array $meta_USERS['user-'.$user_id] = $user_id; // add user id to post meta array update_post_meta( $post_id, "_user_liked", $meta_USERS ); // Add user ID to post meta update_user_meta( $user_id, "_liked_posts", $meta_POSTS ); // Add post ID to user meta 

Вариант 2: добавьте запись к метате пользователя для каждого понравившегося сообщения

После щелчка, код проверяет, была ли запись уже вставлена ​​в пользовательскую мета. Если нет, он добавляет новую запись в избранное. Если он имеет, он ничего не делает.

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

 // Check if already favourited the post in User Meta // Not sure how you would do this with WP_Query or WP_User_Query, any suggestions? $favourited = WP_Query($args) if ($favourited->post_count == 0) { // Add user meta with favourite add_user_meta($userid, '_favourite_episode', $postid); } 

Итак, в заключение, то, что я прошу, в основном, является лучшей практикой здесь. Это либо:

  • Наличие одного большого сериализованного массива в одной группе мета-ключ / значение
  • Наличие нескольких пар значений мета / ключа с целым числом в метазначении
  • Есть ли другой вариант, который я не рассматривал?

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

http://code.tutsplus.com/series/custom-database-tables–wp-33839

Вы забыли вариант 3 – добавьте специальную таблицу, в которой пара (пользователь, почтовый идентификатор) будет индексом. Ок, я не человек MySQL, поэтому, возможно, это слишком экстремально, но, возможно, наличие двух таблиц с пользователями в качестве индекса, а один с сообщениями будет еще лучше.

Дело в производительности заключается в том, что в любое время редко доступны абсолютные решения для всех, а «лучший» зависит от вашего фактического шаблона использования, а не от теоретического. Или, другими словами, вы делаете раннюю оптимизацию здесь.

Хотя вариант 2, по-видимому, быстрее для этой конкретной информации, он будет увеличивать мета-таблицы и, следовательно, замедляет все запросы к этим таблицам (поэтому предложение для варианта 3 очень похоже, но не влияет на другие запросы).

Другой проблемой, которую вы игнорируете, является стоимость вставки / обновления данных. Эта операция намного медленнее, чем чтение и не может быть кэширована. Если у вас одновременно будет много разных предпочтений, с опцией 2 вы заблокируете таблицы, и запросы должны будут ждать завершения других, и каждая вставка будет медленнее, в то время как вариант 1, вероятно, закончится повреждением данных при наивной реализации (два изменения в одно и то же время, в лучшем случае только один из них будет иметь влияние).

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

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

Вариант 1 не лучший выбор, потому что сериализация данных означает, что вы должны анализировать результат SQL для чтения и, следовательно, вы не можете воспользоваться преимуществами SQL-запросов.

Вариант 2 был бы самым простым способом, но если у вас много пользователей, которым нравится много сообщений, тогда он начинает загрязнять пользовательскую мета-таблицу.

Вариант 3, что я буду делать, – создать реляционную таблицу между сообщениями и пользователями. Использование таблицы отношений было бы самым простым, потому что тогда вы можете использовать SQL, чтобы сделать для вас много логики. Например, вам не нужно подсчитывать, сколько нравится одному сообщению в PHP, но вместо этого запускает запрос к SQL, который делает это для вас, и возвращает результат. Это будет хорошо для производительности, и если вы удалите плагин, тогда все, что вам нужно сделать, это удалить таблицу, просто и чисто.