Intereting Posts
URL-адрес издателя, если присутствует ссылка href Пагинация и несколько циклов Пользовательский тип типа «Тип сообщения» не будет проходить с помощью довольно постоянных ссылок Должен ли я удалять автоматически созданные файлы перед установкой WordPress? Странные символы в заголовке, если они содержат "" Сочетание повторяющихся таксономических терминов Изображение не отображается на шаблоне страницы в Twenty 15-theme как получить путь к изображениям в папке uploads, которая будет использоваться в плагине pre_get_posts с несколькими запросами Breadcrumb, который показывает несколько пользовательских таксономий Копирование структуры таксономии с одного CPT на другой Звуковой код shortclode не работает Необходимо вернуть текст короткого кода вместо вывода Сайт сломан после удаления неактивных тем Запрос get_posts соответствует слишком большому количеству результатов

Система голосования вверх / вниз для WordPress

Взгляд во всех сообщениях с ключевыми словами «система голосования, upvote, downvote», я не могу найти удовлетворительное решение для этой проблемы, за исключением того, что я принимаю один из доступных плагинов, тратить много времени на то, чтобы отменить его, и попытаться изменить его функциональные возможности, чтобы они соответствуют требованиям. Итак, я убежден в написании своего собственного кода, чтобы создать систему Word-обмена, подобную стеку, для WordPress. Без ваших предложений я не могу найти отправную точку для основной части скелета моего кода.

Мой фактический подход:

  • Создайте два настраиваемых поля: первый хранит количество postvotes, а второе – количество downvotes. Можно отобразить состояние голосов с использованием функции get_post_meta и изменить состояние голосования с помощью update_post_meta с помощью update_post_meta .
  • Найдите способ сохранить в базе данных проголосовавшие сообщения определенного пользователя и состояние голосования (вверх, вниз или ничего). Чтобы зарегистрированные пользователи просматривали, проголосовали ли они.
 If (user is logged in ) { Show the upvote or downvote state already done by this user; Allow voting ; } else { don't allow voting; } 

Мой вопрос: как решить вторую проблему. Есть ли способ достичь этого, используя функции настройки, предлагаемые функциями WordPress PHP (без использования SQL-запросов, поскольку я не знаю, как использовать SQL). Я наблюдаю, что все плагины для голосования вверх / вниз используют SQL-запросы в своем коде, что заставляет меня действительно бояться. Должен ли я изучать SQL для достижения моей цели?

Простая мета-строка пользователя может обрабатывать это для вас (вторая проблема), вы можете сохранить идентификатор сообщения и голос (вверх / вниз) в массиве, и это то же самое, что и post meta ex

 /** * update user vote per post * @param int $user_id * @param int $post_id * @param mixed $vote can be an integer 1 / -1 and can also be a string "up"/"down" * @return void */ function update_user_vote($user_id,$post_id,$vote){ //get all saved user data $user_votes = get_user_meta($user_id,'updown_votes',true); $user_votes[$post_id] = $vote; //update with the new vote update_user_meta($user_id,'updown_votes',$user_votes); } /** * get user vote of post * @param int $user_id * @param int $post_id * @return if user has voted the his vote will be returned , zero if no vote found for post by this user */ function get_user_vote($user_id,$post_id){ //get all saved user data $user_votes = get_user_meta($user_id,'updown_votes',true); return (isset($user_votes[$post_id])) ? $user_votes[$post_id] : 0; } 

и все сделано без SQL 🙂

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

Храните все в метате.

Вы можете сделать это только с двумя полями, которые вы уже рассматриваете. Вместо сохранения счетчика сохраните массив ID пользователя. Чтобы получить счет, просто подсчитайте ID пользователей. С одним массивом «upvoted» и одним «downvoted» массивом у вас есть то, что вам нужно.

Чтобы сообщить пользователю, если они проголосовали, просто проверьте массив на ID пользователя.

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

Используйте комбинацию метаданных и метаданных пользователя

Как и выше, но вы будете использовать функции *_user_meta для сохранения массива ID сообщений в таблице usermeta в дополнение к счетчикам в $wpdb->postmeta .

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

Оба параметра могут иметь проблемы с производительностью, если массивы становятся слишком большими. Тип столбца базы данных – longtext , который будет содержать много данных, но время обработки передачи может стать проблемой.

Я думаю, что вы, вероятно, сможете использовать комментарий meta вместо post meta, но я думаю, что post meta лучше подходит.

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