setup_globals(); $this->setup_actions(); } /** * Setup the admin hooks, actions and filters * * @since bbPress (r2646) * @access private * * @uses add_action() To add various actions * @uses add_filter() To add various filters * @uses bbp_get_forum_post_type() To get the forum post type * @uses bbp_get_topic_post_type() To get the topic post type * @uses bbp_get_reply_post_type() To get the reply post type */ private function setup_actions() { // Add some general styling to the admin area add_action( 'bbp_admin_head', array( $this, 'admin_head' ) ); // Messages add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) ); // Topic column headers. add_filter( 'manage_' . $this->post_type . '_posts_columns', array( $this, 'column_headers' ) ); // Topic columns (in post row) add_action( 'manage_' . $this->post_type . '_posts_custom_column', array( $this, 'column_data' ), 10, 2 ); add_filter( 'post_row_actions', array( $this, 'row_actions' ), 10, 2 ); // Topic metabox actions add_action( 'add_meta_boxes', array( $this, 'attributes_metabox' ) ); add_action( 'save_post', array( $this, 'attributes_metabox_save' ) ); // Check if there are any bbp_toggle_topic_* requests on admin_init, also have a message displayed add_action( 'load-edit.php', array( $this, 'toggle_topic' ) ); add_action( 'admin_notices', array( $this, 'toggle_topic_notice' ) ); // Anonymous metabox actions add_action( 'add_meta_boxes', array( $this, 'author_metabox' ) ); // Add ability to filter topics and replies per forum add_filter( 'restrict_manage_posts', array( $this, 'filter_dropdown' ) ); add_filter( 'bbp_request', array( $this, 'filter_post_rows' ) ); // Contextual Help add_action( 'load-edit.php', array( $this, 'edit_help' ) ); add_action( 'load-post.php', array( $this, 'new_help' ) ); add_action( 'load-post-new.php', array( $this, 'new_help' ) ); } /** * Should we bail out of this method? * * @since bbPress (r4067) * @return boolean */ private function bail() { if ( !isset( get_current_screen()->post_type ) || ( $this->post_type !== get_current_screen()->post_type ) ) return true; return false; } /** * Admin globals * * @since bbPress (r2646) * @access private */ private function setup_globals() { $this->post_type = bbp_get_topic_post_type(); } /** Contextual Help *******************************************************/ /** * Contextual help for bbPress topic edit page * * @since bbPress (r3119) * @uses get_current_screen() */ public function edit_help() { if ( $this->bail() ) return; // Overview get_current_screen()->add_help_tab( array( 'id' => 'overview', 'title' => __( 'Overview', 'bbpress' ), 'content' => '
' . __( 'This screen displays the individual topics on your site. You can customize the display of this screen to suit your workflow.', 'bbpress' ) . '
' ) ); // Screen Content get_current_screen()->add_help_tab( array( 'id' => 'screen-content', 'title' => __( 'Screen Content', 'bbpress' ), 'content' => '' . __( 'You can customize the display of this screen’s contents in a number of ways:', 'bbpress' ) . '
' . '' . __( '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' ) . '
' . '' . __( 'You can also edit 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' ) . '
' . '' . __( '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' ) . '
' ) ); // Help Sidebar get_current_screen()->set_help_sidebar( '' . __( 'For more information:', 'bbpress' ) . '
' . '' . __( 'bbPress Documentation', 'bbpress' ) . '
' . '' . __( 'bbPress Support Forums', 'bbpress' ) . '
' ); } /** * Contextual help for bbPress topic edit page * * @since bbPress (r3119) * @uses get_current_screen() */ public function new_help() { if ( $this->bail() ) return; $customize_display = '' . __( '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' ) . '
'; get_current_screen()->add_help_tab( array( 'id' => 'customize-display', 'title' => __( 'Customizing This Display', 'bbpress' ), 'content' => $customize_display, ) ); get_current_screen()->add_help_tab( array( 'id' => 'title-topic-editor', 'title' => __( 'Title and Topic Editor', 'bbpress' ), 'content' => '' . __( 'Title - Enter a title for your topic. After you enter a title, you’ll see the permalink below, which you can edit.', 'bbpress' ) . '
' . '' . __( 'Topic Editor - 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' ) . '
' ) ); $publish_box = '' . __( 'Publish - 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' ) . '
'; if ( current_theme_supports( 'topic-thumbnails' ) && post_type_supports( 'topic', 'thumbnail' ) ) { $publish_box .= '' . __( 'Featured Image - 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' ) . '
'; } get_current_screen()->add_help_tab( array( 'id' => 'topic-attributes', 'title' => __( 'Topic Attributes', 'bbpress' ), 'content' => '' . __( 'Select the attributes that your topic should have:', 'bbpress' ) . '
' . '' . __( 'For more information:', 'bbpress' ) . '
' . '' . __( 'bbPress Documentation', 'bbpress' ) . '
' . '' . __( 'bbPress Support Forums', 'bbpress' ) . '
' ); } /** * Add the topic attributes metabox * * @since bbPress (r2744) * * @uses bbp_get_topic_post_type() To get the topic post type * @uses add_meta_box() To add the metabox * @uses do_action() Calls 'bbp_topic_attributes_metabox' */ public function attributes_metabox() { if ( $this->bail() ) return; add_meta_box ( 'bbp_topic_attributes', __( 'Topic Attributes', 'bbpress' ), 'bbp_topic_metabox', $this->post_type, 'side', 'high' ); do_action( 'bbp_topic_attributes_metabox' ); } /** * Pass the topic attributes for processing * * @since bbPress (r2746) * * @param int $topic_id Topic id * @uses current_user_can() To check if the current user is capable of * editing the topic * @uses do_action() Calls 'bbp_topic_attributes_metabox_save' with the * topic id and parent id * @return int Parent id */ public function attributes_metabox_save( $topic_id ) { if ( $this->bail() ) return $topic_id; // Bail if doing an autosave if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return $topic_id; // Bail if not a post request if ( ! bbp_is_post_request() ) return $topic_id; // Nonce check if ( empty( $_POST['bbp_topic_metabox'] ) || !wp_verify_nonce( $_POST['bbp_topic_metabox'], 'bbp_topic_metabox_save' ) ) return $topic_id; // Bail if current user cannot edit this topic if ( !current_user_can( 'edit_topic', $topic_id ) ) return $topic_id; // Get the forum ID $forum_id = !empty( $_POST['parent_id'] ) ? (int) $_POST['parent_id'] : 0; // Get topic author data $anonymous_data = bbp_filter_anonymous_post_data(); $author_id = bbp_get_topic_author_id( $topic_id ); $is_edit = (bool) isset( $_POST['save'] ); // Formally update the topic bbp_update_topic( $topic_id, $forum_id, $anonymous_data, $author_id, $is_edit ); // Stickies if ( !empty( $_POST['bbp_stick_topic'] ) && in_array( $_POST['bbp_stick_topic'], array( 'stick', 'super', 'unstick' ) ) ) { // What's the haps? switch ( $_POST['bbp_stick_topic'] ) { // Sticky in this forum case 'stick' : bbp_stick_topic( $topic_id ); break; // Super sticky in all forums case 'super' : bbp_stick_topic( $topic_id, true ); break; // Normal case 'unstick' : default : bbp_unstick_topic( $topic_id ); break; } } // Allow other fun things to happen do_action( 'bbp_topic_attributes_metabox_save', $topic_id, $forum_id ); do_action( 'bbp_author_metabox_save', $topic_id, $anonymous_data ); return $topic_id; } /** * Add the author info metabox * * @since bbPress (r2828) * * @uses bbp_get_topic() To get the topic * @uses bbp_get_reply() To get the reply * @uses bbp_get_topic_post_type() To get the topic post type * @uses bbp_get_reply_post_type() To get the reply post type * @uses add_meta_box() To add the metabox * @uses do_action() Calls 'bbp_author_metabox' with the topic/reply * id */ public function author_metabox() { if ( $this->bail() ) return; // Bail if post_type is not a topic if ( empty( $_GET['action'] ) || ( 'edit' !== $_GET['action'] ) ) return; // Add the metabox add_meta_box( 'bbp_author_metabox', __( 'Author Information', 'bbpress' ), 'bbp_author_metabox', $this->post_type, 'side', 'high' ); do_action( 'bbp_author_metabox', get_the_ID() ); } /** * Add some general styling to the admin area * * @since bbPress (r2464) * * @uses bbp_get_forum_post_type() To get the forum post type * @uses bbp_get_topic_post_type() To get the topic post type * @uses bbp_get_reply_post_type() To get the reply post type * @uses sanitize_html_class() To sanitize the classes * @uses do_action() Calls 'bbp_admin_head' */ public function admin_head() { if ( $this->bail() ) return; ?> bail() ) return; // Only proceed if GET is a topic toggle action if ( bbp_is_get_request() && !empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'bbp_toggle_topic_close', 'bbp_toggle_topic_stick', 'bbp_toggle_topic_spam' ) ) && !empty( $_GET['topic_id'] ) ) { $action = $_GET['action']; // What action is taking place? $topic_id = (int) $_GET['topic_id']; // What's the topic id? $success = false; // Flag $post_data = array( 'ID' => $topic_id ); // Prelim array $topic = bbp_get_topic( $topic_id ); // Bail if topic is missing if ( empty( $topic ) ) wp_die( __( 'The topic was not found!', 'bbpress' ) ); if ( !current_user_can( 'moderate', $topic->ID ) ) // What is the user doing here? wp_die( __( 'You do not have the permission to do that!', 'bbpress' ) ); switch ( $action ) { case 'bbp_toggle_topic_close' : check_admin_referer( 'close-topic_' . $topic_id ); $is_open = bbp_is_topic_open( $topic_id ); $message = true === $is_open ? 'closed' : 'opened'; $success = true === $is_open ? bbp_close_topic( $topic_id ) : bbp_open_topic( $topic_id ); break; case 'bbp_toggle_topic_stick' : check_admin_referer( 'stick-topic_' . $topic_id ); $is_sticky = bbp_is_topic_sticky( $topic_id ); $is_super = false === $is_sticky && !empty( $_GET['super'] ) && ( "1" === $_GET['super'] ) ? true : false; $message = true === $is_sticky ? 'unsticked' : 'sticked'; $message = true === $is_super ? 'super_sticked' : $message; $success = true === $is_sticky ? bbp_unstick_topic( $topic_id ) : bbp_stick_topic( $topic_id, $is_super ); break; case 'bbp_toggle_topic_spam' : check_admin_referer( 'spam-topic_' . $topic_id ); $is_spam = bbp_is_topic_spam( $topic_id ); $message = true === $is_spam ? 'unspammed' : 'spammed'; $success = true === $is_spam ? bbp_unspam_topic( $topic_id ) : bbp_spam_topic( $topic_id ); break; } $message = array( 'bbp_topic_toggle_notice' => $message, 'topic_id' => $topic->ID ); if ( false === $success || is_wp_error( $success ) ) $message['failed'] = '1'; // Do additional topic toggle actions (admin side) do_action( 'bbp_toggle_topic_admin', $success, $post_data, $action, $message ); // Redirect back to the topic $redirect = add_query_arg( $message, remove_query_arg( array( 'action', 'topic_id' ) ) ); wp_safe_redirect( $redirect ); // For good measure exit(); } } /** * Toggle topic notices * * Display the success/error notices from * {@link BBP_Admin::toggle_topic()} * * @since bbPress (r2727) * * @uses bbp_get_topic() To get the topic * @uses bbp_get_topic_title() To get the topic title of the topic * @uses esc_html() To sanitize the topic title * @uses apply_filters() Calls 'bbp_toggle_topic_notice_admin' with * message, topic id, notice and is it a failure */ public function toggle_topic_notice() { if ( $this->bail() ) return; // Only proceed if GET is a topic toggle action if ( bbp_is_get_request() && !empty( $_GET['bbp_topic_toggle_notice'] ) && in_array( $_GET['bbp_topic_toggle_notice'], array( 'opened', 'closed', 'super_sticked', 'sticked', 'unsticked', 'spammed', 'unspammed' ) ) && !empty( $_GET['topic_id'] ) ) { $notice = $_GET['bbp_topic_toggle_notice']; // Which notice? $topic_id = (int) $_GET['topic_id']; // What's the topic id? $is_failure = !empty( $_GET['failed'] ) ? true : false; // Was that a failure? // Bais if no topic_id or notice if ( empty( $notice ) || empty( $topic_id ) ) return; // Bail if topic is missing $topic = bbp_get_topic( $topic_id ); if ( empty( $topic ) ) return; $topic_title = bbp_get_topic_title( $topic->ID ); switch ( $notice ) { case 'opened' : $message = $is_failure === true ? sprintf( __( 'There was a problem opening the topic "%1$s".', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully opened.', 'bbpress' ), $topic_title ); break; case 'closed' : $message = $is_failure === true ? sprintf( __( 'There was a problem closing the topic "%1$s".', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully closed.', 'bbpress' ), $topic_title ); break; case 'super_sticked' : $message = $is_failure === true ? sprintf( __( 'There was a problem sticking the topic "%1$s" to front.', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully sticked to front.', 'bbpress' ), $topic_title ); break; case 'sticked' : $message = $is_failure === true ? sprintf( __( 'There was a problem sticking the topic "%1$s".', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully sticked.', 'bbpress' ), $topic_title ); break; case 'unsticked' : $message = $is_failure === true ? sprintf( __( 'There was a problem unsticking the topic "%1$s".', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully unsticked.', 'bbpress' ), $topic_title ); break; case 'spammed' : $message = $is_failure === true ? sprintf( __( 'There was a problem marking the topic "%1$s" as spam.', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully marked as spam.', 'bbpress' ), $topic_title ); break; case 'unspammed' : $message = $is_failure === true ? sprintf( __( 'There was a problem unmarking the topic "%1$s" as spam.', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully unmarked as spam.', 'bbpress' ), $topic_title ); break; } // Do additional topic toggle notice filters (admin side) $message = apply_filters( 'bbp_toggle_topic_notice_admin', $message, $topic->ID, $notice, $is_failure ); ?>