Предположим что сайт состоит из некоторого количества пользователей а также из медиаматериалов в которых данные пользователи участвуют. Так вот, чтобы привязать к записям пользователей и наоборот у пользователей выводить записи в которых они участвуют, создадим такой функционал.
Создание поля Участники
// Участники Видео
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]