WordPress Сортировка по терму, выводящая пользователя и записи

Помогите решить задачу, уже запутался окончательно.

Есть список пользователей, у каждого из которых в мета-поле хранится сериализованный массив с ID записями кастомного пост тайпа.

Пример - user ID 1281 У него в мета-поле 'user_curators' хранится:

s:62:"a:4:{i:0;s:3:"149";i:1;s:3:"213";i:2;s:3:"225";i:3;s:3:"244";}";

149, 213.. ID постов.

На всякий случай я сделал такое же, но обратное по смыслу мета поле для кастомного пост-тайпа ('post_curators'): массив с IDшниками пользователей, который закреплены за определенным постом.

s:38:"a:3:{i:0;i:1188;i:1;i:851;i:2;i:1246;}";

где 1188, 851 ID пользовтелей.

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

Фильтрацию сделать получилось, аяксом в обработчик передается ID выбранного терма, но вывести подборку пользователей с постами этого терма у меня никак не получается.

Пример кода:

function gr_filter_by_terms() {
    // Получаем ID терма аяксом
    $term_id = esc_sql( $_POST['search_val'] );

    // Получаем список пользователей
    $query = get_users(
        array(
            'role'       => 'curators',
            'meta_query' => array(
                array(
                    'key'     => 'user_curators',
                    'compare' => 'EXISTS'
                ),
            )
        ) );

    $i = 1;

    foreach ( $query as $users ) {
        $user = get_user_by( 'id', $users->ID );

        $name   = $user->display_name;
        $avatar = get_avatar( $users->ID, $size = 184, 'mystery' );

        $user_organization = get_user_meta( $users->ID )['organisation'][0];
        
        $position = get_user_meta( $users->ID )['user_title'][0];
    
        
        $user_bio = get_user_meta(  $users->ID )['curator_bio'][0];
    

        // Вывод пользователя
        echo 'echo '<div class="curator-avatar">
       <div class="curator-section__left">
           ' . $avatar . '
       </div>
       <div class="name"><span class="curator__name">' . $name . '</span>                       
           <div class="curator__info">
               <div class="curator__text">
                   <p>' . $user_bio . '</p>
               </div>
               <span class="curators__close">Close</span>
            </div>
       </div>           
    </div>
    <div class="curator-section__right">';

    // Вывод постов пользователя (берём мета-данные юзера)
    $users_curators = array_values( unserialize( get_user_meta( $users->ID, 'user_curators', true ) ) );

       
        // Группировка по дате постов
        $out = array();
        foreach ( $users_curators as $kk => $vv ) {
            $out[] = get_post_meta( $vv, 'post_from_day', true );
        }
        foreach ( array_unique( $out ) as $row_date ) {
            $args = array(
                'post_type' => 'lym_post',
                'post__in'  => $users_curators,
                'meta_query' => array(
                    'relation'  => 'AND',
                    array(
                        'key'     => 'post_from_day',
                        'value'   => $row_date,
                        'compare' => 'EXIST',
                    ),
                ),
                // Тут сортировка по Терму
                'tax_query' => array(
                    'relation'  => 'AND',
                    array(
                        'taxonomy'     => 'theme',
                        'field'   => 'id',
                        'terms' => $term_id,
                        'operator' => 'IN'
                    ),
                )
            );

            $loop = new WP_Query( $args );

            $out = '';


            while ( $loop->have_posts() ) :
                $loop->the_post();
                // просто вывод ID
                echo get_the_id() . ', ';
            endwhile;
        }


        echo '</div>
              </div>';
        $i ++;
    }
    echo '</div>';
}

add_action('wp_ajax_lym_term_search', 'gr_filter_by_terms');
add_action('wp_ajax_nopriv_lym_term_search', 'gr_filter_by_terms');

В моём примере по прежнему выводятся все пользователи, а вот посты только у которых совпадает терм. А нужно чтобы выводились только те пользователи, у которых есть эти самые посты с совпадающим термом

P.S. Скорее всего, я нагромоздил много лишнего в коде, но всю цепочку как это сделать, выстроить в голове у меня нормально не вышло.


Ответы (0 шт):