PluginProbe
bbPress / 2.6.6
bbPress v2.6.6
trunk 2.0 2.0-beta-1 2.0-beta-2b 2.0-beta-3 2.0-beta-3b 2.0-rc-2 2.0-rc-3 2.0-rc-4 2.0-rc-5 2.0.1 2.0.2 2.0.3 2.1 2.1-beta-1 2.1-rc1 2.1-rc2 2.1-rc3 2.1-rc4 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.2.2 All 71 releases
bbpress / includes / admin / topics.php

topics.php in bbPress 2.6.6, at includes/admin/topics.php

1,260 lines 42.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * bbPress Topics Admin Class
5 *
6 * @package bbPress
7 * @subpackage Administration
8 */
9
10 // Exit if accessed directly
11 defined( 'ABSPATH' ) || exit;
12
13 if ( ! class_exists( 'BBP_Topics_Admin' ) ) :
14 /**
15 * Loads bbPress topics admin area
16 *
17 * @package bbPress
18 * @subpackage Administration
19 * @since 2.0.0 bbPress (r2464)
20 */
21 class BBP_Topics_Admin {
22
23 /** Variables *************************************************************/
24
25 /**
26 * @var The post type of this admin component
27 */
28 private $post_type = '';
29
30 /** Functions *************************************************************/
31
32 /**
33 * The main bbPress topics admin loader
34 *
35 * @since 2.0.0 bbPress (r2515)
36 */
37 public function __construct() {
38 $this->setup_globals();
39 $this->setup_actions();
40 }
41
42 /**
43 * Setup the admin hooks, actions and filters
44 *
45 * @since 2.0.0 bbPress (r2646)
46 * @since 2.6.0 bbPress (r6101) Added bulk actions
47 *
48 * @access private
49 */
50 private function setup_actions() {
51
52 // Messages
53 add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
54
55 // Topic bulk actions, added in WordPress 4.7, see #WP16031.
56 if ( bbp_get_major_wp_version() >= 4.7 ) {
57 add_filter( 'bulk_actions-edit-topic', array( $this, 'bulk_actions' ) );
58 add_filter( 'handle_bulk_actions-edit-topic', array( $this, 'handle_bulk_actions' ), 10, 3 );
59 add_filter( 'bulk_post_updated_messages', array( $this, 'bulk_post_updated_messages' ), 10, 2 );
60 }
61
62 // Topic column headers.
63 add_filter( 'manage_' . $this->post_type . '_posts_columns', array( $this, 'column_headers' ) );
64
65 // Topic columns (in post row)
66 add_action( 'manage_' . $this->post_type . '_posts_custom_column', array( $this, 'column_data' ), 10, 2 );
67 add_filter( 'post_row_actions', array( $this, 'row_actions' ), 10, 2 );
68
69 // Topic meta-box actions
70 add_action( 'add_meta_boxes', array( $this, 'attributes_metabox' ) );
71 add_action( 'add_meta_boxes', array( $this, 'author_metabox' ) );
72 add_action( 'add_meta_boxes', array( $this, 'replies_metabox' ) );
73 add_action( 'add_meta_boxes', array( $this, 'engagements_metabox' ) );
74 add_action( 'add_meta_boxes', array( $this, 'favorites_metabox' ) );
75 add_action( 'add_meta_boxes', array( $this, 'subscriptions_metabox' ) );
76 add_action( 'add_meta_boxes', array( $this, 'comments_metabox' ) );
77 add_action( 'save_post', array( $this, 'save_meta_boxes' ) );
78
79 // Check if there are any bbp_toggle_topic_* requests on admin_init, also have a message displayed
80 add_action( 'load-edit.php', array( $this, 'toggle_topic' ) );
81 add_action( 'load-edit.php', array( $this, 'toggle_topic_notice' ) );
82
83 // Add ability to filter topics and replies per forum
84 add_filter( 'restrict_manage_posts', array( $this, 'filter_dropdown' ) );
85 add_filter( 'bbp_request', array( $this, 'filter_post_rows' ) );
86
87 // Empty spam
88 add_filter( 'manage_posts_extra_tablenav', array( $this, 'filter_empty_spam' ) );
89
90 // Contextual Help
91 add_action( 'load-edit.php', array( $this, 'edit_help' ) );
92 add_action( 'load-post.php', array( $this, 'new_help' ) );
93 add_action( 'load-post-new.php', array( $this, 'new_help' ) );
94 }
95
96 /**
97 * Admin globals
98 *
99 * @since 2.0.0 bbPress (r2646)
100 *
101 * @access private
102 */
103 private function setup_globals() {
104 $this->post_type = bbp_get_topic_post_type();
105 }
106
107 /** Contextual Help *******************************************************/
108
109 /**
110 * Contextual help for bbPress topic edit page
111 *
112 * @since 2.0.0 bbPress (r3119)
113 */
114 public function edit_help() {
115
116 // Overview
117 get_current_screen()->add_help_tab( array(
118 'id' => 'overview',
119 'title' => __( 'Overview', 'bbpress' ),
120 'content' =>
121 '<p>' . __( 'This screen displays the individual topics on your site. You can customize the display of this screen to suit your workflow.', 'bbpress' ) . '</p>'
122 ) );
123
124 // Screen Content
125 get_current_screen()->add_help_tab( array(
126 'id' => 'screen-content',
127 'title' => __( 'Screen Content', 'bbpress' ),
128 'content' =>
129 '<p>' . __( 'You can customize the display of this screen&#8217;s contents in a number of ways:', 'bbpress' ) . '</p>' .
130 '<ul>' .
131 '<li>' . __( 'You can hide/display columns based on your needs and decide how many topics to list per screen using the Screen Options tab.', 'bbpress' ) . '</li>' .
132 '<li>' . __( 'You can filter the list of topics by topic status using the text links in the upper left to show All, Published, Draft, Pending, Trashed, Closed, or Spam topics. The default view is to show all topics.', 'bbpress' ) . '</li>' .
133 '<li>' . __( 'You can view topics in a simple title list or with an excerpt. Choose the view you prefer by clicking on the icons at the top of the list on the right.', 'bbpress' ) . '</li>' .
134 '<li>' . __( 'You can refine the list to show only topics in a specific forum or from a specific month by using the dropdown menus above the topics list. Click the Filter button after making your selection.', 'bbpress' ) . '</li>' .
135 '</ul>'
136 ) );
137
138 // Available Actions
139 get_current_screen()->add_help_tab( array(
140 'id' => 'action-links',
141 'title' => __( 'Available Actions', 'bbpress' ),
142 'content' =>
143 '<p>' . __( 'Hovering over a row in the topics list will display action links that allow you to manage your topic. You can perform the following actions:', 'bbpress' ) . '</p>' .
144 '<ul>' .
145 '<li>' . __( '<strong>Edit</strong> takes you to the editing screen for that topic. You can also reach that screen by clicking on the topic title.', 'bbpress' ) . '</li>' .
146 '<li>' . __( '<strong>Stick</strong> will keep the selected topic &#8217;pinned&#8217; to the top the parent forum topic list.', 'bbpress' ) . '</li>' .
147 '<li>' . __( '<strong>Stick <em>(to front)</em></strong> will keep the selected topic &#8217;pinned&#8217; to the top of ALL forums and be visable in any forums topics list.', 'bbpress' ) . '</li>' .
148 '<li>' . __( '<strong>Approve</strong> will change the status from pending to publish.', 'bbpress' ) . '</li>' .
149 '<li>' . __( '<strong>Close</strong> will mark the selected topic as &#8217;closed&#8217; and disable the ability to post new replies to it.', 'bbpress' ) . '</li>' .
150 '<li>' . __( '<strong>Spam</strong> removes your topic from this list and places it in the spam queue, from which you can permanently delete it.', 'bbpress' ) . '</li>' .
151 '<li>' . __( '<strong>Trash</strong> removes your topic from this list and places it in the trash, from which you can permanently delete it.', 'bbpress' ) . '</li>' .
152 '<li>' . __( '<strong>View</strong> will take you to your live site to view the topic.', 'bbpress' ) . '</li>' .
153 '</ul>'
154 ) );
155
156 // Bulk Actions
157 get_current_screen()->add_help_tab( array(
158 'id' => 'bulk-actions',
159 'title' => __( 'Bulk Actions', 'bbpress' ),
160 'content' =>
161 '<p>' . __( 'You can also edit, spam, or move multiple topics to the trash at once. Select the topics you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.', 'bbpress' ) . '</p>' .
162 '<p>' . __( 'When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected topics at once. To remove a topic from the grouping, just click the x next to its name in the Bulk Edit area that appears.', 'bbpress' ) . '</p>'
163 ) );
164
165 // Help Sidebar
166 get_current_screen()->set_help_sidebar(
167 '<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
168 '<p>' . __( '<a href="https://codex.bbpress.org" target="_blank">bbPress Documentation</a>', 'bbpress' ) . '</p>' .
169 '<p>' . __( '<a href="https://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
170 );
171 }
172
173 /**
174 * Contextual help for bbPress topic edit page
175 *
176 * @since 2.0.0 bbPress (r3119)
177 */
178 public function new_help() {
179
180 $customize_display = '<p>' . __( 'The title field and the big topic editing Area are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.', 'bbpress' ) . '</p>';
181
182 get_current_screen()->add_help_tab( array(
183 'id' => 'customize-display',
184 'title' => __( 'Customizing This Display', 'bbpress' ),
185 'content' => $customize_display,
186 ) );
187
188 get_current_screen()->add_help_tab( array(
189 'id' => 'title-topic-editor',
190 'title' => __( 'Title and Topic Editor', 'bbpress' ),
191 'content' =>
192 '<p>' . __( '<strong>Title</strong> - Enter a title for your topic. After you enter a title, you&#8217;ll see the permalink below, which you can edit.', 'bbpress' ) . '</p>' .
193 '<p>' . __( '<strong>Topic Editor</strong> - Enter the text for your topic. There are two modes of editing: Visual and HTML. Choose the mode by clicking on the appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. The HTML mode allows you to enter raw HTML along with your topic text. You can insert media files by clicking the icons above the topic editor and following the directions. You can go to the distraction-free writing screen via the Fullscreen icon in Visual mode (second to last in the top row) or the Fullscreen button in HTML mode (last in the row). Once there, you can make buttons visible by hovering over the top area. Exit Fullscreen back to the regular topic editor.', 'bbpress' ) . '</p>'
194 ) );
195
196 $publish_box = '<p>' . __( '<strong>Publish</strong> - You can set the terms of publishing your topic in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a topic or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a topic to be published in the future or backdate a topic.', 'bbpress' ) . '</p>';
197
198 if ( current_theme_supports( 'topic-thumbnails' ) && post_type_supports( bbp_get_topic_post_type(), 'thumbnail' ) ) {
199 $publish_box .= '<p>' . __( '<strong>Featured Image</strong> - This allows you to associate an image with your topic without inserting it. This is usually useful only if your theme makes use of the featured image as a topic thumbnail on the home page, a custom header, etc.', 'bbpress' ) . '</p>';
200 }
201
202 get_current_screen()->add_help_tab( array(
203 'id' => 'topic-attributes',
204 'title' => __( 'Topic Attributes', 'bbpress' ),
205 'content' =>
206 '<p>' . __( 'Select the attributes that your topic should have:', 'bbpress' ) . '</p>' .
207 '<ul>' .
208 '<li>' . __( '<strong>Forum</strong> dropdown determines the parent forum that the topic belongs to. Select the forum or category from the dropdown, or leave the default "No forum" to post the topic without an assigned forum.', 'bbpress' ) . '</li>' .
209 '<li>' . __( '<strong>Topic Type</strong> dropdown indicates the sticky status of the topic. Selecting the super sticky option would stick the topic to the front of your forums, i.e. the topic index, sticky option would stick the topic to its respective forum. Selecting normal would not stick the topic anywhere.', 'bbpress' ) . '</li>' .
210 '</ul>'
211 ) );
212
213 get_current_screen()->add_help_tab( array(
214 'id' => 'publish-box',
215 'title' => __( 'Publish Box', 'bbpress' ),
216 'content' => $publish_box,
217 ) );
218
219 get_current_screen()->set_help_sidebar(
220 '<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
221 '<p>' . __( '<a href="https://codex.bbpress.org" target="_blank">bbPress Documentation</a>', 'bbpress' ) . '</p>' .
222 '<p>' . __( '<a href="https://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
223 );
224 }
225
226 /**
227 * Add spam/unspam bulk actions to the bulk action dropdown.
228 *
229 * @since 2.6.0 bbPress (r6101)
230 *
231 * @param array $actions The list of bulk actions.
232 * @return array The filtered list of bulk actions.
233 */
234 public function bulk_actions( $actions ) {
235
236 if ( current_user_can( 'moderate' ) ) {
237 if ( bbp_get_spam_status_id() === get_query_var( 'post_status' ) ) {
238 $actions['unspam'] = esc_html__( 'Unspam', 'bbpress' );
239 } else {
240 $actions['spam'] = esc_html__( 'Spam', 'bbpress' );
241 }
242 }
243
244 return $actions;
245 }
246
247 /**
248 * Add custom bulk action updated messages for topics.
249 *
250 * @since 2.6.0 bbPress (r6101)
251 *
252 * @param array $bulk_messages Arrays of messages, each keyed by the corresponding post type.
253 * @param array $bulk_counts Array of item counts for each message, used to build internationalized strings.
254 */
255 public function bulk_post_updated_messages( $bulk_messages, $bulk_counts ) {
256 $bulk_messages['topic']['updated'] = _n( '%s topic updated.', '%s topics updated.', $bulk_counts['updated'], 'bbpress' );
257 $bulk_messages['topic']['locked'] = ( 1 === $bulk_counts['locked'] )
258 ? __( '1 topic not updated, somebody is editing it.', 'bbpress' )
259 : _n( '%s topic not updated, somebody is editing it.', '%s topics not updated, somebody is editing them.', $bulk_counts['locked'], 'bbpress' );
260
261 return $bulk_messages;
262 }
263
264 /**
265 * Handle spam/unspam bulk actions.
266 *
267 * @since 2.6.0 bbPress (r6101)
268 *
269 * @param string $sendback The sendback URL.
270 * @param string $doaction The action to be taken.
271 * @param array $post_ids The post IDS to take the action on.
272 * @return string The sendback URL.
273 */
274 public function handle_bulk_actions( $sendback, $doaction, $post_ids ) {
275
276 $sendback = remove_query_arg( array( 'spam', 'unspam' ), $sendback );
277 $updated = $locked = 0;
278
279 if ( 'spam' === $doaction ) {
280
281 foreach ( (array) $post_ids as $post_id ) {
282 if ( ! current_user_can( 'moderate', $post_id ) ) {
283 wp_die( esc_html__( 'Sorry, you are not allowed to spam this item.', 'bbpress' ) );
284 }
285
286 if ( wp_check_post_lock( $post_id ) ) {
287 $locked++;
288 continue;
289 }
290
291 if ( ! bbp_spam_topic( $post_id ) ) {
292 wp_die( esc_html__( 'Error in spamming topic.', 'bbpress' ) );
293 }
294
295 $updated++;
296 }
297
298 $sendback = add_query_arg( array(
299 'updated' => $updated,
300 'ids' => implode( ',', $post_ids ),
301 'locked' => $locked
302 ), $sendback );
303
304 } elseif ( 'unspam' === $doaction ) {
305
306 foreach ( (array) $post_ids as $post_id ) {
307 if ( ! current_user_can( 'moderate', $post_id ) ) {
308 wp_die( esc_html__( 'Sorry, you are not allowed to unspam this topic.', 'bbpress' ) );
309 }
310
311 if ( wp_check_post_lock( $post_id ) ) {
312 $locked++;
313 continue;
314 }
315
316 if ( ! bbp_unspam_topic( $post_id ) ) {
317 wp_die( esc_html__( 'Error in unspamming topic.', 'bbpress' ) );
318 }
319
320 $updated++;
321 }
322
323 $sendback = add_query_arg( array(
324 'updated' => $updated,
325 'ids' => implode( ',', $post_ids ),
326 'locked' => $locked
327 ), $sendback );
328 }
329
330 return $sendback;
331 }
332
333 /**
334 * Add the topic attributes meta-box
335 *
336 * @since 2.0.0 bbPress (r2744)
337 */
338 public function attributes_metabox() {
339 add_meta_box(
340 'bbp_topic_attributes',
341 esc_html__( 'Topic Attributes', 'bbpress' ),
342 'bbp_topic_metabox',
343 $this->post_type,
344 'side',
345 'high'
346 );
347 }
348
349 /**
350 * Add the author info meta-box
351 *
352 * @since 2.0.0 bbPress (r2828)
353 */
354 public function author_metabox() {
355
356 // Bail if post_type is not a topic
357 if ( empty( $_GET['action'] ) || ( 'edit' !== $_GET['action'] ) ) {
358 return;
359 }
360
361 // Add the meta-box
362 add_meta_box(
363 'bbp_author_metabox',
364 esc_html__( 'Author Information', 'bbpress' ),
365 'bbp_author_metabox',
366 $this->post_type,
367 'side',
368 'high'
369 );
370 }
371
372 /**
373 * Add the replies meta-box
374 *
375 * Allows viewing & moderating of replies to a topic, based on the way
376 * comments are visible on a blog post.
377 *
378 * @since 2.6.0 bbPress (r5886)
379 */
380 public function replies_metabox() {
381
382 // Bail if post_type is not a reply
383 if ( empty( $_GET['action'] ) || ( 'edit' !== $_GET['action'] ) ) {
384 return;
385 }
386
387 // Add the meta-box
388 add_meta_box(
389 'bbp_topic_replies_metabox',
390 esc_html__( 'Replies', 'bbpress' ),
391 'bbp_topic_replies_metabox',
392 $this->post_type,
393 'normal',
394 'high'
395 );
396 }
397
398 /**
399 * Add the engagements meta-box
400 *
401 * Allows viewing of users who have engaged in a topic.
402 *
403 * @since 2.6.0 bbPress (r6333)
404 */
405 public function engagements_metabox() {
406
407 // Bail when creating a new topic
408 if ( empty( $_GET['action'] ) || ( 'edit' !== $_GET['action'] ) ) {
409 return;
410 }
411
412 // Bail if no engagements
413 if ( ! bbp_is_engagements_active() ) {
414 return;
415 }
416
417 // Add the meta-box
418 add_meta_box(
419 'bbp_topic_engagements_metabox',
420 esc_html__( 'Engagements', 'bbpress' ),
421 'bbp_topic_engagements_metabox',
422 $this->post_type,
423 'side',
424 'low'
425 );
426 }
427
428 /**
429 * Add the favorites meta-box
430 *
431 * Allows viewing of users who have favorited a topic.
432 *
433 * @since 2.6.0 bbPress (r6197)
434 */
435 public function favorites_metabox() {
436
437 // Bail if post_type is not a reply
438 if ( empty( $_GET['action'] ) || ( 'edit' !== $_GET['action'] ) ) {
439 return;
440 }
441
442 // Bail if no favorites
443 if ( ! bbp_is_favorites_active() ) {
444 return;
445 }
446
447 // Add the meta-box
448 add_meta_box(
449 'bbp_topic_favorites_metabox',
450 esc_html__( 'Favorites', 'bbpress' ),
451 'bbp_topic_favorites_metabox',
452 $this->post_type,
453 'normal',
454 'high'
455 );
456 }
457
458 /**
459 * Add the subscriptions meta-box
460 *
461 * Allows viewing of users who have subscribed to a topic.
462 *
463 * @since 2.6.0 bbPress (r6197)
464 */
465 public function subscriptions_metabox() {
466
467 // Bail if post_type is not a reply
468 if ( empty( $_GET['action'] ) || ( 'edit' !== $_GET['action'] ) ) {
469 return;
470 }
471
472 // Bail if no subscriptions
473 if ( ! bbp_is_subscriptions_active() ) {
474 return;
475 }
476
477 // Add the meta-box
478 add_meta_box(
479 'bbp_topic_subscriptions_metabox',
480 esc_html__( 'Subscriptions', 'bbpress' ),
481 'bbp_topic_subscriptions_metabox',
482 $this->post_type,
483 'normal',
484 'high'
485 );
486 }
487
488 /**
489 * Remove comments & discussion meta-boxes if comments are not supported
490 *
491 * @since 2.6.0 bbPress (r6186)
492 */
493 public function comments_metabox() {
494 if ( ! post_type_supports( $this->post_type, 'comments' ) ) {
495 remove_meta_box( 'commentstatusdiv', $this->post_type, 'normal' );
496 remove_meta_box( 'commentsdiv', $this->post_type, 'normal' );
497 }
498 }
499
500 /**
501 * Pass the topic attributes for processing
502 *
503 * @since 2.0.0 bbPress (r2746)
504 *
505 * @param int $topic_id Topic id
506 * @return int Parent id
507 */
508 public function save_meta_boxes( $topic_id ) {
509
510 // Bail if doing an autosave
511 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
512 return $topic_id;
513 }
514
515 // Bail if not a post request
516 if ( ! bbp_is_post_request() ) {
517 return $topic_id;
518 }
519
520 // Check action exists
521 if ( empty( $_POST['action'] ) ) {
522 return $topic_id;
523 }
524
525 // Nonce check
526 if ( empty( $_POST['bbp_topic_metabox'] ) || ! wp_verify_nonce( $_POST['bbp_topic_metabox'], 'bbp_topic_metabox_save' ) ) {
527 return $topic_id;
528 }
529
530 // Bail if current user cannot edit this topic
531 if ( ! current_user_can( 'edit_topic', $topic_id ) ) {
532 return $topic_id;
533 }
534
535 // Get the forum ID
536 $forum_id = ! empty( $_POST['parent_id'] ) ? (int) $_POST['parent_id'] : 0;
537
538 // Get topic author data
539 $anonymous_data = bbp_filter_anonymous_post_data();
540 $author_id = bbp_get_topic_author_id( $topic_id );
541 $is_edit = ( isset( $_POST['hidden_post_status'] ) && ( $_POST['hidden_post_status'] !== 'draft' ) );
542
543 // Formally update the topic
544 bbp_update_topic( $topic_id, $forum_id, $anonymous_data, $author_id, $is_edit );
545
546 // Allow other fun things to happen
547 do_action( 'bbp_topic_attributes_metabox_save', $topic_id, $forum_id );
548 do_action( 'bbp_author_metabox_save', $topic_id, $anonymous_data );
549
550 return $topic_id;
551 }
552
553 /**
554 * Toggle topic
555 *
556 * Handles the admin-side opening/closing, sticking/unsticking and
557 * spamming/unspamming of topics
558 *
559 * @since 2.0.0 bbPress (r2727)
560 */
561 public function toggle_topic() {
562
563 // Bail if not a topic toggle action
564 if ( ! bbp_is_get_request() || empty( $_GET['action'] ) || empty( $_GET['topic_id'] ) ) {
565 return;
566 }
567
568 // Bail if not an allowed action
569 $action = sanitize_key( $_GET['action'] );
570 if ( empty( $action ) || ! in_array( $action, $this->get_allowed_action_toggles(), true ) ) {
571 return;
572 }
573
574 // Bail if topic is missing
575 $topic_id = bbp_get_topic_id( $_GET['topic_id'] );
576 if ( ! bbp_get_topic( $topic_id ) ) {
577 wp_die( esc_html__( 'The topic was not found.', 'bbpress' ) );
578 }
579
580 // What is the user doing here?
581 if ( ! current_user_can( 'moderate', $topic_id ) ) {
582 wp_die( esc_html__( 'You do not have permission to do that.', 'bbpress' ) );
583 }
584
585 // Defaults
586 $post_data = array( 'ID' => $topic_id );
587 $message = '';
588 $success = false;
589
590 switch ( $action ) {
591 case 'bbp_toggle_topic_approve' :
592 check_admin_referer( 'approve-topic_' . $topic_id );
593
594 $is_approve = bbp_is_topic_public( $topic_id );
595 $message = ( true === $is_approve )
596 ? 'unapproved'
597 : 'approved';
598 $success = ( true === $is_approve )
599 ? bbp_unapprove_topic( $topic_id )
600 : bbp_approve_topic( $topic_id );
601
602 break;
603
604 case 'bbp_toggle_topic_close' :
605 check_admin_referer( 'close-topic_' . $topic_id );
606
607 $is_open = bbp_is_topic_open( $topic_id );
608 $message = ( true === $is_open )
609 ? 'closed'
610 : 'opened';
611 $success = ( true === $is_open )
612 ? bbp_close_topic( $topic_id )
613 : bbp_open_topic( $topic_id );
614
615 break;
616
617 case 'bbp_toggle_topic_stick' :
618 check_admin_referer( 'stick-topic_' . $topic_id );
619
620 $is_sticky = bbp_is_topic_sticky( $topic_id );
621 $is_super = ( false === $is_sticky ) && ! empty( $_GET['super'] ) && ( "1" === $_GET['super'] )
622 ? true
623 : false;
624 $message = ( true === $is_sticky )
625 ? 'unstuck'
626 : 'stuck';
627 $message = ( true === $is_super )
628 ? 'super_sticky'
629 : $message;
630 $success = ( true === $is_sticky )
631 ? bbp_unstick_topic( $topic_id )
632 : bbp_stick_topic( $topic_id, $is_super );
633
634 break;
635
636 case 'bbp_toggle_topic_spam' :
637 check_admin_referer( 'spam-topic_' . $topic_id );
638
639 $is_spam = bbp_is_topic_spam( $topic_id );
640 $message = ( true === $is_spam )
641 ? 'unspammed'
642 : 'spammed';
643 $success = ( true === $is_spam )
644 ? bbp_unspam_topic( $topic_id )
645 : bbp_spam_topic( $topic_id );
646
647 break;
648 }
649
650 // Setup the message
651 $retval = array(
652 'bbp_topic_toggle_notice' => $message,
653 'topic_id' => $topic_id
654 );
655
656 // Prepare for failure
657 if ( ( false === $success ) || is_wp_error( $success ) ) {
658 $retval['failed'] = '1';
659 }
660
661 // Filter all message args
662 $retval = apply_filters( 'bbp_toggle_topic_action_admin', $retval, $topic_id, $action );
663
664 // Do additional topic toggle actions (admin side)
665 do_action( 'bbp_toggle_topic_admin', $success, $post_data, $action, $retval );
666
667 // Redirect back to the topic
668 $redirect = add_query_arg( $retval, remove_query_arg( array( 'action', 'topic_id' ) ) );
669 bbp_redirect( $redirect );
670 }
671
672 /**
673 * Toggle topic notices
674 *
675 * Display the success/error notices from
676 * {@link BBP_Admin::toggle_topic()}
677 *
678 * @since 2.0.0 bbPress (r2727)
679 */
680 public function toggle_topic_notice() {
681
682 // Bail if missing topic toggle action
683 if ( ! bbp_is_get_request() || empty( $_GET['topic_id'] ) || empty( $_GET['bbp_topic_toggle_notice'] ) ) {
684 return;
685 }
686
687 // Bail if not an allowed notice
688 $notice = sanitize_key( $_GET['bbp_topic_toggle_notice'] );
689 if ( empty( $notice ) || ! in_array( $notice, $this->get_allowed_notice_toggles(), true ) ) {
690 return;
691 }
692
693 // Bail if no topic_id or notice
694 $topic_id = bbp_get_topic_id( $_GET['topic_id'] );
695 if ( empty( $topic_id ) ) {
696 return;
697 }
698
699 // Bail if topic is missing
700 if ( ! bbp_get_topic( $topic_id ) ) {
701 return;
702 }
703
704 // Use the title in the responses
705 $topic_title = bbp_get_topic_title( $topic_id );
706 $is_failure = ! empty( $_GET['failed'] );
707 $message = '';
708
709 // Which notice?
710 switch ( $notice ) {
711 case 'opened' :
712 $message = ( $is_failure === true )
713 ? sprintf( esc_html__( 'There was a problem opening the topic "%1$s".', 'bbpress' ), $topic_title )
714 : sprintf( esc_html__( 'Topic "%1$s" successfully opened.', 'bbpress' ), $topic_title );
715 break;
716
717 case 'closed' :
718 $message = ( $is_failure === true )
719 ? sprintf( esc_html__( 'There was a problem closing the topic "%1$s".', 'bbpress' ), $topic_title )
720 : sprintf( esc_html__( 'Topic "%1$s" successfully closed.', 'bbpress' ), $topic_title );
721 break;
722
723 case 'super_sticky' :
724 $message = ( $is_failure === true )
725 ? sprintf( esc_html__( 'There was a problem sticking the topic "%1$s" to front.', 'bbpress' ), $topic_title )
726 : sprintf( esc_html__( 'Topic "%1$s" successfully stuck to front.', 'bbpress' ), $topic_title );
727 break;
728
729 case 'stuck' :
730 $message = ( $is_failure === true )
731 ? sprintf( esc_html__( 'There was a problem sticking the topic "%1$s".', 'bbpress' ), $topic_title )
732 : sprintf( esc_html__( 'Topic "%1$s" successfully stuck.', 'bbpress' ), $topic_title );
733 break;
734
735 case 'unstuck' :
736 $message = ( $is_failure === true )
737 ? sprintf( esc_html__( 'There was a problem unsticking the topic "%1$s".', 'bbpress' ), $topic_title )
738 : sprintf( esc_html__( 'Topic "%1$s" successfully unstuck.', 'bbpress' ), $topic_title );
739 break;
740
741 case 'spammed' :
742 $message = ( $is_failure === true )
743 ? sprintf( esc_html__( 'There was a problem marking the topic "%1$s" as spam.', 'bbpress' ), $topic_title )
744 : sprintf( esc_html__( 'Topic "%1$s" successfully marked as spam.', 'bbpress' ), $topic_title );
745 break;
746
747 case 'unspammed' :
748 $message = ( $is_failure === true )
749 ? sprintf( esc_html__( 'There was a problem unmarking the topic "%1$s" as spam.', 'bbpress' ), $topic_title )
750 : sprintf( esc_html__( 'Topic "%1$s" successfully unmarked as spam.', 'bbpress' ), $topic_title );
751 break;
752
753 case 'approved' :
754 $message = ( $is_failure === true )
755 ? sprintf( esc_html__( 'There was a problem approving the topic "%1$s".', 'bbpress' ), $topic_title )
756 : sprintf( esc_html__( 'Topic "%1$s" successfully approved.', 'bbpress' ), $topic_title );
757 break;
758
759 case 'unapproved' :
760 $message = ( $is_failure === true )
761 ? sprintf( esc_html__( 'There was a problem unapproving the topic "%1$s".', 'bbpress' ), $topic_title )
762 : sprintf( esc_html__( 'Topic "%1$s" successfully unapproved.', 'bbpress' ), $topic_title );
763 break;
764 }
765
766 // Do additional topic toggle notice filters (admin side)
767 $message = apply_filters( 'bbp_toggle_topic_notice_admin', $message, $topic_id, $notice, $is_failure );
768 $class = ( $is_failure === true )
769 ? 'error'
770 : 'updated';
771
772 // Add the notice
773 bbp_admin()->add_notice( $message, $class, true );
774 }
775
776 /**
777 * Returns an array of keys used to sort row actions
778 *
779 * @since 2.6.0 bbPress (r6771)
780 *
781 * @return array
782 */
783 private function get_row_action_sort_order() {
784
785 // Filter & return
786 return (array) apply_filters( 'bbp_admin_topics_row_action_sort_order', array(
787 'edit',
788 'stick',
789 'approved',
790 'unapproved',
791 'closed',
792 'spam',
793 'unspam',
794 'trash',
795 'untrash',
796 'delete',
797 'view'
798 ) );
799 }
800
801 /**
802 * Returns an array of notice toggles
803 *
804 * @since 2.6.0 bbPress (r6396)
805 *
806 * @return array
807 */
808 private function get_allowed_notice_toggles() {
809
810 // Filter & return
811 return (array) apply_filters( 'bbp_admin_topics_allowed_notice_toggles', array(
812 'opened',
813 'closed',
814 'super_sticky',
815 'stuck',
816 'unstuck',
817 'spammed',
818 'unspammed',
819 'approved',
820 'unapproved'
821 ) );
822 }
823
824 /**
825 * Returns an array of notice toggles
826 *
827 * @since 2.6.0 bbPress (r6396)
828 *
829 * @return array
830 */
831 private function get_allowed_action_toggles() {
832
833 // Filter & return
834 return (array) apply_filters( 'bbp_admin_topics_allowed_action_toggles', array(
835 'bbp_toggle_topic_close',
836 'bbp_toggle_topic_stick',
837 'bbp_toggle_topic_spam',
838 'bbp_toggle_topic_approve'
839 ) );
840 }
841
842 /**
843 * Manage the column headers for the topics page
844 *
845 * @since 2.0.0 bbPress (r2485)
846 *
847 * @param array $columns The columns
848 *
849 * @return array $columns bbPress topic columns
850 */
851 public function column_headers( $columns ) {
852 $columns = array(
853 'cb' => '<input type="checkbox" />',
854 'title' => esc_html__( 'Topics', 'bbpress' ),
855 'bbp_topic_forum' => esc_html__( 'Forum', 'bbpress' ),
856 'bbp_topic_reply_count' => esc_html__( 'Replies', 'bbpress' ),
857 'bbp_topic_voice_count' => esc_html__( 'Voices', 'bbpress' ),
858 'bbp_topic_author' => esc_html__( 'Author', 'bbpress' ),
859 'bbp_topic_created' => esc_html__( 'Created', 'bbpress' ),
860 'bbp_topic_freshness' => esc_html__( 'Last Post', 'bbpress' )
861 );
862
863 // Filter & return
864 return (array) apply_filters( 'bbp_admin_topics_column_headers', $columns );
865 }
866
867 /**
868 * Print extra columns for the topics page
869 *
870 * @since 2.0.0 bbPress (r2485)
871 *
872 * @param string $column Column
873 * @param int $topic_id Topic id
874 */
875 public function column_data( $column, $topic_id ) {
876
877 // Get topic forum ID
878 $forum_id = bbp_get_topic_forum_id( $topic_id );
879
880 // Populate column data
881 switch ( $column ) {
882
883 // Forum
884 case 'bbp_topic_forum' :
885
886 // Get title
887 $forum_title = ! empty( $forum_id )
888 ? bbp_get_forum_title( $forum_id )
889 : '';
890
891 // Output forum name
892 if ( ! empty( $forum_title ) ) {
893 echo $forum_title;
894
895 // Output dash
896 } else {
897 ?>
898 <span aria-hidden="true">&mdash;</span>
899 <span class="screen-reader-text"><?php esc_html_e( 'No forum', 'bbpress' ); ?></span>
900 <?php
901 }
902
903 break;
904
905 // Reply Count
906 case 'bbp_topic_reply_count' :
907 bbp_topic_reply_count( $topic_id );
908 break;
909
910 // Reply Count
911 case 'bbp_topic_voice_count' :
912 bbp_topic_voice_count( $topic_id );
913 break;
914
915 // Author
916 case 'bbp_topic_author' :
917 bbp_topic_author_display_name( $topic_id );
918 break;
919
920 // Freshness
921 case 'bbp_topic_created':
922 printf( '%1$s <br /> %2$s',
923 get_the_date(),
924 esc_attr( get_the_time() )
925 );
926
927 break;
928
929 // Freshness
930 case 'bbp_topic_freshness' :
931 $last_active = bbp_get_topic_last_active_time( $topic_id, false );
932 if ( ! empty( $last_active ) ) {
933 echo esc_html( $last_active );
934 } else {
935 esc_html_e( 'No Replies', 'bbpress' ); // This should never happen
936 }
937
938 break;
939
940 // Do an action for anything else
941 default :
942 do_action( 'bbp_admin_topics_column_data', $column, $topic_id );
943 break;
944 }
945 }
946
947 /**
948 * Topic Row actions
949 *
950 * Remove the quick-edit action link under the topic title and add the
951 * content and close/stick/spam links
952 *
953 * @since 2.0.0 bbPress (r2485)
954 *
955 * @param array $actions Actions
956 * @param object $topic Topic object
957 *
958 * @return array $actions Actions
959 */
960 public function row_actions( $actions = array(), $topic = false ) {
961
962 // Disable quick edit (too much to do here)
963 unset( $actions['inline hide-if-no-js'] );
964
965 // View link
966 $view_link = bbp_get_topic_permalink( $topic->ID );
967
968 // Maybe add view=all
969 if ( ! in_array( $topic->post_status, array( bbp_get_closed_status_id(), bbp_get_public_status_id() ), true ) ) {
970 $view_link = bbp_add_view_all( $view_link, true );
971 }
972
973 // Show view link if it's not set, the topic is trashed and the user can view trashed topics
974 if ( empty( $actions['view'] ) && ( bbp_get_trash_status_id() === $topic->post_status ) && current_user_can( 'view_trash' ) ) {
975 $actions['view'] = '<a href="' . esc_url( $view_link ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;', 'bbpress' ), bbp_get_topic_title( $topic->ID ) ) ) . '" rel="permalink">' . esc_html__( 'View', 'bbpress' ) . '</a>';
976 }
977
978 // Only show the actions if the user is capable of viewing them :)
979 if ( current_user_can( 'moderate', $topic->ID ) ) {
980
981 // Pending
982 // Show the 'approve' and 'view' link on pending posts only and 'unapprove' on published posts only
983 $approve_uri = wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_approve' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'approve-topic_' . $topic->ID );
984 if ( bbp_is_topic_public( $topic->ID ) ) {
985 $actions['unapproved'] = '<a href="' . esc_url( $approve_uri ) . '" title="' . esc_attr__( 'Unapprove this topic', 'bbpress' ) . '">' . _x( 'Unapprove', 'Unapprove Topic', 'bbpress' ) . '</a>';
986 } else {
987
988 // Do not show 'approve' if already public
989 if ( ! bbp_is_topic_public( $topic->ID ) ) {
990 $actions['approved'] = '<a href="' . esc_url( $approve_uri ) . '" title="' . esc_attr__( 'Approve this topic', 'bbpress' ) . '">' . _x( 'Approve', 'Approve Topic', 'bbpress' ) . '</a>';
991 }
992
993 // Modify the view link
994 $actions['view'] = '<a href="' . esc_url( $view_link ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;', 'bbpress' ), bbp_get_topic_title( $topic->ID ) ) ) . '" rel="permalink">' . esc_html__( 'View', 'bbpress' ) . '</a>';
995 }
996
997 // Close
998 // Show the 'close' and 'open' link on published and closed posts only
999 if ( bbp_is_topic_public( $topic->ID ) ) {
1000 $close_uri = wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_close' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'close-topic_' . $topic->ID );
1001 if ( bbp_is_topic_open( $topic->ID ) ) {
1002 $actions['closed'] = '<a href="' . esc_url( $close_uri ) . '" title="' . esc_attr__( 'Close this topic', 'bbpress' ) . '">' . _x( 'Close', 'Close a Topic', 'bbpress' ) . '</a>';
1003 } else {
1004 $actions['closed'] = '<a href="' . esc_url( $close_uri ) . '" title="' . esc_attr__( 'Open this topic', 'bbpress' ) . '">' . _x( 'Open', 'Open a Topic', 'bbpress' ) . '</a>';
1005 }
1006 }
1007
1008 // Sticky
1009 // Dont show sticky if topic is spam, trash or pending
1010 if ( ! bbp_is_topic_spam( $topic->ID ) && ! bbp_is_topic_trash( $topic->ID ) && ! bbp_is_topic_pending( $topic->ID ) ) {
1011 $stick_uri = wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_stick' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'stick-topic_' . $topic->ID );
1012 if ( bbp_is_topic_sticky( $topic->ID ) ) {
1013 $actions['stick'] = '<a href="' . esc_url( $stick_uri ) . '" title="' . esc_attr__( 'Unstick this topic', 'bbpress' ) . '">' . esc_html__( 'Unstick', 'bbpress' ) . '</a>';
1014 } else {
1015 $super_uri = wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_stick', 'super' => '1' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'stick-topic_' . $topic->ID );
1016 $actions['stick'] = '<a href="' . esc_url( $stick_uri ) . '" title="' . esc_attr__( 'Stick this topic to its forum', 'bbpress' ) . '">' . esc_html__( 'Stick', 'bbpress' ) . '</a> <a href="' . esc_url( $super_uri ) . '" title="' . esc_attr__( 'Stick this topic to front', 'bbpress' ) . '">' . esc_html__( '(to front)', 'bbpress' ) . '</a>';
1017 }
1018 }
1019
1020 // Spam
1021 $spam_uri = wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_spam' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'spam-topic_' . $topic->ID );
1022 if ( ! bbp_is_topic_spam( $topic->ID ) ) {
1023 $actions['spam'] = '<a href="' . esc_url( $spam_uri ) . '" title="' . esc_attr__( 'Mark this topic as spam', 'bbpress' ) . '">' . esc_html__( 'Spam', 'bbpress' ) . '</a>';
1024 } else {
1025 $actions['unspam'] = '<a href="' . esc_url( $spam_uri ) . '" title="' . esc_attr__( 'Mark the topic as not spam', 'bbpress' ) . '">' . esc_html__( 'Not Spam', 'bbpress' ) . '</a>';
1026 }
1027 }
1028
1029 // Do not show trash links for spam topics, or spam links for trashed topics
1030 if ( current_user_can( 'delete_topic', $topic->ID ) ) {
1031 $trash_days = bbp_get_trash_days( bbp_get_topic_post_type() );
1032
1033 if ( bbp_get_trash_status_id() === $topic->post_status ) {
1034 $post_type_object = get_post_type_object( bbp_get_topic_post_type() );
1035 $actions['untrash'] = "<a title='" . esc_attr__( 'Restore this item from the Trash', 'bbpress' ) . "' href='" . esc_url( wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $topic->ID ) ), 'untrash-post_' . $topic->ID ) ) . "'>" . esc_html__( 'Restore', 'bbpress' ) . "</a>";
1036 } elseif ( ! empty( $trash_days ) ) {
1037 $actions['trash'] = "<a class='submitdelete' title='" . esc_attr__( 'Move this item to the Trash', 'bbpress' ) . "' href='" . esc_url( get_delete_post_link( $topic->ID ) ) . "'>" . esc_html__( 'Trash', 'bbpress' ) . "</a>";
1038 }
1039
1040 if ( ( bbp_get_trash_status_id() === $topic->post_status ) || empty( $trash_days ) ) {
1041 $actions['delete'] = "<a class='submitdelete' title='" . esc_attr__( 'Delete this item permanently', 'bbpress' ) . "' href='" . esc_url( get_delete_post_link( $topic->ID, '', true ) ) . "'>" . esc_html__( 'Delete Permanently', 'bbpress' ) . "</a>";
1042 }
1043 }
1044
1045 // Sort & return
1046 return $this->sort_row_actions( $actions );
1047 }
1048
1049 /**
1050 * Sort row actions by key
1051 *
1052 * @since 2.6.0
1053 *
1054 * @param array $actions
1055 *
1056 * @return array
1057 */
1058 private function sort_row_actions( $actions = array() ) {
1059
1060 // Return value
1061 $retval = array();
1062
1063 // Known row actions, in sort order
1064 $known_actions = $this->get_row_action_sort_order();
1065
1066 // Sort known actions, and keep any unknown ones
1067 foreach ( $known_actions as $key ) {
1068 if ( isset( $actions[ $key ] ) ) {
1069 $retval[ $key ] = $actions[ $key ];
1070 unset( $actions[ $key ] );
1071 }
1072 }
1073
1074 // Combine & return
1075 return $retval + $actions;
1076 }
1077
1078 /**
1079 * Add forum dropdown to topic and reply list table filters
1080 *
1081 * @since 2.0.0 bbPress (r2991)
1082 *
1083 * @return bool False. If post type is not topic or reply
1084 */
1085 public function filter_dropdown() {
1086
1087 // Get which forum is selected
1088 $selected = ! empty( $_GET['bbp_forum_id'] )
1089 ? (int) $_GET['bbp_forum_id']
1090 : 0;
1091
1092 // Show the forums dropdown
1093 bbp_dropdown( array(
1094 'selected' => $selected,
1095 'show_none' => esc_html__( 'In all forums', 'bbpress' )
1096 ) );
1097 }
1098
1099 /**
1100 * Add "Empty Spam" button for moderators
1101 *
1102 * @since 2.6.0 bbPress (r6791)
1103 */
1104 public function filter_empty_spam() {
1105
1106 // Bail if not viewing spam
1107 if ( empty( $_GET['post_status'] ) || ( bbp_get_spam_status_id() !== $_GET['post_status'] ) && current_user_can( 'moderate' ) ) {
1108 return;
1109 }
1110
1111 ?>
1112
1113 <div class="alignleft actions"><?php
1114
1115 // Output the nonce & button
1116 wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );
1117 submit_button(
1118 esc_attr__( 'Empty Spam', 'bbpress' ),
1119 'button-secondary apply',
1120 'delete_all',
1121 false
1122 );
1123
1124 ?></div><?php
1125 }
1126
1127 /**
1128 * Adjust the request query and include the forum id
1129 *
1130 * @since 2.0.0 bbPress (r2991)
1131 *
1132 * @param array $query_vars Query variables from {@link WP_Query}
1133 * @return array Processed Query Vars
1134 */
1135 function filter_post_rows( $query_vars ) {
1136
1137 // Add post_parent query_var if one is present
1138 if ( ! empty( $_GET['bbp_forum_id'] ) ) {
1139 $query_vars['meta_key'] = '_bbp_forum_id';
1140 $query_vars['meta_type'] = 'NUMERIC';
1141 $query_vars['meta_value'] = $_GET['bbp_forum_id'];
1142 }
1143
1144 // Return manipulated query_vars
1145 return $query_vars;
1146 }
1147
1148 /**
1149 * Custom user feedback messages for topic post type
1150 *
1151 * @since 2.0.0 bbPress (r3080)
1152 *
1153 * @global int $post_ID
1154 *
1155 * @param array $messages
1156 *
1157 * @return array
1158 */
1159 public function updated_messages( $messages ) {
1160 global $post_ID;
1161
1162 // URL for the current topic
1163 $topic_url = bbp_get_topic_permalink( $post_ID );
1164
1165 // Current topic's post_date
1166 $post_date = bbp_get_global_post_field( 'post_date', 'raw' );
1167
1168 // Messages array
1169 $messages[ $this->post_type ] = array(
1170 0 => '', // Left empty on purpose
1171
1172 // Updated
1173 1 => sprintf(
1174 '%1$s <a href="%2$s">%3$s</a>',
1175 esc_html__( 'Topic updated.', 'bbpress' ),
1176 $topic_url,
1177 esc_html__( 'View topic', 'bbpress' )
1178 ),
1179
1180 // Custom field updated
1181 2 => esc_html__( 'Custom field updated.', 'bbpress' ),
1182
1183 // Custom field deleted
1184 3 => esc_html__( 'Custom field deleted.', 'bbpress' ),
1185
1186 // Topic updated
1187 4 => esc_html__( 'Topic updated.', 'bbpress' ),
1188
1189 // Restored from revision
1190 // translators: %s: date and time of the revision
1191 5 => isset( $_GET['revision'] )
1192 ? sprintf( esc_html__( 'Topic restored to revision from %s', 'bbpress' ), wp_post_revision_title( (int) $_GET['revision'], false ) )
1193 : false,
1194
1195 // Topic created
1196 6 => sprintf(
1197 '%1$s <a href="%2$s">%3$s</a>',
1198 esc_html__( 'Topic created.', 'bbpress' ),
1199 $topic_url,
1200 esc_html__( 'View topic', 'bbpress' )
1201 ),
1202
1203 // Topic saved
1204 7 => esc_html__( 'Topic saved.', 'bbpress' ),
1205
1206 // Topic submitted
1207 8 => sprintf(
1208 '%1$s <a href="%2$s" target="_blank">%3$s</a>',
1209 esc_html__( 'Topic submitted.', 'bbpress' ),
1210 esc_url( add_query_arg( 'preview', 'true', $topic_url ) ),
1211 esc_html__( 'Preview topic', 'bbpress' )
1212 ),
1213
1214 // Topic scheduled
1215 9 => sprintf(
1216 '%1$s <a target="_blank" href="%2$s">%3$s</a>',
1217 sprintf(
1218 esc_html__( 'Topic scheduled for: %s.', 'bbpress' ),
1219 // translators: Publish box date format, see http://php.net/date
1220 '<strong>' . date_i18n( __( 'M j, Y @ G:i', 'bbpress' ), strtotime( $post_date ) ) . '</strong>'
1221 ),
1222 $topic_url,
1223 esc_html__( 'Preview topic', 'bbpress' )
1224 ),
1225
1226 // Topic draft updated
1227 10 => sprintf(
1228 '%1$s <a href="%2$s" target="_blank">%3$s</a>',
1229 esc_html__( 'Topic draft updated.', 'bbpress' ),
1230 esc_url( add_query_arg( 'preview', 'true', $topic_url ) ),
1231 esc_html__( 'Preview topic', 'bbpress' )
1232 ),
1233 );
1234
1235 return $messages;
1236 }
1237 }
1238 endif; // class_exists check
1239
1240 /**
1241 * Setup bbPress Topics Admin
1242 *
1243 * This is currently here to make hooking and unhooking of the admin UI easy.
1244 * It could use dependency injection in the future, but for now this is easier.
1245 *
1246 * @since 2.0.0 bbPress (r2596)
1247 *
1248 * @param WP_Screen $current_screen Current screen object
1249 */
1250 function bbp_admin_topics( $current_screen ) {
1251
1252 // Bail if not a forum screen
1253 if ( empty( $current_screen->post_type ) || ( bbp_get_topic_post_type() !== $current_screen->post_type ) ) {
1254 return;
1255 }
1256
1257 // Init the topics admin
1258 bbp_admin()->topics = new BBP_Topics_Admin();
1259 }
1260