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. Скорее всего, я нагромоздил много лишнего в коде, но всю цепочку как это сделать, выстроить в голове у меня нормально не вышло.