/ Wordpress / Связь записей с пользователями (список участников)

Связь записей с пользователями (список участников)

26.06.2021

793

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

Создание поля Участники

// Участники Видео
add_action('add_meta_boxes', 'participant_box');
function participant_box() { add_meta_box('participant_block', 'Участники Видео', 'participant_box_func', array('post','page','event','news','movie','codex'), 'normal', 'high'); }

function participant_box_func($post){
	$post_participant = get_post_meta($post->ID, 'post_participant', 1);
	?>
	<input type="text" style="width: 50%;" name="post_participant" value="<?php if($post_participant){echo $post_participant;}?>" placeholder="ID пользователей" /><br><br>
	<span class="description"><?php _e("Прописать через запятую ID пользователей."); ?></span>
	<?php
}

В данное поле через запятую указываются ID участвующих в записи пользователей.

Функция сохранения поля

При сохранении поля мы будем также сохранять данные и в метаполе пользователей

// Сохранение связей постов с пользователями
$participant = get_post_meta( $post_id, 'post_participant', true );

//если значение сохраненного и текущего НЕ совпадают
if ($participant != $_POST['post_participant']) {
	
	if ( empty($participant) ) { //если значение сохраненного = 0 а текущего имеет значение
		
		$participant_users = explode(",", $_POST['post_participant']);
		foreach($participant_users as $participant_user){
			
			$related_records = get_user_meta( $participant_user, 'related_records', true );
			
			if ( !empty($related_records) ) {
				
				$related_records_array = explode(",", $related_records);
				
				if (in_array($post_id, $related_records_array)) { //Если в поле уже записан такой ID то пропускаем
				
				} else { //Если в поле нет такого ID то добавляем
				
					$related_records = get_user_meta( $participant_user, 'related_records', true ); //последний параметр имеет важное значение!
					$related_records_add = $related_records.','.$post_id;
					update_user_meta( $participant_user, 'related_records', $related_records_add );
					unset($related_records_add);
				}
				
			} else {
				update_user_meta( $participant_user, 'related_records', $post_id );
			}
			
		}

		update_post_meta($post_id, 'post_participant', $_POST['post_participant']);
		
	} elseif ( empty($_POST['post_participant']) ) { //если значение сохраненного имеет значение а текущего = 0
		
		$participant_users = explode(",", $participant);
		foreach($participant_users as $participant_user){
			
			$related_records = get_user_meta( $participant_user, 'related_records', true );
			$related_records_array = explode(",", $related_records);
			
			if (in_array($post_id, $related_records_array)) { //Если в поле уже записан такой ID то удаляем
				$related_records_array_minus = array_diff( $related_records_array, array($post_id) );
				$related_records_str = implode(',', $related_records_array_minus);
				
				if ( empty($related_records_str) ) {
					delete_user_meta( $participant_user, 'related_records' );
				} else {
					update_user_meta( $participant_user, 'related_records', $related_records_str );
				}
					
				unset($related_records_str);
				
			} else { //Если в поле нет такого ID то пропускаем
			
			}				
			
		}

		update_post_meta($post_id, 'post_participant', $_POST['post_participant']);
		
		
	} else { //если значение сохраненного и текущего имеют разные значения
		
		$participant_old_users = explode(",", $participant);
		$participant_new_users = explode(",", $_POST['post_participant']);

		// Получить разницу в массивах, кто убавился
		$participant_old_compare_users = array_diff($participant_old_users, $participant_new_users);
		
		// Получить разницу в массивах, кто прибавился
		$participant_new_compare_users = array_diff($participant_new_users, $participant_old_users);
		
		
		if (!empty($participant_old_compare_users)) {
			
			// Пройти по тем которые убавились
			foreach($participant_old_compare_users as $participant_user){
				
				$related_records = get_user_meta( $participant_user, 'related_records', true );
				$related_records_array = explode(",", $related_records);
				
				if (in_array($post_id, $related_records_array)) { //Если в поле уже записан такой ID то удаляем
					$related_records_array_minus = array_diff( $related_records_array, array($post_id) );
					$related_records_str = implode(',', $related_records_array_minus);
					
					if ( empty($related_records_str) ) {
						delete_user_meta( $participant_user, 'related_records' );
					} else {
						update_user_meta( $participant_user, 'related_records', $related_records_str );
					}
						
					unset($related_records_str);
					
				} else { //Если в поле нет такого ID то пропускаем
				
				}
				
			}				
			
		}
		
		if (!empty($participant_new_compare_users)) {

			// Пройти по тем которые прибавились
			foreach($participant_new_compare_users as $participant_user){
				
				$related_records = get_user_meta( $participant_user, 'related_records', true );
				
				if ( !empty($related_records) ) {
					
					$related_records_array = explode(",", $related_records);
					
					if (in_array($post_id, $related_records_array)) { //Если в поле уже записан такой ID то пропускаем
					
					} else { //Если в поле нет такого ID то добавляем
					
						$related_records = get_user_meta( $participant_user, 'related_records', true ); //последний параметр имеет важное значение!
						$related_records_add = $related_records.','.$post_id;
						update_user_meta( $participant_user, 'related_records', $related_records_add );
						unset($related_records_add);
					}
					
				} else {
					update_user_meta( $participant_user, 'related_records', $post_id );
				}
				
			}
		
		}

		update_post_meta($post_id, 'post_participant', $_POST['post_participant']);
		
	}
	
} else {
	//если значение сохраненного и текущего Cовпадают
}

