1 | <?php |
---|
2 | |
---|
3 | /** |
---|
4 | * bbPress BuddyPress Group Extension Class |
---|
5 | * |
---|
6 | * This file is responsible for connecting bbPress to BuddyPress's Groups |
---|
7 | * Component. It's a great example of how to perform both simple and advanced |
---|
8 | * techniques to manipulate bbPress's default output. |
---|
9 | * |
---|
10 | * @package bbPress |
---|
11 | * @subpackage BuddyPress |
---|
12 | * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed |
---|
13 | */ |
---|
14 | |
---|
15 | // Exit if accessed directly |
---|
16 | if ( !defined( 'ABSPATH' ) ) exit; |
---|
17 | |
---|
18 | if ( !class_exists( 'BBP_Forums_Group_Extension' ) && class_exists( 'BP_Group_Extension' ) ) : |
---|
19 | /** |
---|
20 | * Loads Group Extension for Forums Component |
---|
21 | * |
---|
22 | * @since bbPress (r3552) |
---|
23 | * |
---|
24 | * @package bbPress |
---|
25 | * @subpackage BuddyPress |
---|
26 | * @todo Everything |
---|
27 | */ |
---|
28 | class BBP_Forums_Group_Extension extends BP_Group_Extension { |
---|
29 | |
---|
30 | /** Methods ***************************************************************/ |
---|
31 | |
---|
32 | /** |
---|
33 | * Setup bbPress group extension variables |
---|
34 | * |
---|
35 | * @since bbPress (r3552) |
---|
36 | */ |
---|
37 | public function __construct() { |
---|
38 | $this->setup_variables(); |
---|
39 | $this->setup_actions(); |
---|
40 | $this->setup_filters(); |
---|
41 | $this->maybe_unset_forum_menu(); |
---|
42 | } |
---|
43 | |
---|
44 | /** |
---|
45 | * Setup the group forums class variables |
---|
46 | * |
---|
47 | * @since bbPress () |
---|
48 | */ |
---|
49 | private function setup_variables() { |
---|
50 | |
---|
51 | // Component Name |
---|
52 | $this->name = __( 'Forum', 'bbpress' ); |
---|
53 | $this->nav_item_name = __( 'Forum', 'bbpress' ); |
---|
54 | // $this->nav_item_name = __( 'Discussions', 'bbpress' ); |
---|
55 | |
---|
56 | $this->nav_item_name = apply_filters('bbp_update_nav_item_title', $this->nav_item_name); |
---|
57 | $this->name = apply_filters('bbp_update_forum_name', $this->name); |
---|
58 | |
---|
59 | // Component slugs (hardcoded to match bbPress 1.x functionality) |
---|
60 | $this->slug = 'forum'; |
---|
61 | $this->topic_slug = 'topic'; |
---|
62 | $this->reply_slug = 'reply'; |
---|
63 | |
---|
64 | // Forum component is visible |
---|
65 | $this->visibility = 'public'; |
---|
66 | |
---|
67 | // Set positions towards end |
---|
68 | $this->create_step_position = 15; |
---|
69 | $this->nav_item_position = 10; |
---|
70 | |
---|
71 | // Allow create step and show in nav |
---|
72 | $this->enable_create_step = true; |
---|
73 | $this->enable_nav_item = true; |
---|
74 | $this->enable_edit_item = true; |
---|
75 | |
---|
76 | // Template file to load, and action to hook display on to |
---|
77 | $this->template_file = 'groups/single/plugins'; |
---|
78 | $this->display_hook = 'bp_template_content'; |
---|
79 | } |
---|
80 | |
---|
81 | /** |
---|
82 | * Setup the group forums class actions |
---|
83 | * |
---|
84 | * @since bbPress (r4552) |
---|
85 | */ |
---|
86 | private function setup_actions() { |
---|
87 | |
---|
88 | // Possibly redirect |
---|
89 | add_action( 'bbp_template_redirect', array( $this, 'redirect_canonical' ) ); |
---|
90 | |
---|
91 | // Remove group forum cap map when view is done |
---|
92 | add_action( 'bbp_after_group_forum_display', array( $this, 'remove_group_forum_meta_cap_map' ) ); |
---|
93 | |
---|
94 | // bbPress needs to listen to BuddyPress group deletion. |
---|
95 | add_action( 'groups_before_delete_group', array( $this, 'disconnect_forum_from_group' ) ); |
---|
96 | |
---|
97 | // Adds a bbPress metabox to the new BuddyPress Group Admin UI |
---|
98 | add_action( 'bp_groups_admin_meta_boxes', array( $this, 'group_admin_ui_edit_screen' ) ); |
---|
99 | |
---|
100 | // Saves the bbPress options if they come from the BuddyPress Group Admin UI |
---|
101 | add_action( 'bp_group_admin_edit_after', array( $this, 'edit_screen_save' ) ); |
---|
102 | |
---|
103 | // Adds a hidden input value to the "Group Settings" page |
---|
104 | add_action( 'bp_before_group_settings_admin', array( $this, 'group_settings_hidden_field' ) ); |
---|
105 | } |
---|
106 | |
---|
107 | /** |
---|
108 | * Setup the group forums class filters |
---|
109 | * |
---|
110 | * @since bbPress (r4552) |
---|
111 | */ |
---|
112 | private function setup_filters() { |
---|
113 | |
---|
114 | // Group forum pagination |
---|
115 | add_filter( 'bbp_topic_pagination', array( $this, 'topic_pagination' ) ); |
---|
116 | add_filter( 'bbp_replies_pagination', array( $this, 'replies_pagination' ) ); |
---|
117 | |
---|
118 | // Tweak the redirect field |
---|
119 | add_filter( 'bbp_new_topic_redirect_to', array( $this, 'new_topic_redirect_to' ), 10, 3 ); |
---|
120 | add_filter( 'bbp_new_reply_redirect_to', array( $this, 'new_reply_redirect_to' ), 10, 3 ); |
---|
121 | |
---|
122 | // Map forum/topic/replys permalinks to their groups |
---|
123 | add_filter( 'bbp_get_forum_permalink', array( $this, 'map_forum_permalink_to_group' ), 10, 2 ); |
---|
124 | add_filter( 'bbp_get_topic_permalink', array( $this, 'map_topic_permalink_to_group' ), 10, 2 ); |
---|
125 | add_filter( 'bbp_get_reply_permalink', array( $this, 'map_reply_permalink_to_group' ), 10, 2 ); |
---|
126 | |
---|
127 | // Map reply edit links to their groups |
---|
128 | add_filter( 'bbp_get_reply_edit_url', array( $this, 'map_reply_edit_url_to_group' ), 10, 2 ); |
---|
129 | |
---|
130 | // Map assorted template function permalinks |
---|
131 | add_filter( 'post_link', array( $this, 'post_link' ), 10, 2 ); |
---|
132 | add_filter( 'page_link', array( $this, 'page_link' ), 10, 2 ); |
---|
133 | add_filter( 'post_type_link', array( $this, 'post_type_link' ), 10, 2 ); |
---|
134 | |
---|
135 | // Map group forum activity items to groups |
---|
136 | add_filter( 'bbp_before_record_activity_parse_args', array( $this, 'map_activity_to_group' ) ); |
---|
137 | |
---|
138 | /** Caps **************************************************************/ |
---|
139 | |
---|
140 | // Only add these filters if inside a group forum |
---|
141 | if ( bp_is_single_item() && bp_is_groups_component() && bp_is_current_action( 'forum' ) ) { |
---|
142 | |
---|
143 | // Allow group member to view private/hidden forums |
---|
144 | add_filter( 'bbp_map_meta_caps', array( $this, 'map_group_forum_meta_caps' ), 10, 4 ); |
---|
145 | |
---|
146 | // Group member permissions to view the topic and reply forms |
---|
147 | add_filter( 'bbp_current_user_can_access_create_topic_form', array( $this, 'form_permissions' ) ); |
---|
148 | add_filter( 'bbp_current_user_can_access_create_reply_form', array( $this, 'form_permissions' ) ); |
---|
149 | } |
---|
150 | } |
---|
151 | |
---|
152 | /** |
---|
153 | * The primary display function for group forums |
---|
154 | * |
---|
155 | * @since bbPress (r3746) |
---|
156 | * |
---|
157 | * @param int $group_id ID of the current group. Available only on BP 2.2+. |
---|
158 | */ |
---|
159 | public function display( $group_id = null ) { |
---|
160 | |
---|
161 | // Prevent Topic Parent from appearing |
---|
162 | add_action( 'bbp_theme_before_topic_form_forum', array( $this, 'ob_start' ) ); |
---|
163 | add_action( 'bbp_theme_after_topic_form_forum', array( $this, 'ob_end_clean' ) ); |
---|
164 | add_action( 'bbp_theme_after_topic_form_forum', array( $this, 'topic_parent' ) ); |
---|
165 | |
---|
166 | // Prevent Forum Parent from appearing |
---|
167 | add_action( 'bbp_theme_before_forum_form_parent', array( $this, 'ob_start' ) ); |
---|
168 | add_action( 'bbp_theme_after_forum_form_parent', array( $this, 'ob_end_clean' ) ); |
---|
169 | add_action( 'bbp_theme_after_forum_form_parent', array( $this, 'forum_parent' ) ); |
---|
170 | |
---|
171 | // Hide breadcrumb |
---|
172 | add_filter( 'bbp_no_breadcrumb', '__return_true' ); |
---|
173 | |
---|
174 | $this->display_forums( 0 ); |
---|
175 | } |
---|
176 | |
---|
177 | /** |
---|
178 | * Maybe unset the group forum nav item if group does not have a forum |
---|
179 | * |
---|
180 | * @since bbPress (r4552) |
---|
181 | * |
---|
182 | * @return If not viewing a single group |
---|
183 | */ |
---|
184 | public function maybe_unset_forum_menu() { |
---|
185 | |
---|
186 | // Bail if not viewing a single group |
---|
187 | if ( ! bp_is_group() ) |
---|
188 | return; |
---|
189 | |
---|
190 | // Are forums enabled for this group? |
---|
191 | $checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( bp_get_new_group_id(), 'forum_id' ); |
---|
192 | |
---|
193 | // Tweak the nav item variable based on if group has forum or not |
---|
194 | $this->enable_nav_item = (bool) $checked; |
---|
195 | } |
---|
196 | |
---|
197 | /** |
---|
198 | * Allow group members to have advanced priviledges in group forum topics. |
---|
199 | * |
---|
200 | * @since bbPress (r4434) |
---|
201 | * |
---|
202 | * @param array $caps |
---|
203 | * @param string $cap |
---|
204 | * @param int $user_id |
---|
205 | * @param array $args |
---|
206 | * @return array |
---|
207 | */ |
---|
208 | public function map_group_forum_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) { |
---|
209 | |
---|
210 | switch ( $cap ) { |
---|
211 | |
---|
212 | // If user is a group mmember, allow them to create content. |
---|
213 | case 'read_forum' : |
---|
214 | case 'publish_replies' : |
---|
215 | case 'publish_topics' : |
---|
216 | case 'read_hidden_forums' : |
---|
217 | case 'read_private_forums' : |
---|
218 | if ( bbp_group_is_member() || bbp_group_is_mod() || bbp_group_is_admin() ) { |
---|
219 | $caps = array( 'participate' ); |
---|
220 | } |
---|
221 | break; |
---|
222 | |
---|
223 | // If user is a group mod ar admin, map to participate cap. |
---|
224 | case 'moderate' : |
---|
225 | case 'edit_topic' : |
---|
226 | case 'edit_reply' : |
---|
227 | case 'view_trash' : |
---|
228 | case 'edit_others_replies' : |
---|
229 | case 'edit_others_topics' : |
---|
230 | if ( bbp_group_is_mod() || bbp_group_is_admin() ) { |
---|
231 | $caps = array( 'participate' ); |
---|
232 | } |
---|
233 | break; |
---|
234 | |
---|
235 | // If user is a group admin, allow them to delete topics and replies. |
---|
236 | case 'delete_topic' : |
---|
237 | case 'delete_reply' : |
---|
238 | if ( bbp_group_is_admin() ) { |
---|
239 | $caps = array( 'participate' ); |
---|
240 | } |
---|
241 | break; |
---|
242 | } |
---|
243 | |
---|
244 | return apply_filters( 'bbp_map_group_forum_topic_meta_caps', $caps, $cap, $user_id, $args ); |
---|
245 | } |
---|
246 | |
---|
247 | /** |
---|
248 | * Remove the topic meta cap map, so it doesn't interfere with sidebars. |
---|
249 | * |
---|
250 | * @since bbPress (r4434) |
---|
251 | */ |
---|
252 | public function remove_group_forum_meta_cap_map() { |
---|
253 | remove_filter( 'bbp_map_meta_caps', array( $this, 'map_group_forum_meta_caps' ), 99, 4 ); |
---|
254 | } |
---|
255 | |
---|
256 | /** Edit ******************************************************************/ |
---|
257 | |
---|
258 | /** |
---|
259 | * Show forums and new forum form when editing a group |
---|
260 | * |
---|
261 | * @since bbPress (r3563) |
---|
262 | * @param object $group (the group to edit if in Group Admin UI) |
---|
263 | * @uses is_admin() To check if we're in the Group Admin UI |
---|
264 | * @uses bbp_get_template_part() |
---|
265 | */ |
---|
266 | public function edit_screen( $group = false ) { |
---|
267 | $forum_id = 0; |
---|
268 | $group_id = empty( $group->id ) ? bp_get_new_group_id() : $group->id ; |
---|
269 | $forum_ids = bbp_get_group_forum_ids( $group_id ); |
---|
270 | |
---|
271 | // Get the first forum ID |
---|
272 | if ( !empty( $forum_ids ) ) { |
---|
273 | $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids; |
---|
274 | } |
---|
275 | |
---|
276 | // Should box be checked already? |
---|
277 | $checked = is_admin() ? bp_group_is_forum_enabled( $group ) : bp_get_new_group_enable_forum() || bp_group_is_forum_enabled( bp_get_group_id() ); ?> |
---|
278 | |
---|
279 | <h4><?php esc_html_e( 'Group Forum Settings', 'bbpress' ); ?></h4> |
---|
280 | |
---|
281 | <fieldset> |
---|
282 | <legend class="screen-reader-text"><?php esc_html_e( 'Group Forum Settings', 'bbpress' ); ?></legend> |
---|
283 | <p><?php esc_html_e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p> |
---|
284 | |
---|
285 | <div class="field-group"> |
---|
286 | <div class="checkbox"> |
---|
287 | <label><input type="checkbox" name="bbp-edit-group-forum" id="bbp-edit-group-forum" value="1"<?php checked( $checked ); ?> /> <?php esc_html_e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label> |
---|
288 | </div> |
---|
289 | |
---|
290 | <p class="description"><?php esc_html_e( 'Saying no will not delete existing forum content.', 'bbpress' ); ?></p> |
---|
291 | </div> |
---|
292 | |
---|
293 | <?php if ( bbp_is_user_keymaster() ) : ?> |
---|
294 | <div class="field-group"> |
---|
295 | <label for="bbp_group_forum_id"><?php esc_html_e( 'Group Forum:', 'bbpress' ); ?></label> |
---|
296 | <?php |
---|
297 | bbp_dropdown( array( |
---|
298 | 'select_id' => 'bbp_group_forum_id', |
---|
299 | 'show_none' => __( '(No Forum)', 'bbpress' ), |
---|
300 | 'selected' => $forum_id |
---|
301 | ) ); |
---|
302 | ?> |
---|
303 | <p class="description"><?php esc_html_e( 'Network administrators can reconfigure which forum belongs to this group.', 'bbpress' ); ?></p> |
---|
304 | </div> |
---|
305 | <?php endif; ?> |
---|
306 | |
---|
307 | <?php if ( !is_admin() ) : ?> |
---|
308 | <input type="submit" value="<?php esc_attr_e( 'Save Settings', 'bbpress' ); ?>" /> |
---|
309 | <?php endif; ?> |
---|
310 | |
---|
311 | </fieldset> |
---|
312 | |
---|
313 | <?php |
---|
314 | |
---|
315 | // Verify intent |
---|
316 | if ( is_admin() ) { |
---|
317 | wp_nonce_field( 'groups_edit_save_' . $this->slug, 'forum_group_admin_ui' ); |
---|
318 | } else { |
---|
319 | wp_nonce_field( 'groups_edit_save_' . $this->slug ); |
---|
320 | } |
---|
321 | } |
---|
322 | |
---|
323 | /** |
---|
324 | * Save the Group Forum data on edit |
---|
325 | * |
---|
326 | * @since bbPress (r3465) |
---|
327 | * @param int $group_id (to handle Group Admin UI hook bp_group_admin_edit_after ) |
---|
328 | * @uses bbp_new_forum_handler() To check for forum creation |
---|
329 | * @uses bbp_edit_forum_handler() To check for forum edit |
---|
330 | */ |
---|
331 | public function edit_screen_save( $group_id = 0 ) { |
---|
332 | |
---|
333 | // Bail if not a POST action |
---|
334 | if ( ! bbp_is_post_request() ) |
---|
335 | return; |
---|
336 | |
---|
337 | // Admin Nonce check |
---|
338 | if ( is_admin() ) { |
---|
339 | check_admin_referer( 'groups_edit_save_' . $this->slug, 'forum_group_admin_ui' ); |
---|
340 | |
---|
341 | // Theme-side Nonce check |
---|
342 | } elseif ( ! bbp_verify_nonce_request( 'groups_edit_save_' . $this->slug ) ) { |
---|
343 | bbp_add_error( 'bbp_edit_group_forum_screen_save', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) ); |
---|
344 | return; |
---|
345 | } |
---|
346 | |
---|
347 | $edit_forum = !empty( $_POST['bbp-edit-group-forum'] ) ? true : false; |
---|
348 | $forum_id = 0; |
---|
349 | $group_id = !empty( $group_id ) ? $group_id : bp_get_current_group_id(); |
---|
350 | |
---|
351 | // Keymasters have the ability to reconfigure forums |
---|
352 | if ( bbp_is_user_keymaster() ) { |
---|
353 | $forum_ids = ! empty( $_POST['bbp_group_forum_id'] ) ? (array) (int) $_POST['bbp_group_forum_id'] : array(); |
---|
354 | |
---|
355 | // Use the existing forum IDs |
---|
356 | } else { |
---|
357 | $forum_ids = array_values( bbp_get_group_forum_ids( $group_id ) ); |
---|
358 | } |
---|
359 | |
---|
360 | // Normalize group forum relationships now |
---|
361 | if ( !empty( $forum_ids ) ) { |
---|
362 | |
---|
363 | // Loop through forums, and make sure they exist |
---|
364 | foreach ( $forum_ids as $forum_id ) { |
---|
365 | |
---|
366 | // Look for forum |
---|
367 | $forum = bbp_get_forum( $forum_id ); |
---|
368 | |
---|
369 | // No forum exists, so break the relationship |
---|
370 | if ( empty( $forum ) ) { |
---|
371 | $this->remove_forum( array( 'forum_id' => $forum_id ) ); |
---|
372 | unset( $forum_ids[$forum_id] ); |
---|
373 | } |
---|
374 | } |
---|
375 | |
---|
376 | // No support for multiple forums yet |
---|
377 | $forum_id = (int) ( is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids ); |
---|
378 | } |
---|
379 | |
---|
380 | // Update the group ID and forum ID relationships |
---|
381 | bbp_update_group_forum_ids( $group_id, (array) $forum_ids ); |
---|
382 | bbp_update_forum_group_ids( $forum_id, (array) $group_id ); |
---|
383 | |
---|
384 | // Update the group forum setting |
---|
385 | $group = $this->toggle_group_forum( $group_id, $edit_forum ); |
---|
386 | |
---|
387 | // Create a new forum |
---|
388 | if ( empty( $forum_id ) && ( true === $edit_forum ) ) { |
---|
389 | |
---|
390 | // Set the default forum status |
---|
391 | switch ( $group->status ) { |
---|
392 | case 'hidden' : |
---|
393 | $status = bbp_get_hidden_status_id(); |
---|
394 | break; |
---|
395 | case 'private' : |
---|
396 | $status = bbp_get_private_status_id(); |
---|
397 | break; |
---|
398 | case 'public' : |
---|
399 | default : |
---|
400 | $status = bbp_get_public_status_id(); |
---|
401 | break; |
---|
402 | } |
---|
403 | |
---|
404 | // Create the initial forum |
---|
405 | $forum_id = bbp_insert_forum( array( |
---|
406 | 'post_parent' => bbp_get_group_forums_root_id(), |
---|
407 | 'post_title' => $group->name, |
---|
408 | 'post_content' => $group->description, |
---|
409 | 'post_status' => $status |
---|
410 | ) ); |
---|
411 | |
---|
412 | // Setup forum args with forum ID |
---|
413 | $new_forum_args = array( 'forum_id' => $forum_id ); |
---|
414 | |
---|
415 | // If in admin, also include the group ID |
---|
416 | if ( is_admin() && !empty( $group_id ) ) { |
---|
417 | $new_forum_args['group_id'] = $group_id; |
---|
418 | } |
---|
419 | |
---|
420 | // Run the BP-specific functions for new groups |
---|
421 | $this->new_forum( $new_forum_args ); |
---|
422 | } |
---|
423 | |
---|
424 | // Redirect after save when not in admin |
---|
425 | if ( !is_admin() ) { |
---|
426 | bp_core_redirect( trailingslashit( bp_get_group_permalink( buddypress()->groups->current_group ) . '/admin/' . $this->slug ) ); |
---|
427 | } |
---|
428 | } |
---|
429 | |
---|
430 | /** |
---|
431 | * Adds a metabox to BuddyPress Group Admin UI |
---|
432 | * |
---|
433 | * @since bbPress (r4814) |
---|
434 | * |
---|
435 | * @uses add_meta_box |
---|
436 | * @uses BBP_Forums_Group_Extension::group_admin_ui_display_metabox() To display the edit screen |
---|
437 | */ |
---|
438 | public function group_admin_ui_edit_screen() { |
---|
439 | add_meta_box( |
---|
440 | 'bbpress_group_admin_ui_meta_box', |
---|
441 | _x( 'Discussion Forum', 'group admin edit screen', 'bbpress' ), |
---|
442 | array( $this, 'group_admin_ui_display_metabox' ), |
---|
443 | get_current_screen()->id, |
---|
444 | 'side', |
---|
445 | 'core' |
---|
446 | ); |
---|
447 | } |
---|
448 | |
---|
449 | /** |
---|
450 | * Displays the bbPress metabox in BuddyPress Group Admin UI |
---|
451 | * |
---|
452 | * @since bbPress (r4814) |
---|
453 | * |
---|
454 | * @param object $item (group object) |
---|
455 | * @uses add_meta_box |
---|
456 | * @uses BBP_Forums_Group_Extension::edit_screen() To get the html |
---|
457 | */ |
---|
458 | public function group_admin_ui_display_metabox( $item ) { |
---|
459 | $this->edit_screen( $item ); |
---|
460 | } |
---|
461 | |
---|
462 | /** Create ****************************************************************/ |
---|
463 | |
---|
464 | /** |
---|
465 | * Show forums and new forum form when creating a group |
---|
466 | * |
---|
467 | * @since bbPress (r3465) |
---|
468 | */ |
---|
469 | public function create_screen( $group_id = 0 ) { |
---|
470 | |
---|
471 | // Bail if not looking at this screen |
---|
472 | if ( !bp_is_group_creation_step( $this->slug ) ) |
---|
473 | return false; |
---|
474 | |
---|
475 | // Check for possibly empty group_id |
---|
476 | if ( empty( $group_id ) ) { |
---|
477 | $group_id = bp_get_new_group_id(); |
---|
478 | } |
---|
479 | |
---|
480 | $checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( $group_id, 'forum_id' ); ?> |
---|
481 | |
---|
482 | <h4><?php esc_html_e( 'Group Forum', 'bbpress' ); ?></h4> |
---|
483 | |
---|
484 | <p><?php esc_html_e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p> |
---|
485 | |
---|
486 | <div class="checkbox"> |
---|
487 | <label><input type="checkbox" name="bbp-create-group-forum" id="bbp-create-group-forum" value="1"<?php checked( $checked ); ?> /> <?php esc_html_e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label> |
---|
488 | </div> |
---|
489 | |
---|
490 | <?php |
---|
491 | } |
---|
492 | |
---|
493 | /** |
---|
494 | * Save the Group Forum data on create |
---|
495 | * |
---|
496 | * @since bbPress (r3465) |
---|
497 | */ |
---|
498 | public function create_screen_save( $group_id = 0 ) { |
---|
499 | |
---|
500 | // Nonce check |
---|
501 | if ( ! bbp_verify_nonce_request( 'groups_create_save_' . $this->slug ) ) { |
---|
502 | bbp_add_error( 'bbp_create_group_forum_screen_save', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) ); |
---|
503 | return; |
---|
504 | } |
---|
505 | |
---|
506 | // Check for possibly empty group_id |
---|
507 | if ( empty( $group_id ) ) { |
---|
508 | $group_id = bp_get_new_group_id(); |
---|
509 | } |
---|
510 | |
---|
511 | $create_forum = !empty( $_POST['bbp-create-group-forum'] ) ? true : false; |
---|
512 | $forum_id = 0; |
---|
513 | $forum_ids = bbp_get_group_forum_ids( $group_id ); |
---|
514 | |
---|
515 | if ( !empty( $forum_ids ) ) |
---|
516 | $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids; |
---|
517 | |
---|
518 | // Create a forum, or not |
---|
519 | switch ( $create_forum ) { |
---|
520 | case true : |
---|
521 | |
---|
522 | // Bail if initial content was already created |
---|
523 | if ( !empty( $forum_id ) ) |
---|
524 | return; |
---|
525 | |
---|
526 | // Set the default forum status |
---|
527 | switch ( bp_get_new_group_status() ) { |
---|
528 | case 'hidden' : |
---|
529 | $status = bbp_get_hidden_status_id(); |
---|
530 | break; |
---|
531 | case 'private' : |
---|
532 | $status = bbp_get_private_status_id(); |
---|
533 | break; |
---|
534 | case 'public' : |
---|
535 | default : |
---|
536 | $status = bbp_get_public_status_id(); |
---|
537 | break; |
---|
538 | } |
---|
539 | |
---|
540 | // Create the initial forum |
---|
541 | $forum_id = bbp_insert_forum( array( |
---|
542 | 'post_parent' => bbp_get_group_forums_root_id(), |
---|
543 | 'post_title' => bp_get_new_group_name(), |
---|
544 | 'post_content' => bp_get_new_group_description(), |
---|
545 | 'post_status' => $status |
---|
546 | ) ); |
---|
547 | |
---|
548 | // Run the BP-specific functions for new groups |
---|
549 | $this->new_forum( array( 'forum_id' => $forum_id ) ); |
---|
550 | |
---|
551 | // Update forum active |
---|
552 | groups_update_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id, true ); |
---|
553 | |
---|
554 | // Toggle forum on |
---|
555 | $this->toggle_group_forum( bp_get_new_group_id(), true ); |
---|
556 | |
---|
557 | break; |
---|
558 | case false : |
---|
559 | |
---|
560 | // Forum was created but is now being undone |
---|
561 | if ( !empty( $forum_id ) ) { |
---|
562 | |
---|
563 | // Delete the forum |
---|
564 | wp_delete_post( $forum_id, true ); |
---|
565 | |
---|
566 | // Delete meta values |
---|
567 | groups_delete_groupmeta( bp_get_new_group_id(), 'forum_id' ); |
---|
568 | groups_delete_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id ); |
---|
569 | |
---|
570 | // Toggle forum off |
---|
571 | $this->toggle_group_forum( bp_get_new_group_id(), false ); |
---|
572 | } |
---|
573 | |
---|
574 | break; |
---|
575 | } |
---|
576 | } |
---|
577 | |
---|
578 | /** |
---|
579 | * Used to start an output buffer |
---|
580 | */ |
---|
581 | public function ob_start() { |
---|
582 | ob_start(); |
---|
583 | } |
---|
584 | |
---|
585 | /** |
---|
586 | * Used to end an output buffer |
---|
587 | */ |
---|
588 | public function ob_end_clean() { |
---|
589 | ob_end_clean(); |
---|
590 | } |
---|
591 | |
---|
592 | /** |
---|
593 | * Creating a group forum or category (including root for group) |
---|
594 | * |
---|
595 | * @since bbPress (r3653) |
---|
596 | * @param type $forum_args |
---|
597 | * @uses bbp_get_forum_id() |
---|
598 | * @uses bp_get_current_group_id() |
---|
599 | * @uses bbp_add_forum_id_to_group() |
---|
600 | * @uses bbp_add_group_id_to_forum() |
---|
601 | * @return if no forum_id is available |
---|
602 | */ |
---|
603 | public function new_forum( $forum_args = array() ) { |
---|
604 | |
---|
605 | // Bail if no forum_id was passed |
---|
606 | if ( empty( $forum_args['forum_id'] ) ) |
---|
607 | return; |
---|
608 | |
---|
609 | // Validate forum_id |
---|
610 | $forum_id = bbp_get_forum_id( $forum_args['forum_id'] ); |
---|
611 | $group_id = !empty( $forum_args['group_id'] ) ? $forum_args['group_id'] : bp_get_current_group_id(); |
---|
612 | |
---|
613 | bbp_add_forum_id_to_group( $group_id, $forum_id ); |
---|
614 | bbp_add_group_id_to_forum( $forum_id, $group_id ); |
---|
615 | } |
---|
616 | |
---|
617 | /** |
---|
618 | * Removing a group forum or category (including root for group) |
---|
619 | * |
---|
620 | * @since bbPress (r3653) |
---|
621 | * @param type $forum_args |
---|
622 | * @uses bbp_get_forum_id() |
---|
623 | * @uses bp_get_current_group_id() |
---|
624 | * @uses bbp_add_forum_id_to_group() |
---|
625 | * @uses bbp_add_group_id_to_forum() |
---|
626 | * @return if no forum_id is available |
---|
627 | */ |
---|
628 | public function remove_forum( $forum_args = array() ) { |
---|
629 | |
---|
630 | // Bail if no forum_id was passed |
---|
631 | if ( empty( $forum_args['forum_id'] ) ) |
---|
632 | return; |
---|
633 | |
---|
634 | // Validate forum_id |
---|
635 | $forum_id = bbp_get_forum_id( $forum_args['forum_id'] ); |
---|
636 | $group_id = !empty( $forum_args['group_id'] ) ? $forum_args['group_id'] : bp_get_current_group_id(); |
---|
637 | |
---|
638 | bbp_remove_forum_id_from_group( $group_id, $forum_id ); |
---|
639 | bbp_remove_group_id_from_forum( $forum_id, $group_id ); |
---|
640 | } |
---|
641 | |
---|
642 | /** |
---|
643 | * Listening to BuddyPress Group deletion to remove the forum |
---|
644 | * |
---|
645 | * @param int $group_id The group ID |
---|
646 | * @uses bbp_get_group_forum_ids() |
---|
647 | * @uses BBP_Forums_Group_Extension::remove_forum() |
---|
648 | */ |
---|
649 | public function disconnect_forum_from_group( $group_id = 0 ) { |
---|
650 | |
---|
651 | // Bail if no group ID available |
---|
652 | if ( empty( $group_id ) ) { |
---|
653 | return; |
---|
654 | } |
---|
655 | |
---|
656 | // Get the forums for the current group |
---|
657 | $forum_ids = bbp_get_group_forum_ids( $group_id ); |
---|
658 | |
---|
659 | // Use the first forum ID |
---|
660 | if ( empty( $forum_ids ) ) |
---|
661 | return; |
---|
662 | |
---|
663 | // Get the first forum ID |
---|
664 | $forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids; |
---|
665 | $this->remove_forum( array( |
---|
666 | 'forum_id' => $forum_id, |
---|
667 | 'group_id' => $group_id |
---|
668 | ) ); |
---|
669 | } |
---|
670 | |
---|
671 | /** |
---|
672 | * Toggle the enable_forum group setting on or off |
---|
673 | * |
---|
674 | * @since bbPress (r4612) |
---|
675 | * |
---|
676 | * @param int $group_id The group to toggle |
---|
677 | * @param bool $enabled True for on, false for off |
---|
678 | * @uses groups_get_group() To get the group to toggle |
---|
679 | * @return False if group is not found, otherwise return the group |
---|
680 | */ |
---|
681 | public function toggle_group_forum( $group_id = 0, $enabled = false ) { |
---|
682 | |
---|
683 | // Get the group |
---|
684 | $group = groups_get_group( array( 'group_id' => $group_id ) ); |
---|
685 | |
---|
686 | // Bail if group cannot be found |
---|
687 | if ( empty( $group ) ) |
---|
688 | return false; |
---|
689 | |
---|
690 | // Set forum enabled status |
---|
691 | $group->enable_forum = (int) $enabled; |
---|
692 | |
---|
693 | // Save the group |
---|
694 | $group->save(); |
---|
695 | |
---|
696 | // Maybe disconnect forum from group |
---|
697 | if ( empty( $enabled ) ) { |
---|
698 | $this->disconnect_forum_from_group( $group_id ); |
---|
699 | } |
---|
700 | |
---|
701 | // Update bbPress' internal private and forum ID variables |
---|
702 | bbp_repair_forum_visibility(); |
---|
703 | |
---|
704 | // Return the group |
---|
705 | return $group; |
---|
706 | } |
---|
707 | |
---|
708 | /** Display Methods *******************************************************/ |
---|
709 | |
---|
710 | /** |
---|
711 | * Output the forums for a group in the edit screens |
---|
712 | * |
---|
713 | * As of right now, bbPress only supports 1-to-1 group forum relationships. |
---|
714 | * In the future, many-to-many should be allowed. |
---|
715 | * |
---|
716 | * @since bbPress (r3653) |
---|
717 | * @uses bp_get_current_group_id() |
---|
718 | * @uses bbp_get_group_forum_ids() |
---|
719 | * @uses bbp_has_forums() |
---|
720 | * @uses bbp_get_template_part() |
---|
721 | */ |
---|
722 | public function display_forums( $offset = 0 ) { |
---|
723 | global $wp_query; |
---|
724 | |
---|
725 | // Allow actions immediately before group forum output |
---|
726 | do_action( 'bbp_before_group_forum_display' ); |
---|
727 | |
---|
728 | // Load up bbPress once |
---|
729 | $bbp = bbpress(); |
---|
730 | |
---|
731 | /** Query Resets ******************************************************/ |
---|
732 | |
---|
733 | // Forum data |
---|
734 | $forum_action = bp_action_variable( $offset ); |
---|
735 | $forum_ids = bbp_get_group_forum_ids( bp_get_current_group_id() ); |
---|
736 | $forum_id = array_shift( $forum_ids ); |
---|
737 | |
---|
738 | // Always load up the group forum |
---|
739 | bbp_has_forums( array( |
---|
740 | 'p' => $forum_id, |
---|
741 | 'post_parent' => null |
---|
742 | ) ); |
---|
743 | |
---|
744 | // Set the global forum ID |
---|
745 | $bbp->current_forum_id = $forum_id; |
---|
746 | |
---|
747 | // Assume forum query |
---|
748 | bbp_set_query_name( 'bbp_single_forum' ); ?> |
---|
749 | |
---|
750 | <div id="bbpress-forums"> |
---|
751 | |
---|
752 | <?php switch ( $forum_action ) : |
---|
753 | |
---|
754 | /** Single Forum **********************************************/ |
---|
755 | |
---|
756 | case false : |
---|
757 | case 'page' : |
---|
758 | |
---|
759 | // Strip the super stickies from topic query |
---|
760 | add_filter( 'bbp_get_super_stickies', array( $this, 'no_super_stickies' ), 10, 1 ); |
---|
761 | |
---|
762 | // Unset the super sticky option on topic form |
---|
763 | add_filter( 'bbp_get_topic_types', array( $this, 'unset_super_sticky' ), 10, 1 ); |
---|
764 | |
---|
765 | // Query forums and show them if they exist |
---|
766 | if ( bbp_forums() ) : |
---|
767 | |
---|
768 | // Setup the forum |
---|
769 | bbp_the_forum(); ?> |
---|
770 | |
---|
771 | <h3><?php bbp_forum_title(); ?></h3> |
---|
772 | |
---|
773 | <?php bbp_get_template_part( 'content', 'single-forum' ); |
---|
774 | |
---|
775 | // No forums found |
---|
776 | else : ?> |
---|
777 | |
---|
778 | <div id="message" class="info"> |
---|
779 | <p><?php esc_html_e( 'This group does not currently have a forum.', 'bbpress' ); ?></p> |
---|
780 | </div> |
---|
781 | |
---|
782 | <?php endif; |
---|
783 | |
---|
784 | break; |
---|
785 | |
---|
786 | /** Single Topic **********************************************/ |
---|
787 | |
---|
788 | case $this->topic_slug : |
---|
789 | |
---|
790 | // hide the 'to front' admin links |
---|
791 | add_filter( 'bbp_get_topic_stick_link', array( $this, 'hide_super_sticky_admin_link' ), 10, 2 ); |
---|
792 | |
---|
793 | // Get the topic |
---|
794 | bbp_has_topics( array( |
---|
795 | 'name' => bp_action_variable( $offset + 1 ), |
---|
796 | 'posts_per_page' => 1, |
---|
797 | 'show_stickies' => false |
---|
798 | ) ); |
---|
799 | |
---|
800 | // If no topic, 404 |
---|
801 | if ( ! bbp_topics() ) { |
---|
802 | bp_do_404( bbp_get_forum_permalink( $forum_id ) ); ?> |
---|
803 | <h3><?php bbp_forum_title(); ?></h3> |
---|
804 | <?php bbp_get_template_part( 'feedback', 'no-topics' ); |
---|
805 | return; |
---|
806 | } |
---|
807 | |
---|
808 | // Setup the topic |
---|
809 | bbp_the_topic(); ?> |
---|
810 | |
---|
811 | <h3><?php bbp_topic_title(); ?></h3> |
---|
812 | |
---|
813 | <?php |
---|
814 | |
---|
815 | // Topic edit |
---|
816 | if ( bp_action_variable( $offset + 2 ) === bbp_get_edit_rewrite_id() ) : |
---|
817 | |
---|
818 | // Unset the super sticky link on edit topic template |
---|
819 | add_filter( 'bbp_get_topic_types', array( $this, 'unset_super_sticky' ), 10, 1 ); |
---|
820 | |
---|
821 | // Set the edit switches |
---|
822 | $wp_query->bbp_is_edit = true; |
---|
823 | $wp_query->bbp_is_topic_edit = true; |
---|
824 | |
---|
825 | // Setup the global forum ID |
---|
826 | $bbp->current_topic_id = get_the_ID(); |
---|
827 | |
---|
828 | // Merge |
---|
829 | if ( !empty( $_GET['action'] ) && 'merge' === $_GET['action'] ) : |
---|
830 | bbp_set_query_name( 'bbp_topic_merge' ); |
---|
831 | bbp_get_template_part( 'form', 'topic-merge' ); |
---|
832 | |
---|
833 | // Split |
---|
834 | elseif ( !empty( $_GET['action'] ) && 'split' === $_GET['action'] ) : |
---|
835 | bbp_set_query_name( 'bbp_topic_split' ); |
---|
836 | bbp_get_template_part( 'form', 'topic-split' ); |
---|
837 | |
---|
838 | // Edit |
---|
839 | else : |
---|
840 | bbp_set_query_name( 'bbp_topic_form' ); |
---|
841 | bbp_get_template_part( 'form', 'topic' ); |
---|
842 | |
---|
843 | endif; |
---|
844 | |
---|
845 | // Single Topic |
---|
846 | else: |
---|
847 | bbp_set_query_name( 'bbp_single_topic' ); |
---|
848 | bbp_get_template_part( 'content', 'single-topic' ); |
---|
849 | endif; |
---|
850 | break; |
---|
851 | |
---|
852 | /** Single Reply **********************************************/ |
---|
853 | |
---|
854 | case $this->reply_slug : |
---|
855 | |
---|
856 | // Get the reply |
---|
857 | bbp_has_replies( array( |
---|
858 | 'name' => bp_action_variable( $offset + 1 ), |
---|
859 | 'posts_per_page' => 1 |
---|
860 | ) ); |
---|
861 | |
---|
862 | // If no topic, 404 |
---|
863 | if ( ! bbp_replies() ) { |
---|
864 | bp_do_404( bbp_get_forum_permalink( $forum_id ) ); ?> |
---|
865 | <h3><?php bbp_forum_title(); ?></h3> |
---|
866 | <?php bbp_get_template_part( 'feedback', 'no-replies' ); |
---|
867 | return; |
---|
868 | } |
---|
869 | |
---|
870 | // Setup the reply |
---|
871 | bbp_the_reply(); ?> |
---|
872 | |
---|
873 | <h3><?php bbp_reply_title(); ?></h3> |
---|
874 | |
---|
875 | <?php if ( bp_action_variable( $offset + 2 ) === bbp_get_edit_rewrite_id() ) : |
---|
876 | |
---|
877 | // Set the edit switches |
---|
878 | $wp_query->bbp_is_edit = true; |
---|
879 | $wp_query->bbp_is_reply_edit = true; |
---|
880 | |
---|
881 | // Setup the global reply ID |
---|
882 | $bbp->current_reply_id = get_the_ID(); |
---|
883 | |
---|
884 | // Move |
---|
885 | if ( !empty( $_GET['action'] ) && ( 'move' === $_GET['action'] ) ) : |
---|
886 | bbp_set_query_name( 'bbp_reply_move' ); |
---|
887 | bbp_get_template_part( 'form', 'reply-move' ); |
---|
888 | |
---|
889 | // Edit |
---|
890 | else : |
---|
891 | bbp_set_query_name( 'bbp_reply_form' ); |
---|
892 | bbp_get_template_part( 'form', 'reply' ); |
---|
893 | endif; |
---|
894 | endif; |
---|
895 | break; |
---|
896 | endswitch; |
---|
897 | |
---|
898 | // Reset the query |
---|
899 | wp_reset_query(); ?> |
---|
900 | |
---|
901 | </div> |
---|
902 | |
---|
903 | <?php |
---|
904 | |
---|
905 | // Allow actions immediately after group forum output |
---|
906 | do_action( 'bbp_after_group_forum_display' ); |
---|
907 | } |
---|
908 | |
---|
909 | /** Super sticky filters ***************************************************/ |
---|
910 | |
---|
911 | /** |
---|
912 | * Strip super stickies from the topic query |
---|
913 | * |
---|
914 | * @since bbPress (r4810) |
---|
915 | * @access private |
---|
916 | * @param array $super the super sticky post ID's |
---|
917 | * @return array (empty) |
---|
918 | */ |
---|
919 | public function no_super_stickies( $super = array() ) { |
---|
920 | $super = array(); |
---|
921 | return $super; |
---|
922 | } |
---|
923 | |
---|
924 | /** |
---|
925 | * Unset the type super sticky from topic type |
---|
926 | * |
---|
927 | * @since bbPress (r4810) |
---|
928 | * @access private |
---|
929 | * @param array $args |
---|
930 | * @return array $args without the to-front link |
---|
931 | */ |
---|
932 | public function unset_super_sticky( $args = array() ) { |
---|
933 | if ( isset( $args['super'] ) ) { |
---|
934 | unset( $args['super'] ); |
---|
935 | } |
---|
936 | return $args; |
---|
937 | } |
---|
938 | |
---|
939 | /** |
---|
940 | * Ugly preg_replace to hide the to front admin link |
---|
941 | * |
---|
942 | * @since bbPress (r4810) |
---|
943 | * @access private |
---|
944 | * @param string $retval |
---|
945 | * @param array $args |
---|
946 | * @return string $retval without the to-front link |
---|
947 | */ |
---|
948 | public function hide_super_sticky_admin_link( $retval = '', $args = array() ) { |
---|
949 | if ( strpos( $retval, '(' ) ) { |
---|
950 | $retval = preg_replace( '/(\(.+?)+(\))/i', '', $retval ); |
---|
951 | } |
---|
952 | |
---|
953 | return $retval; |
---|
954 | } |
---|
955 | |
---|
956 | /** Redirect Helpers ******************************************************/ |
---|
957 | |
---|
958 | /** |
---|
959 | * Redirect to the group forum screen |
---|
960 | * |
---|
961 | * @since bbPress (r3653) |
---|
962 | * @param str $redirect_url |
---|
963 | * @param str $redirect_to |
---|
964 | */ |
---|
965 | public function new_topic_redirect_to( $redirect_url = '', $redirect_to = '', $topic_id = 0 ) { |
---|
966 | if ( bp_is_group() ) { |
---|
967 | $topic = bbp_get_topic( $topic_id ); |
---|
968 | $topic_hash = '#post-' . $topic_id; |
---|
969 | $redirect_url = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name ) . $topic_hash; |
---|
970 | } |
---|
971 | |
---|
972 | return $redirect_url; |
---|
973 | } |
---|
974 | |
---|
975 | /** |
---|
976 | * Redirect to the group forum screen |
---|
977 | * |
---|
978 | * @since bbPress (r3653) |
---|
979 | */ |
---|
980 | public function new_reply_redirect_to( $redirect_url = '', $redirect_to = '', $reply_id = 0 ) { |
---|
981 | global $wp_rewrite; |
---|
982 | |
---|
983 | if ( bp_is_group() ) { |
---|
984 | $topic_id = bbp_get_reply_topic_id( $reply_id ); |
---|
985 | $topic = bbp_get_topic( $topic_id ); |
---|
986 | $reply_position = bbp_get_reply_position( $reply_id, $topic_id ); |
---|
987 | $reply_page = ceil( (int) $reply_position / (int) bbp_get_replies_per_page() ); |
---|
988 | $reply_hash = '#post-' . $reply_id; |
---|
989 | $topic_url = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name ); |
---|
990 | |
---|
991 | // Don't include pagination if on first page |
---|
992 | if ( 1 >= $reply_page ) { |
---|
993 | $redirect_url = trailingslashit( $topic_url ) . $reply_hash; |
---|
994 | |
---|
995 | // Include pagination |
---|
996 | } else { |
---|
997 | $redirect_url = trailingslashit( $topic_url ) . trailingslashit( $wp_rewrite->pagination_base ) . trailingslashit( $reply_page ) . $reply_hash; |
---|
998 | } |
---|
999 | |
---|
1000 | // Add topic view query arg back to end if it is set |
---|
1001 | if ( bbp_get_view_all() ) { |
---|
1002 | $redirect_url = bbp_add_view_all( $redirect_url ); |
---|
1003 | } |
---|
1004 | } |
---|
1005 | |
---|
1006 | return $redirect_url; |
---|
1007 | } |
---|
1008 | |
---|
1009 | /** |
---|
1010 | * Redirect to the group admin forum edit screen |
---|
1011 | * |
---|
1012 | * @since bbPress (r3653) |
---|
1013 | * @uses groups_get_current_group() |
---|
1014 | * @uses bp_is_group_admin_screen() |
---|
1015 | * @uses trailingslashit() |
---|
1016 | * @uses bp_get_root_domain() |
---|
1017 | * @uses bp_get_groups_root_slug() |
---|
1018 | */ |
---|
1019 | public function edit_redirect_to( $redirect_url = '' ) { |
---|
1020 | |
---|
1021 | // Get the current group, if there is one |
---|
1022 | $group = groups_get_current_group(); |
---|
1023 | |
---|
1024 | // If this is a group of any kind, empty out the redirect URL |
---|
1025 | if ( bp_is_group_admin_screen( $this->slug ) ) |
---|
1026 | $redirect_url = trailingslashit( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/' . $group->slug . '/admin/' . $this->slug ); |
---|
1027 | |
---|
1028 | return $redirect_url; |
---|
1029 | } |
---|
1030 | |
---|
1031 | /** Form Helpers **********************************************************/ |
---|
1032 | |
---|
1033 | public function forum_parent() { |
---|
1034 | ?> |
---|
1035 | |
---|
1036 | <input type="hidden" name="bbp_forum_parent_id" id="bbp_forum_parent_id" value="<?php bbp_group_forums_root_id(); ?>" /> |
---|
1037 | |
---|
1038 | <?php |
---|
1039 | } |
---|
1040 | |
---|
1041 | public function topic_parent() { |
---|
1042 | |
---|
1043 | $forum_ids = bbp_get_group_forum_ids( bp_get_current_group_id() ); ?> |
---|
1044 | |
---|
1045 | <p> |
---|
1046 | <label for="bbp_forum_id"><?php esc_html_e( 'Forum:', 'bbpress' ); ?></label><br /> |
---|
1047 | <?php bbp_dropdown( array( 'include' => $forum_ids, 'selected' => bbp_get_form_topic_forum() ) ); ?> |
---|
1048 | </p> |
---|
1049 | |
---|
1050 | <?php |
---|
1051 | } |
---|
1052 | |
---|
1053 | /** |
---|
1054 | * Permissions to view the 'New Topic'/'Reply To' form in a BuddyPress group. |
---|
1055 | * |
---|
1056 | * @since bbPress (r4608) |
---|
1057 | * |
---|
1058 | * @param bool $retval Are we allowed to view the reply form? |
---|
1059 | * @uses bp_is_group() To determine if we're on a group page |
---|
1060 | * @uses is_user_logged_in() To determine if a user is logged in. |
---|
1061 | * @uses bbp_is_user_keymaster() Is the current user a keymaster? |
---|
1062 | * @uses bbp_group_is_member() Is the current user a member of the group? |
---|
1063 | * @uses bbp_group_is_user_banned() Is the current user banned from the group? |
---|
1064 | * |
---|
1065 | * @return bool |
---|
1066 | */ |
---|
1067 | public function form_permissions( $retval = false ) { |
---|
1068 | |
---|
1069 | // Bail if not a group |
---|
1070 | if ( ! bp_is_group() ) { |
---|
1071 | return $retval; |
---|
1072 | } |
---|
1073 | |
---|
1074 | // Bail if user is not logged in |
---|
1075 | if ( ! is_user_logged_in() ) { |
---|
1076 | return $retval; |
---|
1077 | |
---|
1078 | // Keymasters can always pass go |
---|
1079 | } elseif ( bbp_is_user_keymaster() ) { |
---|
1080 | $retval = true; |
---|
1081 | |
---|
1082 | // Non-members cannot see forms |
---|
1083 | } elseif ( ! bbp_group_is_member() ) { |
---|
1084 | $retval = false; |
---|
1085 | |
---|
1086 | // Banned users cannot see forms |
---|
1087 | } elseif ( bbp_group_is_banned() ) { |
---|
1088 | $retval = false; |
---|
1089 | } |
---|
1090 | |
---|
1091 | return $retval; |
---|
1092 | } |
---|
1093 | |
---|
1094 | /** |
---|
1095 | * Add a hidden input field on the group settings page if the group forum is |
---|
1096 | * enabled. |
---|
1097 | * |
---|
1098 | * Due to the way BuddyPress' group admin settings page saves its settings, |
---|
1099 | * we need to let BP know that bbPress added a forum. |
---|
1100 | * |
---|
1101 | * @since bbPress (r5026) |
---|
1102 | * |
---|
1103 | * @link http://bbpress.trac.wordpress.org/ticket/2339/ |
---|
1104 | * @see groups_screen_group_admin_settings() |
---|
1105 | */ |
---|
1106 | public function group_settings_hidden_field() { |
---|
1107 | |
---|
1108 | // if a forum is not enabled, we don't need to add this field |
---|
1109 | if ( ! bp_group_is_forum_enabled() ) |
---|
1110 | return; ?> |
---|
1111 | |
---|
1112 | <input type="hidden" name="group-show-forum" id="group-show-forum" value="1" /> |
---|
1113 | |
---|
1114 | <?php |
---|
1115 | } |
---|
1116 | |
---|
1117 | /** Permalink Mappers *****************************************************/ |
---|
1118 | |
---|
1119 | /** |
---|
1120 | * Maybe map a bbPress forum/topic/reply permalink to the corresponding group |
---|
1121 | * |
---|
1122 | * @param int $post_id |
---|
1123 | * @uses get_post() |
---|
1124 | * @uses bbp_is_reply() |
---|
1125 | * @uses bbp_get_reply_topic_id() |
---|
1126 | * @uses bbp_get_reply_forum_id() |
---|
1127 | * @uses bbp_is_topic() |
---|
1128 | * @uses bbp_get_topic_forum_id() |
---|
1129 | * @uses bbp_is_forum() |
---|
1130 | * @uses get_post_field() |
---|
1131 | * @uses bbp_get_forum_group_ids() |
---|
1132 | * @uses groups_get_group() |
---|
1133 | * @uses bp_get_group_admin_permalink() |
---|
1134 | * @uses bp_get_group_permalink() |
---|
1135 | * @return Bail early if not a group forum post |
---|
1136 | * @return string |
---|
1137 | */ |
---|
1138 | private function maybe_map_permalink_to_group( $post_id = 0, $url = false ) { |
---|
1139 | |
---|
1140 | switch ( get_post_type( $post_id ) ) { |
---|
1141 | |
---|
1142 | // Reply |
---|
1143 | case bbp_get_reply_post_type() : |
---|
1144 | $topic_id = bbp_get_reply_topic_id( $post_id ); |
---|
1145 | $forum_id = bbp_get_reply_forum_id( $post_id ); |
---|
1146 | $url_end = trailingslashit( $this->reply_slug ) . get_post_field( 'post_name', $post_id ); |
---|
1147 | break; |
---|
1148 | |
---|
1149 | // Topic |
---|
1150 | case bbp_get_topic_post_type() : |
---|
1151 | $topic_id = $post_id; |
---|
1152 | $forum_id = bbp_get_topic_forum_id( $post_id ); |
---|
1153 | $url_end = trailingslashit( $this->topic_slug ) . get_post_field( 'post_name', $post_id ); |
---|
1154 | break; |
---|
1155 | |
---|
1156 | // Forum |
---|
1157 | case bbp_get_forum_post_type() : |
---|
1158 | $forum_id = $post_id; |
---|
1159 | $url_end = ''; //get_post_field( 'post_name', $post_id ); |
---|
1160 | break; |
---|
1161 | |
---|
1162 | // Unknown |
---|
1163 | default : |
---|
1164 | return $url; |
---|
1165 | break; |
---|
1166 | } |
---|
1167 | |
---|
1168 | // Get group ID's for this forum |
---|
1169 | $group_ids = bbp_get_forum_group_ids( $forum_id ); |
---|
1170 | |
---|
1171 | // Bail if the post isn't associated with a group |
---|
1172 | if ( empty( $group_ids ) ) |
---|
1173 | return $url; |
---|
1174 | |
---|
1175 | // @todo Multiple group forums/forum groups |
---|
1176 | $group_id = $group_ids[0]; |
---|
1177 | $group = groups_get_group( array( 'group_id' => $group_id ) ); |
---|
1178 | |
---|
1179 | if ( bp_is_group_admin_screen( $this->slug ) ) { |
---|
1180 | $group_permalink = trailingslashit( bp_get_group_admin_permalink( $group ) ); |
---|
1181 | } else { |
---|
1182 | $group_permalink = trailingslashit( bp_get_group_permalink( $group ) ); |
---|
1183 | } |
---|
1184 | |
---|
1185 | return trailingslashit( trailingslashit( $group_permalink . $this->slug ) . $url_end ); |
---|
1186 | } |
---|
1187 | |
---|
1188 | /** |
---|
1189 | * Map a forum permalink to its corresponding group |
---|
1190 | * |
---|
1191 | * @since bbPress (r3802) |
---|
1192 | * @param string $url |
---|
1193 | * @param int $forum_id |
---|
1194 | * @uses maybe_map_permalink_to_group() |
---|
1195 | * @return string |
---|
1196 | */ |
---|
1197 | public function map_forum_permalink_to_group( $url, $forum_id ) { |
---|
1198 | return $this->maybe_map_permalink_to_group( $forum_id, $url ); |
---|
1199 | } |
---|
1200 | |
---|
1201 | /** |
---|
1202 | * Map a topic permalink to its group forum |
---|
1203 | * |
---|
1204 | * @since bbPress (r3802) |
---|
1205 | * @param string $url |
---|
1206 | * @param int $topic_id |
---|
1207 | * @uses maybe_map_permalink_to_group() |
---|
1208 | * @return string |
---|
1209 | */ |
---|
1210 | public function map_topic_permalink_to_group( $url, $topic_id ) { |
---|
1211 | return $this->maybe_map_permalink_to_group( $topic_id, $url ); |
---|
1212 | } |
---|
1213 | |
---|
1214 | /** |
---|
1215 | * Map a reply permalink to its group forum |
---|
1216 | * |
---|
1217 | * @since bbPress (r3802) |
---|
1218 | * @param string $url |
---|
1219 | * @param int $reply_id |
---|
1220 | * @uses maybe_map_permalink_to_group() |
---|
1221 | * @return string |
---|
1222 | */ |
---|
1223 | public function map_reply_permalink_to_group( $url, $reply_id ) { |
---|
1224 | return $this->maybe_map_permalink_to_group( bbp_get_reply_topic_id( $reply_id ), $url ); |
---|
1225 | } |
---|
1226 | |
---|
1227 | /** |
---|
1228 | * Map a reply edit link to its group forum |
---|
1229 | * |
---|
1230 | * @param string $url |
---|
1231 | * @param int $reply_id |
---|
1232 | * @uses maybe_map_permalink_to_group() |
---|
1233 | * @return string |
---|
1234 | */ |
---|
1235 | public function map_reply_edit_url_to_group( $url, $reply_id ) { |
---|
1236 | $new = $this->maybe_map_permalink_to_group( $reply_id ); |
---|
1237 | |
---|
1238 | if ( empty( $new ) ) |
---|
1239 | return $url; |
---|
1240 | |
---|
1241 | return trailingslashit( $new ) . bbpress()->edit_id . '/'; |
---|
1242 | } |
---|
1243 | |
---|
1244 | /** |
---|
1245 | * Map a post link to its group forum |
---|
1246 | * |
---|
1247 | * @param string $url |
---|
1248 | * @param obj $post |
---|
1249 | * @param boolean $leavename |
---|
1250 | * @uses maybe_map_permalink_to_group() |
---|
1251 | * @return string |
---|
1252 | */ |
---|
1253 | public function post_link( $url, $post ) { |
---|
1254 | return $this->maybe_map_permalink_to_group( $post->ID, $url ); |
---|
1255 | } |
---|
1256 | |
---|
1257 | /** |
---|
1258 | * Map a page link to its group forum |
---|
1259 | * |
---|
1260 | * @param string $url |
---|
1261 | * @param int $post_id |
---|
1262 | * @param $sample |
---|
1263 | * @uses maybe_map_permalink_to_group() |
---|
1264 | * @return string |
---|
1265 | */ |
---|
1266 | public function page_link( $url, $post_id ) { |
---|
1267 | return $this->maybe_map_permalink_to_group( $post_id, $url ); |
---|
1268 | } |
---|
1269 | |
---|
1270 | /** |
---|
1271 | * Map a custom post type link to its group forum |
---|
1272 | * |
---|
1273 | * @param string $url |
---|
1274 | * @param obj $post |
---|
1275 | * @param $leavename |
---|
1276 | * @param $sample |
---|
1277 | * @uses maybe_map_permalink_to_group() |
---|
1278 | * @return string |
---|
1279 | */ |
---|
1280 | public function post_type_link( $url, $post ) { |
---|
1281 | return $this->maybe_map_permalink_to_group( $post->ID, $url ); |
---|
1282 | } |
---|
1283 | |
---|
1284 | /** |
---|
1285 | * Fix pagination of topics on forum view |
---|
1286 | * |
---|
1287 | * @param array $args |
---|
1288 | * @global $wp_rewrite |
---|
1289 | * @uses bbp_get_forum_id() |
---|
1290 | * @uses maybe_map_permalink_to_group |
---|
1291 | * @return array |
---|
1292 | */ |
---|
1293 | public function topic_pagination( $args ) { |
---|
1294 | $new = $this->maybe_map_permalink_to_group( bbp_get_forum_id() ); |
---|
1295 | |
---|
1296 | if ( empty( $new ) ) |
---|
1297 | return $args; |
---|
1298 | |
---|
1299 | global $wp_rewrite; |
---|
1300 | |
---|
1301 | $args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/'; |
---|
1302 | |
---|
1303 | return $args; |
---|
1304 | } |
---|
1305 | |
---|
1306 | /** |
---|
1307 | * Fix pagination of replies on topic view |
---|
1308 | * |
---|
1309 | * @param array $args |
---|
1310 | * @global $wp_rewrite |
---|
1311 | * @uses bbp_get_topic_id() |
---|
1312 | * @uses maybe_map_permalink_to_group |
---|
1313 | * @return array |
---|
1314 | */ |
---|
1315 | public function replies_pagination( $args ) { |
---|
1316 | $new = $this->maybe_map_permalink_to_group( bbp_get_topic_id() ); |
---|
1317 | if ( empty( $new ) ) |
---|
1318 | return $args; |
---|
1319 | |
---|
1320 | global $wp_rewrite; |
---|
1321 | |
---|
1322 | $args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/'; |
---|
1323 | |
---|
1324 | return $args; |
---|
1325 | } |
---|
1326 | |
---|
1327 | /** |
---|
1328 | * Ensure that forum content associated with a BuddyPress group can only be |
---|
1329 | * viewed via the group URL. |
---|
1330 | * |
---|
1331 | * @since bbPress (r3802) |
---|
1332 | */ |
---|
1333 | public function redirect_canonical() { |
---|
1334 | |
---|
1335 | // Viewing a single forum |
---|
1336 | if ( bbp_is_single_forum() ) { |
---|
1337 | $forum_id = get_the_ID(); |
---|
1338 | $group_ids = bbp_get_forum_group_ids( $forum_id ); |
---|
1339 | |
---|
1340 | // Viewing a single topic |
---|
1341 | } elseif ( bbp_is_single_topic() ) { |
---|
1342 | $topic_id = get_the_ID(); |
---|
1343 | $slug = get_post_field( 'post_name', $topic_id ); |
---|
1344 | $forum_id = bbp_get_topic_forum_id( $topic_id ); |
---|
1345 | $group_ids = bbp_get_forum_group_ids( $forum_id ); |
---|
1346 | |
---|
1347 | // Not a forum or topic |
---|
1348 | } else { |
---|
1349 | return; |
---|
1350 | } |
---|
1351 | |
---|
1352 | // Bail if not a group forum |
---|
1353 | if ( empty( $group_ids ) ) |
---|
1354 | return; |
---|
1355 | |
---|
1356 | // Use the first group ID |
---|
1357 | $group_id = $group_ids[0]; |
---|
1358 | $group = groups_get_group( array( 'group_id' => $group_id ) ); |
---|
1359 | $group_link = trailingslashit( bp_get_group_permalink( $group ) ); |
---|
1360 | $redirect_to = trailingslashit( $group_link . $this->slug ); |
---|
1361 | |
---|
1362 | // Add topic slug to URL |
---|
1363 | if ( bbp_is_single_topic() ) { |
---|
1364 | $redirect_to = trailingslashit( $redirect_to . $this->topic_slug . '/' . $slug ); |
---|
1365 | } |
---|
1366 | |
---|
1367 | bp_core_redirect( $redirect_to ); |
---|
1368 | } |
---|
1369 | |
---|
1370 | /** Activity **************************************************************/ |
---|
1371 | |
---|
1372 | /** |
---|
1373 | * Map a forum post to its corresponding group in the group activity stream. |
---|
1374 | * |
---|
1375 | * @since bbPress (r4396) |
---|
1376 | * |
---|
1377 | * @param array $args Arguments from BBP_BuddyPress_Activity::record_activity() |
---|
1378 | * @uses groups_get_current_group() To see if we're posting from a BP group |
---|
1379 | * |
---|
1380 | * @return array |
---|
1381 | */ |
---|
1382 | public function map_activity_to_group( $args = array() ) { |
---|
1383 | |
---|
1384 | // Get current BP group |
---|
1385 | $group = groups_get_current_group(); |
---|
1386 | |
---|
1387 | // Not posting from a BuddyPress group? stop now! |
---|
1388 | if ( empty( $group ) ) |
---|
1389 | return $args; |
---|
1390 | |
---|
1391 | // Set the component to 'groups' so the activity item shows up in the group |
---|
1392 | $args['component'] = buddypress()->groups->id; |
---|
1393 | |
---|
1394 | // Move the forum post ID to the secondary item ID |
---|
1395 | $args['secondary_item_id'] = $args['item_id']; |
---|
1396 | |
---|
1397 | // Set the item ID to the group ID so the activity item shows up in the group |
---|
1398 | $args['item_id'] = $group->id; |
---|
1399 | |
---|
1400 | // Update the group's last activity |
---|
1401 | groups_update_last_activity( $group->id ); |
---|
1402 | |
---|
1403 | return $args; |
---|
1404 | } |
---|
1405 | } |
---|
1406 | endif; |
---|