Создадим социальную сеть с помощью мощного решения BuddyPress.
Чтобы создать собственный шаблон BuddyPress необходимо, аналогично Woocommerce, создать внутри темы директорию buddypress. В которую скопировать содержимое любого из шаблонов из папки buddypress\bp-templates\bp-legacy\buddypress. Также нужно в корне темы создать файл buddypress.php в котором будет верстка шаблона BuddyPress.
Чтобы назначить BuddyPress свои стили, необходимо в локальной папке buddypress создать папку css и поместить в нее файл buddypress.min.css.
Создать собственную вкладку в BuddyPress
// Вкладка Биография
function profile_tab_biography() {
global $bp;
bp_core_new_nav_item( array(
'name' => 'Биография',
'slug' => 'biography',
'screen_function' => 'biography_screen',
'position' => 40,
'parent_url' => bp_loggedin_user_domain() . '/biography/',
'parent_slug' => $bp->profile->slug,
'default_subnav_slug' => 'biography'
) );
}
add_action( 'bp_setup_nav', 'profile_tab_biography' );
function biography_screen() {
// Add title and content here - last is to call the members plugin.php template.
add_action( 'bp_template_title', 'biography_title' );
add_action( 'bp_template_content', 'biography_content' );
bp_core_load_template( 'buddypress/members/single/plugins' );
}
function biography_title() { echo 'Биография'; }
function biography_content() {
//global $current_user;
$user_description = get_the_author_meta( 'user_description', bp_displayed_user_id() );
echo wpautop( $user_description );
}
Вкладка которая открывается первой
Необходимо прописать в wp-config.php
define('BP_DEFAULT_COMPONENT', 'activity' );
Заменить имя пользователя в профиле
По умолчанию в профиле пользователя под фотографией с @ отображается user_name, если нужно заменить его на display name, нужно в локальном шаблоне buddypress в файле /buddypress/members/single/member-header.php заменить значение
<h2 class="user-nicename">@<?php bp_displayed_user_mentionname(); ?></h2>
на пользвательское, например с функцией:
function get_display_name($user_id) {
if (!$user = get_userdata($user_id))
return false;
return $user->data->display_name;
}
<h2 class="user-nicename"><?php echo get_display_name(bp_displayed_user_id()); ?></h2>
Полезные «фишки» при редактировании пользователей
Сохранение тегов html в полях учетной записи:
// Сохранение тегов в полях пользователя (Биография)
remove_filter('pre_user_description', 'wp_filter_kses');
Изменить размер аватара
// Изменить размер аватара
//if ( ! defined( 'BP_AVATAR_THUMB_WIDTH' ) ) define( 'BP_AVATAR_THUMB_WIDTH', 50 );
//if ( ! defined( 'BP_AVATAR_THUMB_HEIGHT' ) ) define( 'BP_AVATAR_THUMB_HEIGHT', 50 );
if ( ! defined( 'BP_AVATAR_FULL_WIDTH' ) ) define( 'BP_AVATAR_FULL_WIDTH', 205 );
if ( ! defined( 'BP_AVATAR_FULL_HEIGHT' ) ) define( 'BP_AVATAR_FULL_HEIGHT', 205 );
Проверка что профиль текущего пользователя:
<?php if (bp_is_my_profile()): ?>
Профиль текущего пользователя
<?php endif; ?>
Вывод пользователей
Вывод пользователей по значению произвольного поля
<?php $args = array( 'meta_key' => 'user_position', 'meta_value' => 'Директор 11 уровня', 'orderby' => 'meta_value', 'order' => 'ASC' );
// 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>
<div class="online-status">
<div class="dot"></div>
<div class="status">в сети</div>
</div>
<p class="title"><?php echo $user->display_name; ?></p>
</a></div>
<?php }
} else {
echo 'No users found.';
} ?>
Количество полных лет пользователя
Выведем по произвольному полю Дата рождения количество полных лет пользователя.
// Количество полных лет
function number_complete_years($date) {
$date_clear = date("d.m.Y", strtotime($date));
$date_a = new DateTime($date_clear);
$date_b = new DateTime();
$interval = $date_b->diff($date_a);
$skolko_let = plural_form_3( $interval->format("%Y"), array(' год',' года',' лет') );
$nodate = "00";
if ($skolko_let == $nodate) {
echo "_";
} elseif ($skolko_let <> $nodate) {
echo "$skolko_let";
}
}
function plural_form_3($number, $after) {
$cases = array (2, 0, 1, 1, 1, 2);
echo $number.$after[ ($number%100>4 && $number%100<20)? 2: $cases[min($number%10, 5)] ];
}
Выводится в шаблоне buddypress так:
$user_date_birth = get_user_meta( bp_displayed_user_id(), 'user_date_birth', true );
number_complete_years($user_date_birth);
Индикатор активности
Создадим функцию отображения активности пользователя в виде индикатора «в сети», «не в сети», вместо стандартного отображения «4 минуты назад».
// Вывод статуса активности
function status_indicator($user_id) {
$last_activity = get_user_meta( $user_id, 'last_activity', true );
$date_a = new DateTime($last_activity);
$date_b = new DateTime();
$since_start = $date_b->diff($date_a);
/*echo $since_start->days.' days total<br>';
echo $since_start->y.' years<br>';
echo $since_start->m.' months<br>';
echo $since_start->d.' days<br>';
echo $since_start->h.' hours<br>';
echo $since_start->i.' minutes<br>';
echo $since_start->s.' seconds<br>';*/
$minutes = $since_start->days * 24 * 60;
$minutes += $since_start->h * 60;
$minutes += $since_start->i;
if ($minutes <= 5) {
$online_status = 'status_online';
$online_status_text = 'в сети';
} elseif ($minutes <= 60) {
$online_status = 'status_recently';
$online_status_text = 'был недавно';
} else {
$online_status = 'status_offline';
$online_status_text = 'не в сети';
}
echo '
<div class="online-status '.$online_status.'">
<div class="dot"></div>
<div class="status">'.$online_status_text.'</div>
</div>
';
}
В шаблоне buddypress выводится так:
<?php status_indicator(bp_displayed_user_id()); ?>
Вкладка Группы
Данная вкладка должна иметь отдельный шаблон, отличный от шаблона профиля, т.к. в нем не будет работать навигация по профилю.
Даже при включенной настройке Разрешить создание групп всем пользователям кнопка Создать группу не появляется. Добавить кнопку можно вручную в шаблон buddypress/members/single/groups.php:
<span class="create-a-group"><?php echo bp_get_group_create_button() ?></span>
Отключить функционал Избранное
function buddydev_hide_favourite_button() {
return false;
}
add_filter('bp_activity_can_favorite', 'buddydev_hide_favourite_button' );
Все пользователи
Данный раздел также должен иметь отдельный шаблон.
Друзья
Кнопка Добавить в друзья не срабатывает из за того что вынесена за пределы тела шаблона buddypress.
Это происходит из-за отсутствия оболочки кнопок bp_nouveau_member_header_buttons
<div id="buddypress"><div id="item-header" role="complementary" data-bp-item-id="<?php echo esc_attr( bp_displayed_user_id() ); ?>" data-bp-item-component="members">
</div></div>
Если добавить начинают работать. Но это конечно не правильное по сути решение, т.к. данная оболочка дублируется ниже в шаблоне.
[site-socialshare]