@Bearax

Как сделать то же самое к другой роли пользователя?

Здравствуйте. Есть сайт на WP. На нем с использованием ACF и самописного плагина установлен чат между двумя ролями пользователя(Например: Ученик и Учитель). Есть несколько предметов(Математика, Физика и.т.д.) Когда ученик пишет учителю у него на чате показывается счетчик непрочитанных сообщений. Я нашел код, который отвечает за этот вывод, но никак не могу прописать это в обратную сторону, чтобы и у учеников был такой счетчик непрочитанных сообщений.
Код, который нужно сделать также как внизу:
if(in_array("ucenik",$user_meta->roles)) {
                $aservices = $this->get_field_choices('direction');
              	$cservices = Array();
                $ucitelya= Array();
              
              	if( have_rows('ucitelya', 'user_' . $this->user_id) ) {
                    while( have_rows('ucitelya', 'user_' . $this->user_id) ) {
                        the_row();
                        $cservices[] = get_sub_field('direction');
                      	$ucitelya[get_sub_field('direction')] = [
                      		'user' => get_userdata(get_sub_field('ucitel')),
                      		'contract' => get_sub_field('contract')
							
                      	];
						                    }
                }
                require_once ('partials/school-public-services.php'); 
             
            }


Код 2: который уже выводит этот счетчик:
else if(in_array("ucitel",$user_meta->roles)) {
                $uceniki= [];
                $args = array(
                    'role'    => 'ucenik',
                    'orderby' => 'user_nicename',
                    'order'   => 'ASC'
                );
                $users = get_users( $args );
                global $wpdb;
                foreach ($users as $user) {
                    if( have_rows('ucitelya', 'user_' . $user->ID) ) {
                        while (have_rows('ucitelya', 'user_' . $user->ID)) {
                            the_row();
                            if(get_sub_field('ucitel') == get_current_user_id()) {
                                $total = $wpdb->get_row( "
                                      SELECT COUNT(id) as total
                                      FROM  `wp_school_chat`
                                      WHERE service LIKE '".get_sub_field('direction')."' AND sender = '".$user->ID."' AND recipient = '".get_current_user_id()."' AND is_read = 0
                                ");

                                $uceniki[get_sub_field('direction')][] =  [
                                    'ucenik' => get_userdata($user->ID),
                                    'total' => $total->total
                                ];
                            }
                        }
                    }
                }
                require_once ('partials/school-public-chats.php');
            }
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
Добрый день!
Увы, давно не занимаюсь разработкой на Wordpress.
Замечу, что делать чат на http очень плохая идея. Лучше поднять чат на сокетах или же как вариант подключить сторонний сервис (например, jivochat).
На ваш вопрос в силу того, что он вырван из контекста смогу ответить общими словами.
Во-первых, вам нужно проитерировать по списку учеников, а затем выполнить для каждого из них sql запрос в БД.
Насколько я понимаю у вас используется ACF Repeater.
if( have_rows('ucitelya', 'user_' . $user->ID) ) {
                        while (have_rows('ucitelya', 'user_' . $user->ID)) {

Соответственно, вам нужно создать новый repeater для учеников. Т.е. вместо ucitelya передать уже учеников.
Далее на этом уровне тоже подправить sql запрос, чтобы он делал выборку и возвращал количество непрочитанных для каждого из учеников
$total = $wpdb->get_row( "
                                      SELECT COUNT(id) as total
                                      FROM  `wp_school_chat`
                                      WHERE service LIKE '".get_sub_field('direction')."' AND sender = '".$user->ID."' AND recipient = '".get_current_user_id()."' AND is_read = 0
                                ");

В общем, надо продебажить проект. Посмотреть что возвращает каждый из ваших полей в указанном вами коде, а затем уже добавить новый функционал. Увы, со стороны сложно что-то конкретное ответить
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы