用BuddyPress搭建社区/博客系统,总结一些实用代码

最近两周一直在忙一个基于BuddyPress的项目,从选定BuddyPress,到项目上线,中间踩了不少原本不曾料想的坑,争取尽可能多的总结出来。

首先,和WooCommerce一样,要对BuddyPress进行主题定制,就要先在自己主题根目录下新建一个buddypress.php的模板,所有外围框架样式都可以往这个模板上堆,这里就不扩展了。

其次,如需要对BuddyPress的主题、结构等做更多定制,就要在主题根目录下新建一个buddypress文件夹,把插件目录\plugins\buddypress\bp-templates\bp-legacy\buddypress内的所有文件都复制进来;另外还要把\plugins\buddypress\bp-templates\bp-legacy\css下的buddypress.css复制到主题的css文件夹下;如果你是基于WP自带主题,比如twentyeleven开发的,还需要把twentyeleven.css放到主题的css文件夹下,并且重命名为buddypress-twentyeleven.css。

以上步骤一个都不能漏,否则等着踩更多的坑吧。

下面先贴一些开发过程中找到或者自己总结、修改的一些实用函数,基本都可以写入主题的function.php。值得一提的是,Google能搜到的很多代码是不可用的,也包括BuddyPress官方网站的部分多年前的帖子,BP应该是经历过一些较大的更新,所以如果要确认代码是否可用,最好到这个网站http://buddypress.wp-a2z.org/ 去查一下是其中的函数/钩子等名称是否有效。

设置默认的封面图片和尺寸

BP默认的用户中心封面图片是一片灰色的空白区域,不是所有用户都热衷于自定义这张图片的,所以还是给懒人们安排一张默认图片为好:

1
2
3
4
5
6
7
8
function your_theme_xprofile_cover_image( $settings = array() ) {
	$settings['width']  = 1180;
	$settings['height'] = 170;
	$settings['default_cover'] = get_template_directory_uri().'/images/default_cover_image.jpg';
	return $settings;
}
add_filter( 'bp_before_xprofile_cover_image_settings_parse_args', 'your_theme_xprofile_cover_image', 10, 1 );
add_filter( 'bp_before_groups_cover_image_settings_parse_args', 'your_theme_xprofile_cover_image', 10, 1 );

修改默认用户头像

同样,不是所有用户都喜欢上传头像的,为了不使版面变得混乱,也可以给用户默认一个头像。

1
2
3
4
5
6
7
8
9
//首先要把Gavatar头像禁用掉
add_filter( 'bp_core_fetch_avatar_no_grav', '__return_true' );
 
//定义默认头像
function bp_custom_set_avatar_constants() {
	define ( 'BP_AVATAR_DEFAULT', get_template_directory_uri().'/images/default_avata.jpg' );
	define ( 'BP_AVATAR_DEFAULT_THUMB', get_template_directory_uri().'/images/default_avata.jpg' );
}
add_action( 'bp_init', 'bp_custom_set_avatar_constants', 2 );

判断用户是否上传了自己的头像

如果没有,可以自定义一些东西提示用户上传头像,很有用

1
2
3
4
bp_get_user_has_avatar( bp_loggedin_user_id() ); //判断当前登录的用户是否有头像
bp_get_user_has_avatar( bp_get_activity_user_id() ) ); //判断循环中的用户是否有头像
 
bp_activity_user_id(); //这个函数会直接输出循环中的用户ID

修改用户登录后的跳转页面

在某些时候我们并不希望用户看到WP后台,甚至不希望用户察觉网站是WP做的。但无论是管理员还是普通用户,登录后都会默认跳转到后台。以下代码定义登录后的跳转页面。