Данную конструкцию можно поместить в общую функцию сохранения кастомных полей

// Cохранение полей записи

add_action('save_post', 'all_box_update');
function all_box_update($post_id){
	
	// Общее сохранение метаполей
	if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // Проверка, что это не автосохранение
	if (!current_user_can('edit_post', $post_id)) return false; // Проверка, что пользователь может изменять этот пост
	if (!isset($_POST['extra']) ) return false;	// Проверка, что нам пришли все поля
	
	// Сохранение связей постов с пользователями
	
		
	// Общее сохранение полей
	foreach($_POST['extra'] as $key=>$value){ // Циклом добавляем поля
		if (empty($value)) { delete_post_meta($post_id, $key); }
		else { update_post_meta($post_id, $key, $value); }
	}
	
}

или написать аналогичную и привязать к той же функции save_post.

Вывод участников в записи

<div class="participant">

	<?php $participant = get_post_meta($post->ID, 'post_participant', true); 
	if ( !empty($participant) ) {
		
		echo '<h2>Участники</h2>';
		echo '<div class="directors-list">';

		$args = array( 'include' => $participant );

		// The Query
		$user_query = new WP_User_Query( $args );

		// User Loop
		if ( ! empty( $user_query->get_results() ) ) {

			foreach ( $user_query->get_results() as $user ) {

				$key = 'user_position';
				$state_meta_for_user = get_user_meta( $user->ID, $key, true ); // должность
				?>
				
				<div class="persone"><a href="/polzovateli/<?php echo $user->user_login; ?>/biography/">
					<div class="photo"><div><?php echo get_avatar($user->ID, 150); ?></div></div>
					<p class="title"><?php echo $user->display_name; ?></p>
				</a></div>

			<?php } 
			
		}
		
		echo '</div>';

	} ?>
	
</div>

Вывод записей участника

Данный код будет работать во вкладке BuddyPress

<?php $related_records = get_user_meta( bp_displayed_user_id(), 'related_records', true );
$related_records_array = explode(",", $related_records);

$args = array (
	'post_type' => 'any',
	'posts_per_page' => -1,
	'post__in' => $related_records_array,
);

query_posts($args);
	if (have_posts()) :
	echo '<ul class="related_records">';
	while (have_posts()) : the_post(); ?>
		<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php endwhile;
	echo '</ul>';
endif; wp_reset_query(); ?>

Если нужно вывести данные по ID текущего профиля без BuddyPress, то нужно определить ID пользователя вместо bp_displayed_user_id():

<?php global $current_user;
echo $current_user->user_id; ?>
[site-socialshare]
  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

Связь записей с пользователями (список участников)
Watermark для изображений
Рекомендации для васWatermark для изображенийOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.