diff -r c7c0fbc09788 -r 5e8dcbe22c24 web/wp-content/plugins/bbpress/includes/common/shortcodes.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/wp-content/plugins/bbpress/includes/common/shortcodes.php Tue Dec 04 18:43:10 2012 -0800 @@ -0,0 +1,737 @@ + function + */ + public $codes = array(); + + /** Functions *************************************************************/ + + /** + * Add the register_shortcodes action to bbp_init + * + * @since bbPress (r3031) + * + * @uses setup_globals() + * @uses add_shortcodes() + */ + public function __construct() { + $this->setup_globals(); + $this->add_shortcodes(); + } + + /** + * Shortcode globals + * + * @since bbPress (r3143) + * @access private + * + * @uses apply_filters() + */ + private function setup_globals() { + + // Setup the shortcodes + $this->codes = apply_filters( 'bbp_shortcodes', array( + + /** Forums ********************************************************/ + + 'bbp-forum-index' => array( $this, 'display_forum_index' ), // Forum Index + 'bbp-forum-form' => array( $this, 'display_forum_form' ), // Topic form + 'bbp-single-forum' => array( $this, 'display_forum' ), // Specific forum - pass an 'id' attribute + + /** Topics ********************************************************/ + + 'bbp-topic-index' => array( $this, 'display_topic_index' ), // Topic index + 'bbp-topic-form' => array( $this, 'display_topic_form' ), // Topic form + 'bbp-single-topic' => array( $this, 'display_topic' ), // Specific topic - pass an 'id' attribute + + /** Topic Tags ****************************************************/ + + 'bbp-topic-tags' => array( $this, 'display_topic_tags' ), // All topic tags in a cloud + 'bbp-single-tag' => array( $this, 'display_topics_of_tag' ), // Topics of Tag + + /** Replies *******************************************************/ + + 'bbp-reply-form' => array( $this, 'display_reply_form' ), // Reply form + 'bbp-single-reply' => array( $this, 'display_reply' ), // Specific reply - pass an 'id' attribute + + /** Views *********************************************************/ + + 'bbp-single-view' => array( $this, 'display_view' ), // Single view + + /** Account *******************************************************/ + + 'bbp-login' => array( $this, 'display_login' ), // Login + 'bbp-register' => array( $this, 'display_register' ), // Register + 'bbp-lost-pass' => array( $this, 'display_lost_pass' ), // Lost Password + ) ); + } + + /** + * Register the bbPress shortcodes + * + * @since bbPress (r3031) + * + * @uses add_shortcode() + * @uses do_action() + */ + private function add_shortcodes() { + foreach( (array) $this->codes as $code => $function ) { + add_shortcode( $code, $function ); + } + } + + /** + * Unset some globals in the $bbp object that hold query related info + * + * @since bbPress (r3034) + */ + private function unset_globals() { + $bbp = bbpress(); + + // Unset global queries + $bbp->forum_query = new stdClass; + $bbp->topic_query = new stdClass; + $bbp->reply_query = new stdClass; + + // Unset global ID's + $bbp->current_forum_id = 0; + $bbp->current_topic_id = 0; + $bbp->current_reply_id = 0; + $bbp->current_topic_tag_id = 0; + + // Reset the post data + wp_reset_postdata(); + } + + /** Output Buffers ********************************************************/ + + /** + * Start an output buffer. + * + * This is used to put the contents of the shortcode into a variable rather + * than outputting the HTML at run-time. This allows shortcodes to appear + * in the correct location in the_content() instead of when it's created. + * + * @since bbPress (r3079) + * + * @param string $query_name + * + * @uses bbp_set_query_name() + * @uses ob_start() + */ + private function start( $query_name = '' ) { + + // Set query name + bbp_set_query_name( $query_name ); + + // Remove 'bbp_replace_the_content' filter to prevent infinite loops + remove_filter( 'the_content', 'bbp_replace_the_content' ); + + // Start output buffer + ob_start(); + } + + /** + * Return the contents of the output buffer and flush its contents. + * + * @since bbPress( r3079) + * + * @uses BBP_Shortcodes::unset_globals() Cleans up global values + * @return string Contents of output buffer. + */ + private function end() { + + // Put output into usable variable + $output = ob_get_contents(); + + // Unset globals + $this->unset_globals(); + + // Flush the output buffer + ob_end_clean(); + + // Reset the query name + bbp_reset_query_name(); + + // Add 'bbp_replace_the_content' filter back (@see $this::start()) + add_filter( 'the_content', 'bbp_replace_the_content' ); + + return $output; + } + + /** Forum shortcodes ******************************************************/ + + /** + * Display an index of all visible root level forums in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @param array $attr + * @param string $content + * @uses bbp_has_forums() + * @uses get_template_part() + * @return string + */ + public function display_forum_index() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start( 'bbp_forum_archive' ); + + bbp_get_template_part( 'content', 'archive-forum' ); + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the contents of a specific forum ID in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @param array $attr + * @param string $content + * @uses get_template_part() + * @uses bbp_single_forum_description() + * @return string + */ + public function display_forum( $attr, $content = '' ) { + + // Sanity check required info + if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) ) + return $content; + + // Set passed attribute to $forum_id for clarity + $forum_id = bbpress()->current_forum_id = $attr['id']; + + // Bail if ID passed is not a forum + if ( !bbp_is_forum( $forum_id ) ) + return $content; + + // Start output buffer + $this->start( 'bbp_single_forum' ); + + // Check forum caps + if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) { + bbp_get_template_part( 'content', 'single-forum' ); + + // Forum is private and user does not have caps + } elseif ( bbp_is_forum_private( $forum_id, false ) ) { + bbp_get_template_part( 'feedback', 'no-access' ); + } + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the forum form in an output buffer and return to ensure + * post/page contents are displayed first. + * + * @since bbPress (r3566) + * + * @uses get_template_part() + */ + public function display_forum_form() { + + // Start output buffer + $this->start( 'bbp_forum_form' ); + + // Output templates + bbp_get_template_part( 'form', 'forum' ); + + // Return contents of output buffer + return $this->end(); + } + + /** Topic shortcodes ******************************************************/ + + /** + * Display an index of all visible root level topics in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @param array $attr + * @param string $content + * @uses bbp_get_hidden_forum_ids() + * @uses get_template_part() + * @return string + */ + public function display_topic_index() { + + // Unset globals + $this->unset_globals(); + + // Filter the query + if ( ! bbp_is_topic_archive() ) { + add_filter( 'bbp_before_has_topics_parse_args', array( $this, 'display_topic_index_query' ) ); + } + + // Start output buffer + $this->start( 'bbp_topic_archive' ); + + // Output template + bbp_get_template_part( 'content', 'archive-topic' ); + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the contents of a specific topic ID in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @param array $attr + * @param string $content + * @uses get_template_part() + * @return string + */ + public function display_topic( $attr, $content = '' ) { + + // Sanity check required info + if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) ) + return $content; + + // Unset globals + $this->unset_globals(); + + // Set passed attribute to $forum_id for clarity + $topic_id = bbpress()->current_topic_id = $attr['id']; + $forum_id = bbp_get_topic_forum_id( $topic_id ); + + // Bail if ID passed is not a topic + if ( !bbp_is_topic( $topic_id ) ) + return $content; + + // Reset the queries if not in theme compat + if ( !bbp_is_theme_compat_active() ) { + + $bbp = bbpress(); + + // Reset necessary forum_query attributes for topics loop to function + $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type(); + $bbp->forum_query->in_the_loop = true; + $bbp->forum_query->post = get_post( $forum_id ); + + // Reset necessary topic_query attributes for topics loop to function + $bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type(); + $bbp->topic_query->in_the_loop = true; + $bbp->topic_query->post = get_post( $topic_id ); + } + + // Start output buffer + $this->start( 'bbp_single_topic' ); + + // Check forum caps + if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) { + bbp_get_template_part( 'content', 'single-topic' ); + + // Forum is private and user does not have caps + } elseif ( bbp_is_forum_private( $forum_id, false ) ) { + bbp_get_template_part( 'feedback', 'no-access' ); + } + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the topic form in an output buffer and return to ensure + * post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @uses get_template_part() + */ + public function display_topic_form() { + + // Start output buffer + $this->start( 'bbp_topic_form' ); + + // Output templates + bbp_get_template_part( 'form', 'topic' ); + + // Return contents of output buffer + return $this->end(); + } + + /** Replies ***************************************************************/ + + /** + * Display the contents of a specific reply ID in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @param array $attr + * @param string $content + * @uses get_template_part() + * @return string + */ + public function display_reply( $attr, $content = '' ) { + + // Sanity check required info + if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) ) + return $content; + + // Unset globals + $this->unset_globals(); + + // Set passed attribute to $reply_id for clarity + $reply_id = bbpress()->current_reply_id = $attr['id']; + $forum_id = bbp_get_reply_forum_id( $reply_id ); + + // Bail if ID passed is not a reply + if ( !bbp_is_reply( $reply_id ) ) + return $content; + + // Reset the queries if not in theme compat + if ( !bbp_is_theme_compat_active() ) { + + $bbp = bbpress(); + + // Reset necessary forum_query attributes for replys loop to function + $bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type(); + $bbp->forum_query->in_the_loop = true; + $bbp->forum_query->post = get_post( $forum_id ); + + // Reset necessary reply_query attributes for replys loop to function + $bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type(); + $bbp->reply_query->in_the_loop = true; + $bbp->reply_query->post = get_post( $reply_id ); + } + + // Start output buffer + $this->start( 'bbp_single_reply' ); + + // Check forum caps + if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) { + bbp_get_template_part( 'content', 'single-reply' ); + + // Forum is private and user does not have caps + } elseif ( bbp_is_forum_private( $forum_id, false ) ) { + bbp_get_template_part( 'feedback', 'no-access' ); + } + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the reply form in an output buffer and return to ensure + * post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @uses get_template_part() + */ + public function display_reply_form() { + + // Start output buffer + $this->start( 'bbp_reply_form' ); + + // Output templates + bbp_get_template_part( 'form', 'reply' ); + + // Return contents of output buffer + return $this->end(); + } + + /** Topic Tags ************************************************************/ + + /** + * Display a tag cloud of all topic tags in an output buffer and return to + * ensure that post/page contents are displayed first. + * + * @since bbPress (r3110) + * + * @return string + */ + public function display_topic_tags() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start( 'bbp_topic_tags' ); + + // Output the topic tags + wp_tag_cloud( array( + 'smallest' => 9, + 'largest' => 38, + 'number' => 80, + 'taxonomy' => bbp_get_topic_tag_tax_id() + ) ); + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the contents of a specific topic tag in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3110) + * + * @param array $attr + * @param string $content + * @uses get_template_part() + * @return string + */ + public function display_topics_of_tag( $attr, $content = '' ) { + + // Sanity check required info + if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) ) + return $content; + + // Unset globals + $this->unset_globals(); + + // Filter the query + if ( ! bbp_is_topic_tag() ) { + add_filter( 'bbp_before_has_topics_parse_args', array( $this, 'display_topics_of_tag_query' ) ); + } + + // Start output buffer + $this->start( 'bbp_topic_tag' ); + + // Set passed attribute to $ag_id for clarity + bbpress()->current_topic_tag_id = $tag_id = $attr['id']; + + // Output template + bbp_get_template_part( 'content', 'archive-topic' ); + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display the contents of a specific topic tag in an output buffer + * and return to ensure that post/page contents are displayed first. + * + * @since bbPress (r3346) + * + * @param array $attr + * @param string $content + * @uses get_template_part() + * @return string + */ + public function display_topic_tag_form() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start( 'bbp_topic_tag_edit' ); + + // Output template + bbp_get_template_part( 'content', 'topic-tag-edit' ); + + // Return contents of output buffer + return $this->end(); + } + + /** Views *****************************************************************/ + + /** + * Display the contents of a specific view in an output buffer and return to + * ensure that post/page contents are displayed first. + * + * @since bbPress (r3031) + * + * @param array $attr + * @param string $content + * @uses get_template_part() + * @uses bbp_single_forum_description() + * @return string + */ + public function display_view( $attr, $content = '' ) { + + // Sanity check required info + if ( empty( $attr['id'] ) ) + return $content; + + // Set passed attribute to $view_id for clarity + $view_id = $attr['id']; + + // Start output buffer + $this->start( 'bbp_single_view' ); + + // Unset globals + $this->unset_globals(); + + // Load the view + bbp_view_query( $view_id ); + + // Output template + bbp_get_template_part( 'content', 'single-view' ); + + // Return contents of output buffer + return $this->end(); + } + + /** Account ***************************************************************/ + + /** + * Display a login form + * + * @since bbPress (r3302) + * + * @return string + */ + public function display_login() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start( 'bbp_login' ); + + // Output templates + if ( !is_user_logged_in() ) + bbp_get_template_part( 'form', 'user-login' ); + else + bbp_get_template_part( 'feedback', 'logged-in' ); + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display a register form + * + * @since bbPress (r3302) + * + * @return string + */ + public function display_register() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start( 'bbp_register' ); + + // Output templates + if ( !is_user_logged_in() ) + bbp_get_template_part( 'form', 'user-register' ); + else + bbp_get_template_part( 'feedback', 'logged-in' ); + + // Return contents of output buffer + return $this->end(); + } + + /** + * Display a lost password form + * + * @since bbPress (r3302) + * + * @return string + */ + public function display_lost_pass() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start( 'bbp_lost_pass' ); + + // Output templates + if ( !is_user_logged_in() ) + bbp_get_template_part( 'form', 'user-lost-pass' ); + else + bbp_get_template_part( 'feedback', 'logged-in' ); + + // Return contents of output buffer + return $this->end(); + } + + /** Other *****************************************************************/ + + /** + * Display a breadcrumb + * + * @since bbPress (r3302) + * + * @return string + */ + public function display_breadcrumb() { + + // Unset globals + $this->unset_globals(); + + // Start output buffer + $this->start(); + + // Output breadcrumb + bbp_breadcrumb(); + + // Return contents of output buffer + return $this->end(); + } + + /** Query Filters *********************************************************/ + + /** + * Filter the query for the topic index + * + * @since bbPress (r3637) + * + * @param array $args + * @return array + */ + public function display_topic_index_query( $args = array() ) { + $args['author'] = 0; + $args['show_stickies'] = true; + $args['order'] = 'DESC'; + return $args; + } + + /** + * Filter the query for topic tags + * + * @since bbPress (r3637) + * + * @param array $args + * @return array + */ + public function display_topics_of_tag_query( $args = array() ) { + $args['tax_query'] = array( array( + 'taxonomy' => bbp_get_topic_tag_tax_id(), + 'field' => 'id', + 'terms' => bbpress()->current_topic_tag_id + ) ); + + return $args; + } +} +endif;