1
2
3
4
5
6
7
8
9
10
11
function bp_brain1981_redirect_to_profile( $redirect_to_calculated, $redirect_url_specified, $user ){
	if( empty( $redirect_to_calculated ) )
		$redirect_to_calculated=$redirect_url_specified;
 
	if( !is_super_admin( $user->ID ) )
		//return bp_core_get_user_domain( $user->ID ) . 'profile/';
		return bp_core_get_user_domain( $user->ID );//bp默认的用户中心首页
	else
		return $redirect_to_calculated; /*if site admin or not logged in,do not do anything much*/
}
add_filter("login_redirect","bp_brain1981_redirect_to_profile",100,3);

*使用以上代码的前提是我们还需要自己定制bp的登录页面、找回密码页面,这些我今后会另外开贴总结。

隐藏顶部导航条

既然要把后台藏起来,那么顶部那根黑色导航条自然也是不能出现的,在非管理员的状态下要藏起来。

1
2
3
4
5
function bp_brain1981_remove_admin_bar() {
	if( !is_super_admin() ) 
		add_filter( 'show_admin_bar', '__return_false' );
}
add_action('wp', 'bp_brain1981_remove_admin_bar');

过滤首页的消息流/帖子

BP默认会把用户状态、用户自己的信息修改(比如改了个头像、改了个自我介绍等)都显示在首页,这样真正有用的帖子就会很快被冲下去,我们在首页要把消息流过滤一下。以下代码还可以定制排序、过滤评价等,见注释掉的部分

1
2
3
4
5
6
7
8
9
10
11
function bp_brain1981_filtering_activity( $retval ) {
    if ( !bp_is_user_activity() ) {//只在首页过滤,在用户中心不过滤
    	$retval['action'] = 'activity_update';
		//$retval['action'] = 'activity_update';//activity_update,profile_updated/new_forum_post/new_blog_post
		//$retval['sort'] = 'ASC'; //default DESC
		//$retval['display_comments'] = false;
		//$retval['per_page'] = 5;//change the number of activity
	}
	return $retval;
    }	
add_filter( 'bp_after_has_activities_parse_args', 'bp_brain1981_filtering_activity' );

给用户中心某个模块增加子模块

以下代码是在settings中增加了一个名为“My Own Setting”的子模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function brain1981_buddypress_tab() {
	global $bp;
	bp_core_new_subnav_item( array( 
		'name' => __( 'My Own Setting', 'buddypress_login' ), 
		'slug' => 'email-pwd',
		'parent_url' => $bp->loggedin_user->domain . $bp->bp_nav['settings']['slug'] . '/',
		'parent_slug' => $bp->bp_nav['settings']['slug'],
		'position' => 100,
		'screen_function' => 'brain1981_budypress_recent_posts',
		'show_for_displayed_user' => true,
		'item_css_id' => 'brain1981_budypress_recent_posts'
	) );
}
add_action( 'bp_setup_nav', 'brain1981_buddypress_tab', 1000 );
 
function brain1981_budypress_recent_posts () {
	add_action( 'bp_template_title', 'brain1981_buddypress_recent_posts_title' );
	add_action( 'bp_template_content', 'brain1981_buddypress_recent_posts_content' );
	bp_core_load_template(  get_template_directory_uri().'/buddypress/members/single/settings.php'  );
}
function brain1981_buddypress_recent_posts_title() {
	_e( 'My Own Setting', 'buddypress_login' );
}
function brain1981_buddypress_recent_posts_content() {
	//do something on the sub page
}

本文会陆续修订,待续…

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/1413.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

如本文对你有用,请在页面右侧栏扫码领取我的支付宝红包,作为打赏吧 (喂到底是我赏你还是你赏我啊-_-!)

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

3 关于 “用BuddyPress搭建社区/博客系统,总结一些实用代码” 的评论

  1. Brain 文章作者

    很抱歉,每次用到BP的时候都是临时查官方文档和用谷歌搜索可用的代码,至今我还没有时间去分析这套系统,因此无法做什么讲解
    如果你有问题建议用谷歌或去官方论坛搜索关键字,BP的答案资源在国外还是非常多的。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注