/ Плагины / BuddyPress: Создаем соц. сеть

BuddyPress: Создаем соц. сеть

27.05.2021

222

Создадим социальную сеть с помощью мощного решения 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>

Если добавить начинают работать. Но это конечно не правильное по сути решение, т.к. данная оболочка дублируется ниже в шаблоне.

Поделиться в соц. сетях:

  • Комментарии
  • Вложения

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

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

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