Доброго дня! Установил в настройках галочку "группировать достижения". Все вроде бы работает, но немножко не правильно.
Вот у меня есть группа "За комментарии" - x1, x10, x50 и т.д. При включенной группировке в ЛК показывается достижение за x1, хотя по логике должно показываться за x50.
Ну да если вначале добавить ачивку за 50 комментов а потом за 10 комментов, то ID ачивки за 10 комментов будет выше.
Вообщем это можно исправить только добавлением в таблицу статистики еще одного столбца ID с auto_increment, в след обновлении может добавлю, если ничего другого не придумаю
Kerncraft1 сказал(а)
Достижения добавлялись по порядку. За х1 коммент - id=15, за x10 - id=16, за х50 - id=17 и так далее.
это вы посмотрели или по памяти?
Вот запрос который все это дело формирует:
$get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, tmp.date " . "FROM (" . "SELECT * FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, achiev_id DESC) as tmp " . "INNER JOIN " . RCL_PREF . "achievement ON tmp.achiev_id = " . RCL_PREF . "achievement.ID " . "GROUP BY type " . "LIMIT $limit", ARRAY_A);
т.е. вначале берутся все ачивки юзера и сортируются по дате, например:
15 - дата 04.12.2017
16 - дата 05.12.2017
17 - дата 06.12.2017
После сортировки
17 - дата 06.12.2017
16 - дата 05.12.2017
15 - дата 04.12.2017
Затем сортируются по ID, но у нас все останется так же т.к. ID и так по убиванию идут.
Затем они групируются и берется только первое вхождение, т.е. 17
Так что я не могу сказать в чем проблема.
Посмотрите точно в админке так ли идут ID как вы сказали, иначе я хз
Именно в админке посмотрел. Меня же именно это и удивило, так как явно по логике должны именно достижения с наивысшим ID показываться.
Скрин из админки -
Скрин с ЛК -
Как видите, так и с остальными достижениями, а не только с комментариями.
Kerncraft1 сказал(а)
Стоп. Я помниться еще когда только купил доп, редактировал файл lk_achiev.php в /wp-content/wp-recall/templates/наверное тут собака зарыта?
Нет, шаблон отображает результат из бд, на получение он не влияет.
Попробуйте в index.php плагина на 424 строке удалить все, т.е. вот это:
. "ORDER BY date DESC, achiev_id DESC "
Затем если не поможет в 421 строке DESC заменить на ASC
Kerncraft1 сказал(а)
Так. С ползунками вроде разобрался - достижения в ЛК вернулись)Выполнил ваши рекомендации, но все осталось по прежнему.
Скрин, который вы просили -
Вы не можете просматривать опубликованные ссылкиП.С. В блоке автора так же выводится первое достижение из группы.
Если вы поменяли порядок сортировки с DESC на ASC то должно быть все наоборот. Какая версия mysql стоит?
Может быть в этом дело, я особо не шарю в различиях таблиц, у меня mysql стоит, а mariadb это переделанная mysql как я понял.
У вас есть тестовый сайт?
В index.php плагина начиная c 417 строки весь запрос замените на:
$get_a = $wpdb->get_results("" . "SELECT * FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, achiev_id DESC ", ARRAY_A); var_dump($get_a); die();
И посмотрите страницу где выводятся достижения, там должен отобразиться массив всех ачивок отсортированный по дате получения, его скопируйте.
Только бекап того что заменяете не забывайте делать
array(17) { [0]=> array(5) { ["achiev_id"]=> string(2) "29" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-06 11:18:45" ["type"]=> string(23) "rating_all_sum_received" ["status"]=> string(1) "1" } [1]=> array(5) { ["achiev_id"]=> string(2) "28" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-06 11:18:45" ["type"]=> string(23) "rating_all_sum_received" ["status"]=> string(1) "1" } [2]=> array(5) { ["achiev_id"]=> string(2) "23" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 12:07:32" ["type"]=> string(26) "rating_post_count_received" ["status"]=> string(1) "1" } [3]=> array(5) { ["achiev_id"]=> string(2) "22" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 12:07:32" ["type"]=> string(26) "rating_post_count_received" ["status"]=> string(1) "1" } [4]=> array(5) { ["achiev_id"]=> string(2) "21" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 12:07:32" ["type"]=> string(26) "rating_post_count_received" ["status"]=> string(1) "1" } [5]=> array(5) { ["achiev_id"]=> string(2) "11" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [6]=> array(5) { ["achiev_id"]=> string(2) "10" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [7]=> array(5) { ["achiev_id"]=> string(1) "9" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [8]=> array(5) { ["achiev_id"]=> string(1) "8" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [9]=> array(5) { ["achiev_id"]=> string(1) "7" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [10]=> array(5) { ["achiev_id"]=> string(1) "6" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [11]=> array(5) { ["achiev_id"]=> string(1) "5" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" ["type"]=> string(9) "post_post" ["status"]=> string(1) "1" } [12]=> array(5) { ["achiev_id"]=> string(2) "18" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:39:55" ["type"]=> string(7) "comment" ["status"]=> string(1) "1" } [13]=> array(5) { ["achiev_id"]=> string(2) "17" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:39:55" ["type"]=> string(7) "comment" ["status"]=> string(1) "1" } [14]=> array(5) { ["achiev_id"]=> string(2) "16" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:39:55" ["type"]=> string(7) "comment" ["status"]=> string(1) "1" } [15]=> array(5) { ["achiev_id"]=> string(2) "15" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:39:55" ["type"]=> string(7) "comment" ["status"]=> string(1) "1" } [16]=> array(5) { ["achiev_id"]=> string(1) "2" ["user_id"]=> string(1) "1" ["date"]=> string(19) "2017-11-26 13:40:15" ["type"]=> string(8) "register" ["status"]=> string(1) "0" } }
Попробуйте для теста так сделать:
Весь запрос с 417 строки заменить на
$get_a = $wpdb->get_results("" . "SELECT achiev_id FROM " . RCL_PREF . "achievement_stats " . "WHERE user_id = $user_id ORDER BY date DESC, achiev_id DESC ", ARRAY_A); foreach ($get_a as $a) { $a_id_list[] = $a['achiev_id']; } $a_id_list = implode(',', $a_id_list); $get_a = $wpdb->get_results("" . "SELECT " . RCL_PREF . "achievement.*, " . RCL_PREF . "achievement_stats.date " . "FROM " . RCL_PREF . "achievement, " . RCL_PREF . "achievement_stats " . "WHERE " . RCL_PREF . "achievement.ID IN($a_id_list) " . "AND " . RCL_PREF . "achievement.ID = " . RCL_PREF . "achievement_stats.achiev_id " . "GROUP BY type " . "ORDER BY date DESC, ID DESC " . "LIMIT $limit", ARRAY_A);
И посмотреть как выводится.
Опять же бекап делайте и желательно на тестовом сайте
Может вардамп надо добавить?
Добавил.
Вывод:
array(5) { [0]=> array(11) { ["ID"]=> string(2) "28" ["name"]=> string(17) "Рейтинг x1" ["descr"]=> string(77) "Получить первую единицу рейтинга на сайте" ["type"]=> string(23) "rating_all_sum_received" ["count"]=> string(1) "1" ["img_id"]=> string(5) "29345" ["img_url"]=> string(57) "https://mod-land.ru/wp-content/uploads/2017/12/rating.png" ["reward"]=> string(24) "{"rating":0,"balance":0}" ["group_id"]=> string(1) "0" ["status"]=> string(1) "1" ["date"]=> string(19) "2017-12-06 11:18:45" } [1]=> array(11) { ["ID"]=> string(2) "21" ["name"]=> string(22) "Первый лайк!" ["descr"]=> string(70) "Получить первый лайк своей публикации" ["type"]=> string(26) "rating_post_count_received" ["count"]=> string(1) "1" ["img_id"]=> string(5) "28780" ["img_url"]=> string(55) "https://mod-land.ru/wp-content/uploads/2017/12/like.png" ["reward"]=> string(24) "{"rating":0,"balance":0}" ["group_id"]=> string(1) "0" ["status"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 12:07:32" } [2]=> array(11) { ["ID"]=> string(1) "5" ["name"]=> string(21) "Модмейкер x1" ["descr"]=> string(61) "Опубликовать первый мод на сайте." ["type"]=> string(9) "post_post" ["count"]=> string(1) "1" ["img_id"]=> string(5) "28778" ["img_url"]=> string(61) "https://mod-land.ru/wp-content/uploads/2017/12/contract-1.png" ["reward"]=> string(24) "{"rating":0,"balance":0}" ["group_id"]=> string(1) "0" ["status"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:40:48" } [3]=> array(11) { ["ID"]=> string(2) "15" ["name"]=> string(35) "Первый комментарий" ["descr"]=> string(68) "Оставить первый комментарий на сайте" ["type"]=> string(7) "comment" ["count"]=> string(1) "1" ["img_id"]=> string(5) "28779" ["img_url"]=> string(64) "https://mod-land.ru/wp-content/uploads/2017/12/speech-bubble.png" ["reward"]=> string(24) "{"rating":0,"balance":0}" ["group_id"]=> string(1) "0" ["status"]=> string(1) "1" ["date"]=> string(19) "2017-12-02 11:39:55" } [4]=> array(11) { ["ID"]=> string(1) "2" ["name"]=> string(30) "Теперь ты с нами!" ["descr"]=> string(55) "За регистрацию на сайте Mod-Land.ru" ["type"]=> string(8) "register" ["count"]=> string(1) "0" ["img_id"]=> string(5) "28024" ["img_url"]=> string(66) "https://mod-land.ru/wp-content/uploads/2017/11/handshake_78379.png" ["reward"]=> string(24) "{"rating":0,"balance":0}" ["group_id"]=> string(1) "0" ["status"]=> string(1) "0" ["date"]=> string(19) "2017-11-26 13:40:15" } }
Вот еще, во время последней смены кода, который вы писали, в логах nginx проскочило такое:
2017/12/06 14:49:03 [error] 19750#19750: *21487 FastCGI sent in stderr: "PHP message: PHP Warning: implode(): Invalid arguments passed in /var/www/kerncraft1/data/www/mod-land.ru/wp-content/wp-recall/add-on/achievement-system/index.php on line 429 PHP message: База данных WordPress возвратила ошибку You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') AND ytbao_rcl_achievement.ID = ytbao_rcl_achievement_stats.achiev_id GROUP BY ' at line 1 в ответ на запрос SELECT ytbao_rcl_achievement.*, ytbao_rcl_achievement_stats.date FROM ytbao_rcl_achievement, ytbao_rcl_achievement_stats WHERE ytbao_rcl_achievement.ID IN() AND ytbao_rcl_achievement.ID = ytbao_rcl_achievement_stats.achiev_id GROUP BY type ORDER BY date DESC, ID DESC LIMIT 3, выполненный require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/jannah-child/single.php'), rcl_get_author_block, rcl_get_userlist, rcl_get_include_template, rcl_include_template, include('/wp-recall/templates/user-rows.php'), rcl_user_description, do_action('rcl_user_description'), WP_Hook->do_action, WP_Hook->apply_filters, rcl_a_show_in_userli" while reading upstream, client: 188.16.129.233, server: mod-land.ru, request: "GET /ccd-mods/avtomobil-lamborghini-urus-dlya-city-car-driving-1-5-1-1-5-4.html HTTP/1.1", upstream: "fastcgi://unix:/var/www/php-fpm/kerncraft1.sock:", host: "mod-land.ru"
Я не знаю в чем может быть проблема, у вас база почему то не хочет сортировать нормально.
Ждите обновления, я там новую колонку добавлю и возможно нормализуется все, правда у тех кто уже получал ачивки может останется, тут только поможет удаление ачивок у юзеров что бы они заново их получили.
Вообщем ждите обновления, там посмотрите как выводится
Проверяйте, обновил плагин.
Но проверяйте на каком то новом юзере или тестовом сайте, т.к. раньше в стату записывалась только дата получения ачивки и если юзер получал сразу 2 ачивки, например за 1 и за 10 комментариев - дата и время были одинаковые и из-за этого была проблема. Сейчас я добавил новый столбец где пишется ID и у более поздней ачивки будет более высокий ID (даже с одинаковой датой) и такой проблемы быть не должно. Но уже полученным ачивкам присвоить корректный ID нельзя, из-за этого у тех кто уже получил ачивки может выводиться как и раньше некорректно.
Если есть возможность то советую удалить всем полученные ачивки в таблице achievement_stats, они их получат вновь при каждом действии (например при публикации комментария юзер получит все ачивки которые ему доступны)
Kerncraft1 сказал(а)
Так, пока уведомление о новой версии еще не прилетело. Вопрос: а если я удалю доп - он удалит таблицы из БД? Просто наверное проще потом поставить его заново и добавить ачивки (благо их не много пока).
Ваша версия не удалит, в обновлении будет удаляться таблица при удалении допа.
А вообще смысла нет, достаточно табличку с полученными достижениями очистить
Такс... Собственно, что я сделал:
1. Очистил таблицу achievement_stats
2. Обновил доп
3. Добавил одну запись
Результат. Пользователь получил все необходимые достижения, но в ЛК все также выводиться самое первое достижение из группы.
Скрин таблицы achievement_stats -
Скрин ЛК -