2762 lines
79 KiB
PHP
2762 lines
79 KiB
PHP
<?php
|
|
|
|
/**
|
|
* bbPress Reply Template Tags
|
|
*
|
|
* @package bbPress
|
|
* @subpackage TemplateTags
|
|
*/
|
|
|
|
// Exit if accessed directly
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/** Post Type *****************************************************************/
|
|
|
|
/**
|
|
* Return the unique id of the custom post type for replies
|
|
*
|
|
* @since 2.0.0 bbPress (r2857)
|
|
*
|
|
*/
|
|
function bbp_reply_post_type() {
|
|
echo bbp_get_reply_post_type();
|
|
}
|
|
/**
|
|
* Return the unique id of the custom post type for replies
|
|
*
|
|
* @since 2.0.0 bbPress (r2857)
|
|
*
|
|
* post type id
|
|
* @return string The unique reply post type id
|
|
*/
|
|
function bbp_get_reply_post_type() {
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_post_type', bbpress()->reply_post_type );
|
|
}
|
|
|
|
/**
|
|
* Return array of labels used by the reply post type
|
|
*
|
|
* @since 2.5.0 bbPress (r5129)
|
|
*
|
|
* @return array
|
|
*/
|
|
function bbp_get_reply_post_type_labels() {
|
|
|
|
// Filter & return
|
|
return (array) apply_filters( 'bbp_get_reply_post_type_labels', array(
|
|
'name' => esc_attr__( 'Replies', 'bbpress' ),
|
|
'menu_name' => esc_attr__( 'Replies', 'bbpress' ),
|
|
'singular_name' => esc_attr_x( 'Reply', 'noun', 'bbpress' ),
|
|
'all_items' => esc_attr__( 'All Replies', 'bbpress' ),
|
|
'add_new' => esc_attr__( 'Add New', 'bbpress' ),
|
|
'add_new_item' => esc_attr__( 'Create New Reply', 'bbpress' ),
|
|
'edit' => esc_attr__( 'Edit', 'bbpress' ),
|
|
'edit_item' => esc_attr__( 'Edit Reply', 'bbpress' ),
|
|
'new_item' => esc_attr__( 'New Reply', 'bbpress' ),
|
|
'view' => esc_attr__( 'View Reply', 'bbpress' ),
|
|
'view_item' => esc_attr__( 'View Reply', 'bbpress' ),
|
|
'view_items' => esc_attr__( 'View Replies', 'bbpress' ),
|
|
'search_items' => esc_attr__( 'Search Replies', 'bbpress' ),
|
|
'not_found' => esc_attr__( 'No replies found', 'bbpress' ),
|
|
'not_found_in_trash' => esc_attr__( 'No replies found in Trash', 'bbpress' ),
|
|
'filter_items_list' => esc_attr__( 'Filter replies list', 'bbpress' ),
|
|
'items_list' => esc_attr__( 'Replies list', 'bbpress' ),
|
|
'items_list_navigation' => esc_attr__( 'Replies list navigation', 'bbpress' ),
|
|
'parent_item_colon' => esc_attr__( 'Parent Topic:', 'bbpress' ),
|
|
'archives' => esc_attr__( 'Forum Replies', 'bbpress' ),
|
|
'attributes' => esc_attr__( 'Reply Attributes', 'bbpress' ),
|
|
'insert_into_item' => esc_attr__( 'Insert into reply', 'bbpress' ),
|
|
'uploaded_to_this_item' => esc_attr__( 'Uploaded to this reply', 'bbpress' ),
|
|
'featured_image' => esc_attr__( 'Reply Image', 'bbpress' ),
|
|
'set_featured_image' => esc_attr__( 'Set reply image', 'bbpress' ),
|
|
'remove_featured_image' => esc_attr__( 'Remove reply image', 'bbpress' ),
|
|
'use_featured_image' => esc_attr__( 'Use as reply image', 'bbpress' ),
|
|
'item_published' => esc_attr__( 'Reply published.', 'bbpress' ),
|
|
'item_published_privately' => esc_attr__( 'Reply published privately.', 'bbpress' ),
|
|
'item_reverted_to_draft' => esc_attr__( 'Reply reverted to draft.', 'bbpress' ),
|
|
'item_scheduled' => esc_attr__( 'Reply scheduled.', 'bbpress' ),
|
|
'item_updated' => esc_attr__( 'Reply updated.', 'bbpress' )
|
|
) );
|
|
}
|
|
|
|
/**
|
|
* Return array of reply post type rewrite settings
|
|
*
|
|
* @since 2.5.0 bbPress (r5129)
|
|
*
|
|
* @return array
|
|
*/
|
|
function bbp_get_reply_post_type_rewrite() {
|
|
|
|
// Filter & return
|
|
return (array) apply_filters( 'bbp_get_reply_post_type_rewrite', array(
|
|
'slug' => bbp_get_reply_slug(),
|
|
'with_front' => false
|
|
) );
|
|
}
|
|
|
|
/**
|
|
* Return array of features the reply post type supports
|
|
*
|
|
* @since 2.5.0 bbPress (r5129)
|
|
*
|
|
* @return array
|
|
*/
|
|
function bbp_get_reply_post_type_supports() {
|
|
|
|
// Filter & return
|
|
return (array) apply_filters( 'bbp_get_reply_post_type_supports', array(
|
|
'title',
|
|
'editor',
|
|
'revisions'
|
|
) );
|
|
}
|
|
|
|
/** Reply Loop Functions ******************************************************/
|
|
|
|
/**
|
|
* The main reply loop. WordPress makes this easy for us
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param array $args All the arguments supported by {@link WP_Query}
|
|
* @return object Multidimensional array of reply information
|
|
*/
|
|
function bbp_has_replies( $args = array() ) {
|
|
|
|
/** Defaults **************************************************************/
|
|
|
|
// Other defaults
|
|
$default_reply_search = bbp_sanitize_search_request( 'rs' );
|
|
$default_post_parent = ( bbp_is_single_topic() ) ? bbp_get_topic_id() : 'any';
|
|
$default_post_type = ( bbp_is_single_topic() && bbp_show_lead_topic() ) ? bbp_get_reply_post_type() : array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
|
|
$default_thread_replies = (bool) ( bbp_is_single_topic() && bbp_thread_replies() );
|
|
|
|
// Default query args
|
|
$default = array(
|
|
'post_type' => $default_post_type, // Only replies
|
|
'post_parent' => $default_post_parent, // Of this topic
|
|
'posts_per_page' => bbp_get_replies_per_page(), // This many
|
|
'paged' => bbp_get_paged(), // On this page
|
|
'orderby' => 'date', // Sorted by date
|
|
'order' => 'ASC', // Oldest to newest
|
|
'hierarchical' => $default_thread_replies, // Hierarchical replies
|
|
'ignore_sticky_posts' => true, // Stickies not supported
|
|
'update_post_term_cache' => false, // No terms to cache
|
|
|
|
// Conditionally prime the cache for all related posts
|
|
'update_post_family_cache' => true
|
|
);
|
|
|
|
// Only add 's' arg if searching for replies
|
|
// See https://bbpress.trac.wordpress.org/ticket/2607
|
|
if ( ! empty( $default_reply_search ) ) {
|
|
$default['s'] = $default_reply_search;
|
|
}
|
|
|
|
// What are the default allowed statuses (based on user caps)
|
|
if ( bbp_get_view_all( 'edit_others_replies' ) ) {
|
|
|
|
// Default view=all statuses
|
|
$post_statuses = array_keys( bbp_get_topic_statuses() );
|
|
|
|
// Add support for private status
|
|
if ( current_user_can( 'read_private_replies' ) ) {
|
|
$post_statuses[] = bbp_get_private_status_id();
|
|
}
|
|
|
|
// Join post statuses together
|
|
$default['post_status'] = $post_statuses;
|
|
|
|
// Lean on the 'perm' query var value of 'readable' to provide statuses
|
|
} else {
|
|
$default['perm'] = 'readable';
|
|
}
|
|
|
|
/** Setup *****************************************************************/
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, $default, 'has_replies' );
|
|
|
|
// Set posts_per_page value if replies are threaded
|
|
$replies_per_page = (int) $r['posts_per_page'];
|
|
if ( true === $r['hierarchical'] ) {
|
|
$r['posts_per_page'] = -1;
|
|
}
|
|
|
|
// Get bbPress
|
|
$bbp = bbpress();
|
|
|
|
// Call the query
|
|
$bbp->reply_query = new WP_Query( $r );
|
|
|
|
// Maybe prime the post author caches
|
|
if ( ! empty( $r['update_post_family_cache'] ) ) {
|
|
bbp_update_post_family_caches( $bbp->reply_query->posts );
|
|
}
|
|
|
|
// Add pagination values to query object
|
|
$bbp->reply_query->posts_per_page = (int) $replies_per_page;
|
|
$bbp->reply_query->paged = (int) $r['paged'];
|
|
|
|
// Never home, regardless of what parse_query says
|
|
$bbp->reply_query->is_home = false;
|
|
|
|
// Reset is_single if single topic
|
|
if ( bbp_is_single_topic() ) {
|
|
$bbp->reply_query->is_single = true;
|
|
}
|
|
|
|
// Only add reply to if query returned results
|
|
if ( ! empty( $bbp->reply_query->found_posts ) ) {
|
|
|
|
// Get reply to for each reply
|
|
foreach ( $bbp->reply_query->posts as &$post ) {
|
|
|
|
// Check for reply post type
|
|
if ( bbp_get_reply_post_type() === $post->post_type ) {
|
|
$reply_to = bbp_get_reply_to( $post->ID );
|
|
|
|
// Make sure it's a reply to a reply
|
|
if ( empty( $reply_to ) || ( bbp_get_reply_topic_id( $post->ID ) === $reply_to ) ) {
|
|
$reply_to = 0;
|
|
}
|
|
|
|
// Add reply_to to the post object so we can walk it later
|
|
$post->reply_to = $reply_to;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Only add pagination if query returned results
|
|
if ( ! empty( $bbp->reply_query->found_posts ) && ! empty( $bbp->reply_query->posts_per_page ) ) {
|
|
|
|
// Figure out total pages
|
|
if ( true === $r['hierarchical'] ) {
|
|
$walker = new BBP_Walker_Reply();
|
|
$total_pages = ceil( $walker->get_number_of_root_elements( $bbp->reply_query->posts ) / $bbp->reply_query->posts_per_page );
|
|
} else {
|
|
|
|
// Total for pagination boundaries
|
|
$total_pages = ( $bbp->reply_query->posts_per_page === $bbp->reply_query->found_posts )
|
|
? 1
|
|
: ceil( $bbp->reply_query->found_posts / $bbp->reply_query->posts_per_page );
|
|
|
|
// Pagination settings with filter
|
|
$bbp_replies_pagination = apply_filters( 'bbp_replies_pagination', array(
|
|
'base' => bbp_get_replies_pagination_base( bbp_get_topic_id() ),
|
|
'total' => $total_pages,
|
|
'current' => $bbp->reply_query->paged
|
|
) );
|
|
|
|
// Add pagination to query object
|
|
$bbp->reply_query->pagination_links = bbp_paginate_links( $bbp_replies_pagination );
|
|
}
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_has_replies', $bbp->reply_query->have_posts(), $bbp->reply_query );
|
|
}
|
|
|
|
/**
|
|
* Whether there are more replies available in the loop
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @return object Replies information
|
|
*/
|
|
function bbp_replies() {
|
|
|
|
// Put into variable to check against next
|
|
$have_posts = bbpress()->reply_query->have_posts();
|
|
|
|
// Reset the post data when finished
|
|
if ( empty( $have_posts ) ) {
|
|
wp_reset_postdata();
|
|
}
|
|
|
|
return $have_posts;
|
|
}
|
|
|
|
/**
|
|
* Loads up the current reply in the loop
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @return object Reply information
|
|
*/
|
|
function bbp_the_reply() {
|
|
return bbpress()->reply_query->the_post();
|
|
}
|
|
|
|
/**
|
|
* Output reply id
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param $reply_id Optional. Used to check emptiness
|
|
*/
|
|
function bbp_reply_id( $reply_id = 0 ) {
|
|
echo bbp_get_reply_id( $reply_id );
|
|
}
|
|
/**
|
|
* Return the id of the reply in a replies loop
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param $reply_id Optional. Used to check emptiness
|
|
* @return int The reply id
|
|
*/
|
|
function bbp_get_reply_id( $reply_id = 0 ) {
|
|
$bbp = bbpress();
|
|
$wp_query = bbp_get_wp_query();
|
|
|
|
// Easy empty checking
|
|
if ( ! empty( $reply_id ) && is_numeric( $reply_id ) ) {
|
|
$bbp_reply_id = $reply_id;
|
|
|
|
// Currently inside a replies loop
|
|
} elseif ( ! empty( $bbp->reply_query->in_the_loop ) && isset( $bbp->reply_query->post->ID ) ) {
|
|
$bbp_reply_id = $bbp->reply_query->post->ID;
|
|
|
|
// Currently inside a search loop
|
|
} elseif ( ! empty( $bbp->search_query->in_the_loop ) && isset( $bbp->search_query->post->ID ) && bbp_is_reply( $bbp->search_query->post->ID ) ) {
|
|
$bbp_reply_id = $bbp->search_query->post->ID;
|
|
|
|
// Currently viewing a forum
|
|
} elseif ( ( bbp_is_single_reply() || bbp_is_reply_edit() ) && ! empty( $bbp->current_reply_id ) ) {
|
|
$bbp_reply_id = $bbp->current_reply_id;
|
|
|
|
// Currently viewing a reply
|
|
} elseif ( ( bbp_is_single_reply() || bbp_is_reply_edit() ) && isset( $wp_query->post->ID ) ) {
|
|
$bbp_reply_id = $wp_query->post->ID;
|
|
|
|
// Fallback
|
|
} else {
|
|
$bbp_reply_id = 0;
|
|
}
|
|
|
|
// Filter & return
|
|
return (int) apply_filters( 'bbp_get_reply_id', $bbp_reply_id, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Gets a reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2787)
|
|
*
|
|
* @param int|object $reply reply id or reply object
|
|
* @param string $output Optional. OBJECT, ARRAY_A, or ARRAY_N. Default = OBJECT
|
|
* @param string $filter Optional Sanitation filter. See {@link sanitize_post()}
|
|
* @return mixed Null if error or reply (in specified form) if success
|
|
*/
|
|
function bbp_get_reply( $reply, $output = OBJECT, $filter = 'raw' ) {
|
|
|
|
// Maybe get ID from empty or int
|
|
if ( empty( $reply ) || is_numeric( $reply ) ) {
|
|
$reply = bbp_get_reply_id( $reply );
|
|
}
|
|
|
|
// Bail if no post object
|
|
$reply = get_post( $reply, OBJECT, $filter );
|
|
if ( empty( $reply ) ) {
|
|
return $reply;
|
|
}
|
|
|
|
// Bail if not correct post type
|
|
if ( $reply->post_type !== bbp_get_reply_post_type() ) {
|
|
return null;
|
|
}
|
|
|
|
// Default return value is OBJECT
|
|
$retval = $reply;
|
|
|
|
// Array A
|
|
if ( $output === ARRAY_A ) {
|
|
$retval = get_object_vars( $reply );
|
|
|
|
// Array N
|
|
} elseif ( $output === ARRAY_N ) {
|
|
$retval = array_values( get_object_vars( $reply ) );
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply', $retval, $reply, $output, $filter );
|
|
}
|
|
|
|
/**
|
|
* Output the link to the reply in the reply loop
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_permalink( $reply_id = 0 ) {
|
|
echo esc_url( bbp_get_reply_permalink( $reply_id ) );
|
|
}
|
|
/**
|
|
* Return the link to the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* and reply id
|
|
* @return string Permanent link to reply
|
|
*/
|
|
function bbp_get_reply_permalink( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_permalink', get_permalink( $reply_id ), $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the paginated url to the reply in the reply loop
|
|
*
|
|
* @since 2.0.0 bbPress (r2679)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_url( $reply_id = 0 ) {
|
|
echo esc_url( bbp_get_reply_url( $reply_id ) );
|
|
}
|
|
/**
|
|
* Return the paginated url to the reply in the reply loop
|
|
*
|
|
* @since 2.0.0 bbPress (r2679)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param string $redirect_to Optional. Pass a redirect value for use with
|
|
* shortcodes and other fun things.
|
|
* @return string Link to reply relative to paginated topic
|
|
*/
|
|
function bbp_get_reply_url( $reply_id = 0, $redirect_to = '' ) {
|
|
|
|
// Set needed variables
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$topic_id = 0;
|
|
|
|
// Juggle reply & topic IDs for unpretty URL formatting
|
|
if ( bbp_is_reply( $reply_id ) ) {
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
$topic = bbp_get_topic( $topic_id );
|
|
} elseif ( bbp_is_topic( $reply_id ) ) {
|
|
$topic_id = bbp_get_topic_id( $reply_id );
|
|
$topic = bbp_get_topic( $topic_id );
|
|
$reply_id = $topic_id;
|
|
}
|
|
|
|
// Hierarchical reply page
|
|
if ( bbp_thread_replies() ) {
|
|
$reply_page = 1;
|
|
|
|
// Standard reply page
|
|
} else {
|
|
$reply_page = ceil( (int) bbp_get_reply_position( $reply_id, $topic_id ) / (int) bbp_get_replies_per_page() );
|
|
}
|
|
|
|
// Get links & URLS
|
|
$reply_hash = '#post-' . $reply_id;
|
|
$topic_link = bbp_get_topic_permalink( $topic_id, $redirect_to );
|
|
$topic_url = remove_query_arg( 'view', $topic_link );
|
|
|
|
// Get vars needed to support pending topics with unpretty links
|
|
$has_slug = ! empty( $topic ) ? $topic->post_name : '';
|
|
$pretty = bbp_use_pretty_urls();
|
|
$published = ! bbp_is_topic_pending( $topic_id );
|
|
|
|
// Don't include pagination if on first page
|
|
if ( 1 >= $reply_page ) {
|
|
|
|
// Pretty permalinks
|
|
if ( ! empty( $has_slug ) && ! empty( $pretty ) && ! empty( $published ) ) {
|
|
$url = user_trailingslashit( $topic_url ) . $reply_hash;
|
|
|
|
// Unpretty links
|
|
} else {
|
|
$url = $topic_url . $reply_hash;
|
|
}
|
|
|
|
// Include pagination
|
|
} else {
|
|
|
|
// Pretty permalinks
|
|
if ( ! empty( $has_slug ) && ! empty( $pretty ) && ! empty( $published ) ) {
|
|
$url = trailingslashit( $topic_url ) . trailingslashit( bbp_get_paged_slug() ) . $reply_page;
|
|
$url = user_trailingslashit( $url ) . $reply_hash;
|
|
|
|
// Unpretty links
|
|
} else {
|
|
$url = add_query_arg( 'paged', $reply_page, $topic_url ) . $reply_hash;
|
|
}
|
|
}
|
|
|
|
// Add topic view query arg back to end if it is set
|
|
if ( bbp_get_view_all() ) {
|
|
$url = bbp_add_view_all( $url );
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_url', $url, $reply_id, $redirect_to );
|
|
}
|
|
|
|
/**
|
|
* Output the title of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_title( $reply_id = 0 ) {
|
|
echo bbp_get_reply_title( $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Return the title of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Title of reply
|
|
*/
|
|
function bbp_get_reply_title( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$title = get_the_title( $reply_id );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_title', $title, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Get empty reply title fallback.
|
|
*
|
|
* @since 2.5.0 bbPress (r5177)
|
|
*
|
|
* @param string $post_title Required. Reply Title
|
|
* @param int $post_id Required. Reply ID
|
|
* @return string Title of reply
|
|
*/
|
|
function bbp_get_reply_title_fallback( $post_title = '', $post_id = 0 ) {
|
|
|
|
// Bail if title not empty, or post is not a reply
|
|
if ( ! empty( $post_title ) || ! bbp_is_reply( $post_id ) ) {
|
|
return $post_title;
|
|
}
|
|
|
|
// Get reply topic title.
|
|
$topic_title = bbp_get_reply_topic_title( $post_id );
|
|
|
|
// Get empty reply title fallback.
|
|
$reply_title = sprintf( esc_html__( 'Reply To: %s', 'bbpress' ), $topic_title );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_title_fallback', $reply_title, $post_id, $topic_title );
|
|
}
|
|
|
|
/**
|
|
* Output the content of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. reply id
|
|
*/
|
|
function bbp_reply_content( $reply_id = 0 ) {
|
|
echo bbp_get_reply_content( $reply_id );
|
|
}
|
|
/**
|
|
* Return the content of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2780)
|
|
*
|
|
* @param int $reply_id Optional. reply id
|
|
* @return string Content of the reply
|
|
*/
|
|
function bbp_get_reply_content( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Check if password is required
|
|
if ( post_password_required( $reply_id ) ) {
|
|
return get_the_password_form();
|
|
}
|
|
|
|
$content = get_post_field( 'post_content', $reply_id );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_content', $content, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the excerpt of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2751)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param int $length Optional. Length of the excerpt. Defaults to 100 letters
|
|
*/
|
|
function bbp_reply_excerpt( $reply_id = 0, $length = 100 ) {
|
|
echo bbp_get_reply_excerpt( $reply_id, $length );
|
|
}
|
|
/**
|
|
* Return the excerpt of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2751)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param int $length Optional. Length of the excerpt. Defaults to 100
|
|
* letters
|
|
* @return string Reply Excerpt
|
|
*/
|
|
function bbp_get_reply_excerpt( $reply_id = 0, $length = 100 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$length = (int) $length;
|
|
$excerpt = get_post_field( 'post_excerpt', $reply_id );
|
|
|
|
if ( empty( $excerpt ) ) {
|
|
$excerpt = bbp_get_reply_content( $reply_id );
|
|
}
|
|
|
|
$excerpt = trim ( strip_tags( $excerpt ) );
|
|
|
|
// Multibyte support
|
|
if ( function_exists( 'mb_strlen' ) ) {
|
|
$excerpt_length = mb_strlen( $excerpt );
|
|
} else {
|
|
$excerpt_length = strlen( $excerpt );
|
|
}
|
|
|
|
if ( ! empty( $length ) && ( $excerpt_length > $length ) ) {
|
|
$excerpt = mb_substr( $excerpt, 0, $length - 1 );
|
|
$excerpt .= '…';
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_excerpt', $excerpt, $reply_id, $length );
|
|
}
|
|
|
|
/**
|
|
* Output the post date and time of a reply
|
|
*
|
|
* @since 2.2.0 bbPress (r4155)
|
|
*
|
|
* @param int $reply_id Optional. Reply id.
|
|
* @param bool $humanize Optional. Humanize output using time_since
|
|
* @param bool $gmt Optional. Use GMT
|
|
*/
|
|
function bbp_reply_post_date( $reply_id = 0, $humanize = false, $gmt = false ) {
|
|
echo bbp_get_reply_post_date( $reply_id, $humanize, $gmt );
|
|
}
|
|
/**
|
|
* Return the post date and time of a reply
|
|
*
|
|
* @since 2.2.0 bbPress (r4155)
|
|
*
|
|
* @param int $reply_id Optional. Reply id.
|
|
* @param bool $humanize Optional. Humanize output using time_since
|
|
* @param bool $gmt Optional. Use GMT
|
|
* @return string
|
|
*/
|
|
function bbp_get_reply_post_date( $reply_id = 0, $humanize = false, $gmt = false ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// 4 days, 4 hours ago
|
|
if ( ! empty( $humanize ) ) {
|
|
$gmt_s = ! empty( $gmt ) ? 'G' : 'U';
|
|
$date = get_post_time( $gmt_s, $gmt, $reply_id );
|
|
$time = false; // For filter below
|
|
$result = bbp_get_time_since( $date );
|
|
|
|
// August 4, 2012 at 2:37 pm
|
|
} else {
|
|
$date = get_post_time( get_option( 'date_format' ), $gmt, $reply_id, true );
|
|
$time = get_post_time( get_option( 'time_format' ), $gmt, $reply_id, true );
|
|
$result = sprintf( _x( '%1$s at %2$s', 'date at time', 'bbpress' ), $date, $time );
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_post_date', $result, $reply_id, $humanize, $gmt, $date, $time );
|
|
}
|
|
|
|
/**
|
|
* Append revisions to the reply content
|
|
*
|
|
* @since 2.0.0 bbPress (r2782)
|
|
*
|
|
* @param string $content Optional. Content to which we need to append the revisions to
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Content with the revisions appended
|
|
*/
|
|
function bbp_reply_content_append_revisions( $content = '', $reply_id = 0 ) {
|
|
|
|
// Bail if in admin or feed
|
|
if ( is_admin() || is_feed() ) {
|
|
return $content;
|
|
}
|
|
|
|
// Validate the ID
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_reply_append_revisions', $content . bbp_get_reply_revision_log( $reply_id ), $content, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the revision log of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2782)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_revision_log( $reply_id = 0 ) {
|
|
echo bbp_get_reply_revision_log( $reply_id );
|
|
}
|
|
/**
|
|
* Return the formatted revision log of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2782)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Revision log of the reply
|
|
*/
|
|
function bbp_get_reply_revision_log( $reply_id = 0 ) {
|
|
|
|
// Create necessary variables
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Show the topic reply log if this is a topic in a reply loop
|
|
if ( bbp_is_topic( $reply_id ) ) {
|
|
return bbp_get_topic_revision_log( $reply_id );
|
|
}
|
|
|
|
// Get the reply revision log (out of post meta
|
|
$revision_log = bbp_get_reply_raw_revision_log( $reply_id );
|
|
|
|
// Check reply and revision log exist
|
|
if ( empty( $reply_id ) || empty( $revision_log ) || ! is_array( $revision_log ) ) {
|
|
return false;
|
|
}
|
|
|
|
// Get the actual revisions
|
|
$revisions = bbp_get_reply_revisions( $reply_id );
|
|
if ( empty( $revisions ) ) {
|
|
return false;
|
|
}
|
|
|
|
$r = "\n\n" . '<ul id="bbp-reply-revision-log-' . esc_attr( $reply_id ) . '" class="bbp-reply-revision-log">' . "\n\n";
|
|
|
|
// Loop through revisions
|
|
foreach ( (array) $revisions as $revision ) {
|
|
|
|
if ( empty( $revision_log[ $revision->ID ] ) ) {
|
|
$author_id = $revision->post_author;
|
|
$reason = '';
|
|
} else {
|
|
$author_id = $revision_log[ $revision->ID ]['author'];
|
|
$reason = $revision_log[ $revision->ID ]['reason'];
|
|
}
|
|
|
|
$author = bbp_get_author_link( array( 'size' => 14, 'link_text' => bbp_get_reply_author_display_name( $revision->ID ), 'post_id' => $revision->ID ) );
|
|
$since = bbp_get_time_since( bbp_convert_date( $revision->post_modified ) );
|
|
|
|
$r .= "\t" . '<li id="bbp-reply-revision-log-' . esc_attr( $reply_id ) . '-item-' . esc_attr( $revision->ID ) . '" class="bbp-reply-revision-log-item">' . "\n";
|
|
if ( ! empty( $reason ) ) {
|
|
$r .= "\t\t" . sprintf( esc_html__( 'This reply was modified %1$s by %2$s. Reason: %3$s', 'bbpress' ), esc_html( $since ), $author, esc_html( $reason ) ) . "\n";
|
|
} else {
|
|
$r .= "\t\t" . sprintf( esc_html__( 'This reply was modified %1$s by %2$s.', 'bbpress' ), esc_html( $since ), $author ) . "\n";
|
|
}
|
|
$r .= "\t" . '</li>' . "\n";
|
|
|
|
}
|
|
|
|
$r .= "\n" . '</ul>' . "\n\n";
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_revision_log', $r, $reply_id );
|
|
}
|
|
/**
|
|
* Return the raw revision log of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2782)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Raw revision log of the reply
|
|
*/
|
|
function bbp_get_reply_raw_revision_log( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$revision_log = get_post_meta( $reply_id, '_bbp_revision_log', true );
|
|
$revision_log = ! empty( $revision_log )
|
|
? $revision_log
|
|
: array();
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_raw_revision_log', $revision_log, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Return the revisions of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2782)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string reply revisions
|
|
*/
|
|
function bbp_get_reply_revisions( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$revisions = wp_get_post_revisions( $reply_id, array( 'order' => 'ASC' ) );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_revisions', $revisions, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Return the revision count of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2782)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param boolean $integer Optional. Whether or not to format the result
|
|
* @return string reply revision count
|
|
*/
|
|
function bbp_get_reply_revision_count( $reply_id = 0, $integer = false ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$count = count( bbp_get_reply_revisions( $reply_id ) );
|
|
$filter = ( true === $integer )
|
|
? 'bbp_get_reply_revision_count_int'
|
|
: 'bbp_get_reply_revision_count';
|
|
|
|
return apply_filters( $filter, $count, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the status of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_status( $reply_id = 0 ) {
|
|
echo bbp_get_reply_status( $reply_id );
|
|
}
|
|
/**
|
|
* Return the status of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Status of reply
|
|
*/
|
|
function bbp_get_reply_status( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_status', get_post_status( $reply_id ), $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply publicly viewable?
|
|
*
|
|
* See bbp_get_public_reply_statuses() for public statuses.
|
|
*
|
|
* @since 2.6.0 bbPress (r6391)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return bool True if public, false if not.
|
|
*/
|
|
function bbp_is_reply_public( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$status = bbp_get_reply_status( $reply_id );
|
|
$public = bbp_get_public_reply_statuses();
|
|
$is_public = in_array( $status, $public, true );
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_public', $is_public, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply not spam or deleted?
|
|
*
|
|
* @since 2.0.0 bbPress (r3496)
|
|
* @since 2.6.0 bbPress (r6922) Returns false if topic is also not published
|
|
*
|
|
* @param int $reply_id Optional. Topic id
|
|
* @return bool True if published, false if not.
|
|
*/
|
|
function bbp_is_reply_published( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
$status = bbp_get_public_status_id();
|
|
$topic_status = bbp_is_topic_published( $topic_id );
|
|
$reply_status = ( bbp_get_reply_status( $reply_id ) === $status );
|
|
$retval = ( $reply_status && $topic_status );
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_published', (bool) $retval, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply marked as spam?
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return bool True if spam, false if not.
|
|
*/
|
|
function bbp_is_reply_spam( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$status = bbp_get_spam_status_id();
|
|
$reply_status = bbp_get_reply_status( $reply_id ) === $status;
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_spam', (bool) $reply_status, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply trashed?
|
|
*
|
|
* @since 2.0.0 bbPress (r2884)
|
|
*
|
|
* @param int $reply_id Optional. Topic id
|
|
* @return bool True if spam, false if not.
|
|
*/
|
|
function bbp_is_reply_trash( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$status = bbp_get_trash_status_id();
|
|
$reply_status = bbp_get_reply_status( $reply_id ) === $status;
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_trash', (bool) $reply_status, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply pending?
|
|
*
|
|
* @since 2.6.0 bbPress (r5507)
|
|
*
|
|
* @param int $reply_id Optional. Topic id
|
|
* @return bool True if pending, false if not.
|
|
*/
|
|
function bbp_is_reply_pending( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$status = bbp_get_pending_status_id();
|
|
$reply_status = bbp_get_reply_status( $reply_id ) === $status;
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_pending', (bool) $reply_status, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply private?
|
|
*
|
|
* @since 2.6.0 bbPress (r5507)
|
|
*
|
|
* @param int $reply_id Optional. Topic id
|
|
* @return bool True if private, false if not.
|
|
*/
|
|
function bbp_is_reply_private( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$status = bbp_get_private_status_id();
|
|
$reply_status = bbp_get_reply_status( $reply_id ) === $status;
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_private', (bool) $reply_status, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Is the reply by an anonymous user?
|
|
*
|
|
* @since 2.0.0 bbPress (r2753)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return bool True if the post is by an anonymous user, false if not.
|
|
*/
|
|
function bbp_is_reply_anonymous( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$retval = false;
|
|
|
|
if ( ! bbp_get_reply_author_id( $reply_id ) ) {
|
|
$retval = true;
|
|
|
|
} elseif ( get_post_meta( $reply_id, '_bbp_anonymous_name', true ) ) {
|
|
$retval = true;
|
|
|
|
} elseif ( get_post_meta( $reply_id, '_bbp_anonymous_email', true ) ) {
|
|
$retval = true;
|
|
}
|
|
|
|
// Filter & return
|
|
return (bool) apply_filters( 'bbp_is_reply_anonymous', $retval, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Deprecated. Use bbp_reply_author_display_name() instead.
|
|
*
|
|
* Output the author of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @deprecated 2.5.0 bbPress (r5119)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_author( $reply_id = 0 ) {
|
|
echo bbp_get_reply_author( $reply_id );
|
|
}
|
|
/**
|
|
* Deprecated. Use bbp_get_reply_author_display_name() instead.
|
|
*
|
|
* Return the author of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @deprecated 2.5.0 bbPress (r5119)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Author of reply
|
|
*/
|
|
function bbp_get_reply_author( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
if ( ! bbp_is_reply_anonymous( $reply_id ) ) {
|
|
$author = get_the_author_meta( 'display_name', bbp_get_reply_author_id( $reply_id ) );
|
|
} else {
|
|
$author = get_post_meta( $reply_id, '_bbp_anonymous_name', true );
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author', $author, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the author ID of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_author_id( $reply_id = 0 ) {
|
|
echo bbp_get_reply_author_id( $reply_id );
|
|
}
|
|
/**
|
|
* Return the author ID of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Author id of reply
|
|
*/
|
|
function bbp_get_reply_author_id( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$author_id = get_post_field( 'post_author', $reply_id );
|
|
|
|
// Filter & return
|
|
return (int) apply_filters( 'bbp_get_reply_author_id', $author_id, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the author display_name of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_author_display_name( $reply_id = 0 ) {
|
|
echo bbp_get_reply_author_display_name( $reply_id );
|
|
}
|
|
/**
|
|
* Return the author display_name of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string The display name of the author of the reply
|
|
*/
|
|
function bbp_get_reply_author_display_name( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// User is not a guest
|
|
if ( ! bbp_is_reply_anonymous( $reply_id ) ) {
|
|
|
|
// Get the author ID
|
|
$author_id = bbp_get_reply_author_id( $reply_id );
|
|
|
|
// Try to get a display name
|
|
$author_name = get_the_author_meta( 'display_name', $author_id );
|
|
|
|
// Fall back to user login
|
|
if ( empty( $author_name ) ) {
|
|
$author_name = get_the_author_meta( 'user_login', $author_id );
|
|
}
|
|
|
|
// User does not have an account
|
|
} else {
|
|
$author_name = get_post_meta( $reply_id, '_bbp_anonymous_name', true );
|
|
}
|
|
|
|
// Fallback if nothing could be found
|
|
if ( empty( $author_name ) ) {
|
|
$author_name = bbp_get_fallback_display_name( $reply_id );
|
|
}
|
|
|
|
// Encode possible UTF8 display names
|
|
if ( seems_utf8( $author_name ) === false ) {
|
|
$author_name = utf8_encode( $author_name );
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author_display_name', $author_name, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the author avatar of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param int $size Optional. Size of the avatar. Defaults to 40
|
|
*/
|
|
function bbp_reply_author_avatar( $reply_id = 0, $size = 40 ) {
|
|
echo bbp_get_reply_author_avatar( $reply_id, $size );
|
|
}
|
|
/**
|
|
* Return the author avatar of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param int $size Optional. Size of the avatar. Defaults to 40
|
|
* @return string Avatar of author of the reply
|
|
*/
|
|
function bbp_get_reply_author_avatar( $reply_id = 0, $size = 40 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
if ( ! empty( $reply_id ) ) {
|
|
// Check for anonymous user
|
|
if ( ! bbp_is_reply_anonymous( $reply_id ) ) {
|
|
$author_avatar = get_avatar( bbp_get_reply_author_id( $reply_id ), $size );
|
|
} else {
|
|
$author_avatar = get_avatar( get_post_meta( $reply_id, '_bbp_anonymous_email', true ), $size );
|
|
}
|
|
} else {
|
|
$author_avatar = '';
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author_avatar', $author_avatar, $reply_id, $size );
|
|
}
|
|
|
|
/**
|
|
* Output the author link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2717)
|
|
*
|
|
* @param array $args Optional. If it is an integer, it is used as reply id.
|
|
*/
|
|
function bbp_reply_author_link( $args = array() ) {
|
|
echo bbp_get_reply_author_link( $args );
|
|
}
|
|
/**
|
|
* Return the author link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2717)
|
|
*
|
|
* @param array $args Optional. If an integer, it is used as reply id.
|
|
* @return string Author link of reply
|
|
*/
|
|
function bbp_get_reply_author_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'post_id' => 0,
|
|
'link_title' => '',
|
|
'type' => 'both',
|
|
'size' => 80,
|
|
'sep' => '',
|
|
'show_role' => false
|
|
), 'get_reply_author_link' );
|
|
|
|
// Default return value
|
|
$author_link = '';
|
|
|
|
// Used as reply_id
|
|
$reply_id = is_numeric( $args )
|
|
? bbp_get_reply_id( $args )
|
|
: bbp_get_reply_id( $r['post_id'] );
|
|
|
|
// Reply ID is good
|
|
if ( ! empty( $reply_id ) ) {
|
|
|
|
// Get some useful reply information
|
|
$author_url = bbp_get_reply_author_url( $reply_id );
|
|
$anonymous = bbp_is_reply_anonymous( $reply_id );
|
|
|
|
// Tweak link title if empty
|
|
if ( empty( $r['link_title'] ) ) {
|
|
$author = bbp_get_reply_author_display_name( $reply_id );
|
|
$title = empty( $anonymous )
|
|
? esc_attr__( "View %s's profile", 'bbpress' )
|
|
: esc_attr__( "Visit %s's website", 'bbpress' );
|
|
|
|
$link_title = sprintf( $title, $author );
|
|
|
|
// Use what was passed if not
|
|
} else {
|
|
$link_title = $r['link_title'];
|
|
}
|
|
|
|
// Setup title and author_links array
|
|
$author_links = array();
|
|
$link_title = ! empty( $link_title )
|
|
? ' title="' . esc_attr( $link_title ) . '"'
|
|
: '';
|
|
|
|
// Get avatar (unescaped, because HTML)
|
|
if ( ( 'avatar' === $r['type'] ) || ( 'both' === $r['type'] ) ) {
|
|
$author_links['avatar'] = bbp_get_reply_author_avatar( $reply_id, $r['size'] );
|
|
}
|
|
|
|
// Get display name (escaped, because never HTML)
|
|
if ( ( 'name' === $r['type'] ) || ( 'both' === $r['type'] ) ) {
|
|
$author_links['name'] = esc_html( bbp_get_reply_author_display_name( $reply_id ) );
|
|
}
|
|
|
|
// Empty array
|
|
$links = array();
|
|
$sprint = '<span %1$s>%2$s</span>';
|
|
|
|
// Wrap each link
|
|
foreach ( $author_links as $link => $link_text ) {
|
|
$link_class = ' class="bbp-author-' . esc_attr( $link ) . '"';
|
|
$links[] = sprintf( $sprint, $link_class, $link_text );
|
|
}
|
|
|
|
// Juggle
|
|
$author_links = $links;
|
|
unset( $links );
|
|
|
|
// Filter sections
|
|
$sections = apply_filters( 'bbp_get_reply_author_links', $author_links, $r, $args );
|
|
|
|
// Assemble sections into author link
|
|
$author_link = implode( $r['sep'], $sections );
|
|
|
|
// Only wrap in link if profile exists
|
|
if ( empty( $anonymous ) && bbp_user_has_profile( bbp_get_reply_author_id( $reply_id ) ) ) {
|
|
$author_link = sprintf( '<a href="%1$s"%2$s%3$s>%4$s</a>', esc_url( $author_url ), $link_title, ' class="bbp-author-link"', $author_link );
|
|
}
|
|
|
|
// Role is not linked
|
|
if ( true === $r['show_role'] ) {
|
|
$author_link .= bbp_get_reply_author_role( array( 'reply_id' => $reply_id ) );
|
|
}
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author_link', $author_link, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the author url of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_author_url( $reply_id = 0 ) {
|
|
echo esc_url( bbp_get_reply_author_url( $reply_id ) );
|
|
}
|
|
/**
|
|
* Return the author url of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Author URL of the reply
|
|
*/
|
|
function bbp_get_reply_author_url( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Check for anonymous user or non-existant user
|
|
if ( ! bbp_is_reply_anonymous( $reply_id ) && bbp_user_has_profile( bbp_get_reply_author_id( $reply_id ) ) ) {
|
|
$author_url = bbp_get_user_profile_url( bbp_get_reply_author_id( $reply_id ) );
|
|
} else {
|
|
$author_url = get_post_meta( $reply_id, '_bbp_anonymous_website', true );
|
|
if ( empty( $author_url ) ) {
|
|
$author_url = '';
|
|
}
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author_url', $author_url, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the reply author email address
|
|
*
|
|
* @since 2.0.0 bbPress (r3445)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_author_email( $reply_id = 0 ) {
|
|
echo bbp_get_reply_author_email( $reply_id );
|
|
}
|
|
/**
|
|
* Return the reply author email address
|
|
*
|
|
* @since 2.0.0 bbPress (r3445)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Reply author email address
|
|
*/
|
|
function bbp_get_reply_author_email( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Not anonymous
|
|
if ( ! bbp_is_reply_anonymous( $reply_id ) ) {
|
|
|
|
// Use reply author email address
|
|
$user_id = bbp_get_reply_author_id( $reply_id );
|
|
$user = get_userdata( $user_id );
|
|
$author_email = ! empty( $user->user_email ) ? $user->user_email : '';
|
|
|
|
// Anonymous
|
|
} else {
|
|
|
|
// Get email from post meta
|
|
$author_email = get_post_meta( $reply_id, '_bbp_anonymous_email', true );
|
|
|
|
// Sanity check for missing email address
|
|
if ( empty( $author_email ) ) {
|
|
$author_email = '';
|
|
}
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author_email', $author_email, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the reply author role
|
|
*
|
|
* @since 2.1.0 bbPress (r3860)
|
|
*
|
|
* @param array $args Optional.
|
|
*/
|
|
function bbp_reply_author_role( $args = array() ) {
|
|
echo bbp_get_reply_author_role( $args );
|
|
}
|
|
/**
|
|
* Return the reply author role
|
|
*
|
|
* @since 2.1.0 bbPress (r3860)
|
|
*
|
|
* @param array $args Optional.
|
|
* @return string Reply author role
|
|
*/
|
|
function bbp_get_reply_author_role( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'reply_id' => 0,
|
|
'class' => false,
|
|
'before' => '<div class="bbp-author-role">',
|
|
'after' => '</div>'
|
|
), 'get_reply_author_role' );
|
|
|
|
$reply_id = bbp_get_reply_id( $r['reply_id'] );
|
|
$role = bbp_get_user_display_role( bbp_get_reply_author_id( $reply_id ) );
|
|
|
|
// Backwards compatibilty with old 'class' argument
|
|
if ( ! empty( $r['class'] ) ) {
|
|
$author_role = sprintf( '%1$s<div class="%2$s">%3$s</div>%4$s', $r['before'], esc_attr( $r['class'] ), esc_html( $role ), $r['after'] );
|
|
|
|
// Simpler before & after arguments
|
|
// https://bbpress.trac.wordpress.org/ticket/2557
|
|
} else {
|
|
$author_role = $r['before'] . $role . $r['after'];
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_author_role', $author_role, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the topic title a reply belongs to
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_topic_title( $reply_id = 0 ) {
|
|
echo bbp_get_reply_topic_title( $reply_id );
|
|
}
|
|
/**
|
|
* Return the topic title a reply belongs to
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string The topic title of the reply
|
|
*/
|
|
function bbp_get_reply_topic_title( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_topic_title', bbp_get_topic_title( $topic_id ), $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the topic id a reply belongs to
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_topic_id( $reply_id = 0 ) {
|
|
echo bbp_get_reply_topic_id( $reply_id );
|
|
}
|
|
/**
|
|
* Return the topic id a reply belongs to
|
|
*
|
|
* @since 2.0.0 bbPress (r2553)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return int The topic id of the reply
|
|
*/
|
|
function bbp_get_reply_topic_id( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$topic_id = (int) get_post_field( 'post_parent', $reply_id );
|
|
|
|
// Meta-data fallback
|
|
if ( empty( $topic_id ) ) {
|
|
$topic_id = (int) get_post_meta( $reply_id, '_bbp_topic_id', true );
|
|
}
|
|
|
|
// Filter
|
|
if ( ! empty( $topic_id ) ) {
|
|
$topic_id = (int) bbp_get_topic_id( $topic_id );
|
|
}
|
|
|
|
// Filter & return
|
|
return (int) apply_filters( 'bbp_get_reply_topic_id', $topic_id, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the forum id a reply belongs to
|
|
*
|
|
* @since 2.0.0 bbPress (r2679)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_forum_id( $reply_id = 0 ) {
|
|
echo bbp_get_reply_forum_id( $reply_id );
|
|
}
|
|
/**
|
|
* Return the forum id a reply belongs to
|
|
*
|
|
* @since 2.0.0 bbPress (r2679)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* id and reply id
|
|
* @return int The forum id of the reply
|
|
*/
|
|
function bbp_get_reply_forum_id( $reply_id = 0 ) {
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
$forum_id = (int) get_post_field( 'post_parent', $topic_id );
|
|
|
|
// Meta-data fallback
|
|
if ( empty( $forum_id ) ) {
|
|
$forum_id = (int) get_post_meta( $reply_id, '_bbp_forum_id', true );
|
|
}
|
|
|
|
// Filter
|
|
if ( ! empty( $forum_id ) ) {
|
|
$forum_id = (int) bbp_get_forum_id( $forum_id );
|
|
}
|
|
|
|
// Filter & return
|
|
return (int) apply_filters( 'bbp_get_reply_forum_id', $forum_id, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the ancestor reply id of a reply
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_ancestor_id( $reply_id = 0 ) {
|
|
echo bbp_get_reply_ancestor_id( $reply_id );
|
|
}
|
|
/**
|
|
* Return the ancestor reply id of a reply
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param in $reply_id Reply id
|
|
*/
|
|
function bbp_get_reply_ancestor_id( $reply_id = 0 ) {
|
|
|
|
// Validation
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
if ( empty( $reply_id ) ) {
|
|
return false;
|
|
}
|
|
|
|
// Find highest reply ancestor
|
|
$ancestor_id = $reply_id;
|
|
while ( $parent_id = bbp_get_reply_to( $ancestor_id ) ) {
|
|
if ( empty( $parent_id ) || ( $parent_id === $ancestor_id ) || ( bbp_get_reply_topic_id( $reply_id ) === $parent_id ) || ( $parent_id === $reply_id ) ) {
|
|
break;
|
|
}
|
|
$ancestor_id = $parent_id;
|
|
}
|
|
|
|
return (int) $ancestor_id;
|
|
}
|
|
|
|
/**
|
|
* Output the reply to id of a reply
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_to( $reply_id = 0 ) {
|
|
echo bbp_get_reply_to( $reply_id );
|
|
}
|
|
/**
|
|
* Return the reply to id of a reply
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return int The parent reply id of the reply
|
|
*/
|
|
function bbp_get_reply_to( $reply_id = 0 ) {
|
|
|
|
// Assume there is no reply_to set
|
|
$reply_to = 0;
|
|
|
|
// Check that reply_id is valid
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
|
|
// Get reply_to value
|
|
if ( ! empty( $reply_id ) ) {
|
|
$reply_to = (int) get_post_meta( $reply_id, '_bbp_reply_to', true );
|
|
}
|
|
|
|
// Filter & return
|
|
return (int) apply_filters( 'bbp_get_reply_to', $reply_to, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the link for the reply to
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param array $args
|
|
*/
|
|
function bbp_reply_to_link( $args = array() ) {
|
|
echo bbp_get_reply_to_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Return the link for a reply to a reply
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param array $args Arguments
|
|
* @return string Link for a reply to a reply
|
|
*/
|
|
function bbp_get_reply_to_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'reply_text' => esc_html_x( 'Reply', 'verb', 'bbpress' ),
|
|
'depth' => 0,
|
|
'add_below' => 'post',
|
|
'respond_id' => 'new-reply-' . bbp_get_topic_id(),
|
|
), 'get_reply_to_link' );
|
|
|
|
// Get the reply to use it's ID and post_parent
|
|
$reply = bbp_get_reply( $r['id'] );
|
|
$topic_id = bbp_get_reply_topic_id( $reply->ID );
|
|
|
|
// Bail if no reply or user cannot reply
|
|
if ( empty( $reply ) || empty( $topic_id ) || bbp_is_single_reply() || ! bbp_current_user_can_access_create_reply_form() ) {
|
|
return;
|
|
}
|
|
|
|
// Build the URI and return value
|
|
$uri = remove_query_arg( array( 'bbp_reply_to' ) );
|
|
$uri = add_query_arg( array( 'bbp_reply_to' => $reply->ID ) );
|
|
$uri = wp_nonce_url( $uri, 'respond_id_' . $reply->ID );
|
|
$uri = $uri . '#new-post';
|
|
|
|
// Only add onclick if replies are threaded
|
|
if ( bbp_thread_replies() ) {
|
|
|
|
// Array of classes to pass to moveForm
|
|
$move_form = array(
|
|
$r['add_below'] . '-' . $reply->ID,
|
|
$reply->ID,
|
|
$r['respond_id'],
|
|
$reply->post_parent
|
|
);
|
|
|
|
// Build the onclick
|
|
$onclick = ' onclick="return addReply.moveForm(\'' . implode( "','", $move_form ) . '\');"';
|
|
|
|
// No onclick if replies are not threaded
|
|
} else {
|
|
$onclick = '';
|
|
}
|
|
|
|
// Add $uri to the array, to be passed through the filter
|
|
$r['uri'] = $uri;
|
|
$retval = $r['link_before'] . '<a role="button" href="' . esc_url( $r['uri'] ) . '" class="bbp-reply-to-link"' . $onclick . '>' . $r['reply_text'] . '</a>' . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_to_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the reply to a reply cancellation link
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*/
|
|
function bbp_cancel_reply_to_link( $text = '' ) {
|
|
echo bbp_get_cancel_reply_to_link( $text );
|
|
}
|
|
/**
|
|
* Return the cancellation link for a reply to a reply
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @param string $text The cancel text
|
|
* @return string The cancellation link
|
|
*/
|
|
function bbp_get_cancel_reply_to_link( $text = '' ) {
|
|
|
|
// Bail if not hierarchical or editing a reply
|
|
if ( ! bbp_thread_replies() || bbp_is_reply_edit() ) {
|
|
return;
|
|
}
|
|
|
|
// Set default text
|
|
if ( empty( $text ) ) {
|
|
$text = esc_html__( 'Cancel', 'bbpress' );
|
|
}
|
|
|
|
// Replying to...
|
|
$reply_to = isset( $_GET['bbp_reply_to'] )
|
|
? (int) $_GET['bbp_reply_to']
|
|
: 0;
|
|
|
|
// Set visibility
|
|
$style = ! empty( $reply_to ) ? '' : ' style="display:none;"';
|
|
$link = remove_query_arg( array( 'bbp_reply_to', '_wpnonce' ) ) . "#post-{$reply_to}";
|
|
$retval = sprintf( '<a href="%1$s" id="bbp-cancel-reply-to-link"%2$s>%3$s</a>', esc_url( $link ), $style, esc_html( $text ) );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_cancel_reply_to_link', $retval, $link, $text );
|
|
}
|
|
|
|
/**
|
|
* Output the numeric position of a reply within a topic
|
|
*
|
|
* @since 2.0.0 bbPress (r2984)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param int $topic_id Optional. Topic id
|
|
*/
|
|
function bbp_reply_position( $reply_id = 0, $topic_id = 0 ) {
|
|
echo bbp_get_reply_position( $reply_id, $topic_id );
|
|
}
|
|
/**
|
|
* Return the numeric position of a reply within a topic
|
|
*
|
|
* @since 2.0.0 bbPress (r2984)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @param int $topic_id Optional. Topic id
|
|
* @return int Reply position
|
|
*/
|
|
function bbp_get_reply_position( $reply_id = 0, $topic_id = 0 ) {
|
|
|
|
// Get required data
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$reply_position = get_post_field( 'menu_order', $reply_id );
|
|
|
|
// Reply doesn't have a position so get the raw value
|
|
if ( empty( $reply_position ) ) {
|
|
|
|
// Get topic ID
|
|
$topic_id = ! empty( $topic_id )
|
|
? bbp_get_topic_id( $topic_id )
|
|
: bbp_get_reply_topic_id( $reply_id );
|
|
|
|
// Post is not the topic
|
|
if ( $reply_id !== $topic_id ) {
|
|
$reply_position = bbp_get_reply_position_raw( $reply_id, $topic_id );
|
|
|
|
// Update the reply position in the posts table so we'll never have
|
|
// to hit the DB again.
|
|
if ( ! empty( $reply_position ) ) {
|
|
bbp_update_reply_position( $reply_id, $reply_position );
|
|
}
|
|
|
|
// Topic's position is always 0
|
|
} else {
|
|
$reply_position = 0;
|
|
}
|
|
}
|
|
|
|
// Bump the position by one if the topic is included in the reply loop
|
|
if ( ! bbp_show_lead_topic() ) {
|
|
$reply_position++;
|
|
}
|
|
|
|
// Filter & return
|
|
return (int) apply_filters( 'bbp_get_reply_position', $reply_position, $reply_id, $topic_id );
|
|
}
|
|
|
|
/** Reply Admin Links *********************************************************/
|
|
|
|
/**
|
|
* Output admin links for reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param array $args See {@link bbp_get_reply_admin_links()}
|
|
*/
|
|
function bbp_reply_admin_links( $args = array() ) {
|
|
echo bbp_get_reply_admin_links( $args );
|
|
}
|
|
/**
|
|
* Return admin links for reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2667)
|
|
*
|
|
* @param array $args This function supports these arguments:
|
|
* - id: Optional. Reply id
|
|
* - before: HTML before the links. Defaults to
|
|
* '<span class="bbp-admin-links">'
|
|
* - after: HTML after the links. Defaults to '</span>'
|
|
* - sep: Separator. Defaults to ' | '
|
|
* - links: Array of the links to display. By default, edit, trash,
|
|
* spam, reply move, and topic split links are displayed
|
|
* @return string Reply admin links
|
|
*/
|
|
function bbp_get_reply_admin_links( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'before' => '<span class="bbp-admin-links">',
|
|
'after' => '</span>',
|
|
'sep' => ' | ',
|
|
'links' => array()
|
|
), 'get_reply_admin_links' );
|
|
|
|
$r['id'] = bbp_get_reply_id( $r['id'] );
|
|
|
|
// If post is a topic, return the topic admin links instead
|
|
if ( bbp_is_topic( $r['id'] ) ) {
|
|
return bbp_get_topic_admin_links( $args );
|
|
}
|
|
|
|
// If post is not a reply, return
|
|
if ( ! bbp_is_reply( $r['id'] ) ) {
|
|
return;
|
|
}
|
|
|
|
// If topic is trashed, do not show admin links
|
|
if ( bbp_is_topic_trash( bbp_get_reply_topic_id( $r['id'] ) ) ) {
|
|
return;
|
|
}
|
|
|
|
// If no links were passed, default to the standard
|
|
if ( empty( $r['links'] ) ) {
|
|
$r['links'] = apply_filters( 'bbp_reply_admin_links', array(
|
|
'edit' => bbp_get_reply_edit_link ( $r ),
|
|
'move' => bbp_get_reply_move_link ( $r ),
|
|
'split' => bbp_get_topic_split_link ( $r ),
|
|
'trash' => bbp_get_reply_trash_link ( $r ),
|
|
'spam' => bbp_get_reply_spam_link ( $r ),
|
|
'approve' => bbp_get_reply_approve_link( $r ),
|
|
'reply' => bbp_get_reply_to_link ( $r )
|
|
), $r['id'] );
|
|
}
|
|
|
|
// See if links need to be unset
|
|
$reply_status = bbp_get_reply_status( $r['id'] );
|
|
if ( in_array( $reply_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id(), bbp_get_pending_status_id() ), true ) ) {
|
|
|
|
// Spam link shouldn't be visible on trashed topics
|
|
if ( bbp_get_trash_status_id() === $reply_status ) {
|
|
unset( $r['links']['spam'] );
|
|
|
|
// Trash link shouldn't be visible on spam topics
|
|
} elseif ( bbp_get_spam_status_id() === $reply_status ) {
|
|
unset( $r['links']['trash'] );
|
|
}
|
|
}
|
|
|
|
// Process the admin links
|
|
$links = implode( $r['sep'], array_filter( $r['links'] ) );
|
|
$retval = $r['before'] . $links . $r['after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_admin_links', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the edit link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param array $args See {@link bbp_get_reply_edit_link()}
|
|
*/
|
|
function bbp_reply_edit_link( $args = array() ) {
|
|
echo bbp_get_reply_edit_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Return the edit link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param array $args This function supports these arguments:
|
|
* - id: Reply id
|
|
* - link_before: HTML before the link
|
|
* - link_after: HTML after the link
|
|
* - edit_text: Edit text. Defaults to 'Edit'
|
|
* @return string Reply edit link
|
|
*/
|
|
function bbp_get_reply_edit_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'edit_text' => esc_html__( 'Edit', 'bbpress' )
|
|
), 'get_reply_edit_link' );
|
|
|
|
// Get reply
|
|
$reply = bbp_get_reply( $r['id'] );
|
|
|
|
// Bypass check if user has caps
|
|
if ( ! current_user_can( 'edit_others_replies' ) ) {
|
|
|
|
// User cannot edit or it is past the lock time
|
|
if ( empty( $reply ) || ! current_user_can( 'edit_reply', $reply->ID ) || bbp_past_edit_lock( $reply->post_date_gmt ) ) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Get uri
|
|
$uri = bbp_get_reply_edit_url( $r['id'] );
|
|
|
|
// Bail if no uri
|
|
if ( empty( $uri ) ) {
|
|
return;
|
|
}
|
|
|
|
$retval = $r['link_before'] . '<a href="' . esc_url( $uri ) . '" class="bbp-reply-edit-link">' . $r['edit_text'] . '</a>' . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_edit_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output URL to the reply edit page
|
|
*
|
|
* @since 2.0.0 bbPress (r2753)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
*/
|
|
function bbp_reply_edit_url( $reply_id = 0 ) {
|
|
echo esc_url( bbp_get_reply_edit_url( $reply_id ) );
|
|
}
|
|
/**
|
|
* Return URL to the reply edit page
|
|
*
|
|
* @since 2.0.0 bbPress (r2753)
|
|
*
|
|
* @param int $reply_id Optional. Reply id
|
|
* @return string Reply edit url
|
|
*/
|
|
function bbp_get_reply_edit_url( $reply_id = 0 ) {
|
|
|
|
// Bail if no reply
|
|
$reply = bbp_get_reply( $reply_id );
|
|
if ( empty( $reply ) ) {
|
|
return;
|
|
}
|
|
|
|
$reply_link = bbp_remove_view_all( bbp_get_reply_permalink( $reply_id ) );
|
|
|
|
// Pretty permalinks, previously used `bbp_use_pretty_urls()`
|
|
// https://bbpress.trac.wordpress.org/ticket/3054
|
|
if ( false === strpos( $reply_link, '?' ) ) {
|
|
$url = trailingslashit( $reply_link ) . bbp_get_edit_slug();
|
|
$url = user_trailingslashit( $url );
|
|
|
|
// Unpretty permalinks
|
|
} else {
|
|
$url = add_query_arg( array(
|
|
bbp_get_reply_post_type() => $reply->post_name,
|
|
bbp_get_edit_rewrite_id() => '1'
|
|
), $reply_link );
|
|
}
|
|
|
|
// Maybe add view all
|
|
$url = bbp_add_view_all( $url );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_edit_url', $url, $reply_id );
|
|
}
|
|
|
|
/**
|
|
* Output the trash link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param array $args See {@link bbp_get_reply_trash_link()}
|
|
*/
|
|
function bbp_reply_trash_link( $args = array() ) {
|
|
echo bbp_get_reply_trash_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Return the trash link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param array $args This function supports these arguments:
|
|
* - id: Reply id
|
|
* - link_before: HTML before the link
|
|
* - link_after: HTML after the link
|
|
* - sep: Separator
|
|
* - trash_text: Trash text
|
|
* - restore_text: Restore text
|
|
* - delete_text: Delete text
|
|
* @return string Reply trash link
|
|
*/
|
|
function bbp_get_reply_trash_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'sep' => ' | ',
|
|
'trash_text' => esc_html__( 'Trash', 'bbpress' ),
|
|
'restore_text' => esc_html__( 'Restore', 'bbpress' ),
|
|
'delete_text' => esc_html__( 'Delete', 'bbpress' )
|
|
), 'get_reply_trash_link' );
|
|
|
|
// Get reply
|
|
$reply = bbp_get_reply( $r['id'] );
|
|
|
|
// Bail if no reply or current user cannot delete
|
|
if ( empty( $reply ) || ! current_user_can( 'delete_reply', $reply->ID ) ) {
|
|
return;
|
|
}
|
|
|
|
$actions = array();
|
|
$trash_days = bbp_get_trash_days( bbp_get_reply_post_type() );
|
|
|
|
// Trashed
|
|
if ( bbp_is_reply_trash( $reply->ID ) ) {
|
|
$actions['untrash'] = '<a title="' . esc_attr__( 'Restore this item from the Trash', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_reply_trash', 'sub_action' => 'untrash', 'reply_id' => $reply->ID ) ), 'untrash-' . $reply->post_type . '_' . $reply->ID ) ) . '" class="bbp-reply-restore-link">' . $r['restore_text'] . '</a>';
|
|
|
|
// Trash
|
|
} elseif ( ! empty( $trash_days ) ) {
|
|
$actions['trash'] = '<a title="' . esc_attr__( 'Move this item to the Trash', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_reply_trash', 'sub_action' => 'trash', 'reply_id' => $reply->ID ) ), 'trash-' . $reply->post_type . '_' . $reply->ID ) ) . '" class="bbp-reply-trash-link">' . $r['trash_text'] . '</a>';
|
|
}
|
|
|
|
// No trash
|
|
if ( bbp_is_reply_trash( $reply->ID ) || empty( $trash_days ) ) {
|
|
$actions['delete'] = '<a title="' . esc_attr__( 'Delete this item permanently', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_reply_trash', 'sub_action' => 'delete', 'reply_id' => $reply->ID ) ), 'delete-' . $reply->post_type . '_' . $reply->ID ) ) . '" onclick="return confirm(\'' . esc_js( __( 'Are you sure you want to delete that permanently?', 'bbpress' ) ) . '\' );" class="bbp-reply-delete-link">' . $r['delete_text'] . '</a>';
|
|
}
|
|
|
|
// Process the admin links
|
|
$retval = $r['link_before'] . implode( $r['sep'], $actions ) . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_trash_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the spam link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param array $args See {@link bbp_get_reply_spam_link()}
|
|
*/
|
|
function bbp_reply_spam_link( $args = array() ) {
|
|
echo bbp_get_reply_spam_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Return the spam link of the reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2740)
|
|
*
|
|
* @param array $args This function supports these arguments:
|
|
* - id: Reply id
|
|
* - link_before: HTML before the link
|
|
* - link_after: HTML after the link
|
|
* - spam_text: Spam text
|
|
* - unspam_text: Unspam text
|
|
* @return string Reply spam link
|
|
*/
|
|
function bbp_get_reply_spam_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'spam_text' => esc_html__( 'Spam', 'bbpress' ),
|
|
'unspam_text' => esc_html__( 'Unspam', 'bbpress' )
|
|
), 'get_reply_spam_link' );
|
|
|
|
// Get reply
|
|
$reply = bbp_get_reply( $r['id'] );
|
|
|
|
// Bail if no reply or current user cannot moderate
|
|
if ( empty( $reply ) || ! current_user_can( 'moderate', $reply->ID ) ) {
|
|
return;
|
|
}
|
|
|
|
$display = bbp_is_reply_spam( $reply->ID ) ? $r['unspam_text'] : $r['spam_text'];
|
|
$uri = add_query_arg( array( 'action' => 'bbp_toggle_reply_spam', 'reply_id' => $reply->ID ) );
|
|
$uri = wp_nonce_url( $uri, 'spam-reply_' . $reply->ID );
|
|
$retval = $r['link_before'] . '<a href="' . esc_url( $uri ) . '" class="bbp-reply-spam-link">' . $display . '</a>' . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_spam_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Move reply link
|
|
*
|
|
* Output the move link of the reply
|
|
*
|
|
* @since 2.3.0 bbPress (r4521)
|
|
*
|
|
* @param array $args See {@link bbp_get_reply_move_link()}
|
|
*/
|
|
function bbp_reply_move_link( $args = array() ) {
|
|
echo bbp_get_reply_move_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Get move reply link
|
|
*
|
|
* Return the move link of the reply
|
|
*
|
|
* @since 2.3.0 bbPress (r4521)
|
|
*
|
|
* @param array $args This function supports these arguments:
|
|
* - id: Reply id
|
|
* - link_before: HTML before the link
|
|
* - link_after: HTML after the link
|
|
* - move_text: Move text
|
|
* - move_title: Move title attribute
|
|
* @return string Reply move link
|
|
*/
|
|
function bbp_get_reply_move_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'split_text' => esc_html__( 'Move', 'bbpress' ),
|
|
'split_title' => esc_attr__( 'Move this reply', 'bbpress' )
|
|
), 'get_reply_move_link' );
|
|
|
|
// Get IDs
|
|
$reply_id = bbp_get_reply_id( $r['id'] );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
|
|
// Bail if no reply ID or user cannot moderate
|
|
if ( empty( $reply_id ) || ! current_user_can( 'moderate', $topic_id ) ) {
|
|
return;
|
|
}
|
|
|
|
$uri = add_query_arg( array(
|
|
'action' => 'move',
|
|
'reply_id' => $reply_id
|
|
), bbp_get_reply_edit_url( $reply_id ) );
|
|
|
|
$retval = $r['link_before'] . '<a href="' . esc_url( $uri ) . '" title="' . $r['split_title'] . '" class="bbp-reply-move-link">' . $r['split_text'] . '</a>' . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_move_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Split topic link
|
|
*
|
|
* Output the split link of the topic (but is bundled with each reply)
|
|
*
|
|
* @since 2.0.0 bbPress (r2756)
|
|
*
|
|
* @param array $args See {@link bbp_get_topic_split_link()}
|
|
*/
|
|
function bbp_topic_split_link( $args = array() ) {
|
|
echo bbp_get_topic_split_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Get split topic link
|
|
*
|
|
* Return the split link of the topic (but is bundled with each reply)
|
|
*
|
|
* @since 2.0.0 bbPress (r2756)
|
|
*
|
|
* @param array $args This function supports these arguments:
|
|
* - id: Reply id
|
|
* - link_before: HTML before the link
|
|
* - link_after: HTML after the link
|
|
* - split_text: Split text
|
|
* - split_title: Split title attribute
|
|
* @return string Topic split link
|
|
*/
|
|
function bbp_get_topic_split_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'split_text' => esc_html__( 'Split', 'bbpress' ),
|
|
'split_title' => esc_attr__( 'Split the topic from this reply', 'bbpress' )
|
|
), 'get_topic_split_link' );
|
|
|
|
// Get IDs
|
|
$reply_id = bbp_get_reply_id( $r['id'] );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
|
|
// Bail if no reply/topic ID, or user cannot moderate
|
|
if ( empty( $reply_id ) || empty( $topic_id ) || ! current_user_can( 'moderate', $topic_id ) ) {
|
|
return;
|
|
}
|
|
|
|
$uri = add_query_arg( array(
|
|
'action' => 'split',
|
|
'reply_id' => $reply_id
|
|
), bbp_get_topic_edit_url( $topic_id ) );
|
|
|
|
$retval = $r['link_before'] . '<a href="' . esc_url( $uri ) . '" title="' . $r['split_title'] . '" class="bbp-topic-split-link">' . $r['split_text'] . '</a>' . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_topic_split_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the approve link of the reply
|
|
*
|
|
* @since 2.6.0 bbPress (r5507)
|
|
*
|
|
* @param array $args See {@link bbp_get_reply_approve_link()}
|
|
*/
|
|
function bbp_reply_approve_link( $args = array() ) {
|
|
echo bbp_get_reply_approve_link( $args );
|
|
}
|
|
|
|
/**
|
|
* Return the approve link of the reply
|
|
*
|
|
* @since 2.6.0 bbPress (r5507)
|
|
*
|
|
* @param array $args This function supports these args:
|
|
* - id: Optional. Reply id
|
|
* - link_before: Before the link
|
|
* - link_after: After the link
|
|
* - sep: Separator between links
|
|
* - approve_text: Approve text
|
|
* - unapprove_text: Unapprove text
|
|
* @return string Reply approve link
|
|
*/
|
|
function bbp_get_reply_approve_link( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'id' => 0,
|
|
'link_before' => '',
|
|
'link_after' => '',
|
|
'sep' => ' | ',
|
|
'approve_text' => _x( 'Approve', 'Pending Status', 'bbpress' ),
|
|
'unapprove_text' => _x( 'Unapprove', 'Pending Status', 'bbpress' )
|
|
), 'get_reply_approve_link' );
|
|
|
|
// Get reply
|
|
$reply = bbp_get_reply( $r['id'] );
|
|
|
|
// Bail if no reply or current user cannot moderate
|
|
if ( empty( $reply ) || ! current_user_can( 'moderate', $reply->ID ) ) {
|
|
return;
|
|
}
|
|
|
|
$display = bbp_is_reply_pending( $reply->ID ) ? $r['approve_text'] : $r['unapprove_text'];
|
|
$uri = add_query_arg( array( 'action' => 'bbp_toggle_reply_approve', 'reply_id' => $reply->ID ) );
|
|
$uri = wp_nonce_url( $uri, 'approve-reply_' . $reply->ID );
|
|
$retval = $r['link_before'] . '<a href="' . esc_url( $uri ) . '" class="bbp-reply-approve-link">' . $display . '</a>' . $r['link_after'];
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_approve_link', $retval, $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Output the row class of a reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2678)
|
|
*
|
|
* @param int $reply_id Optional. Reply ID
|
|
* @param array Extra classes you can pass when calling this function
|
|
*/
|
|
function bbp_reply_class( $reply_id = 0, $classes = array() ) {
|
|
echo bbp_get_reply_class( $reply_id, $classes );
|
|
}
|
|
/**
|
|
* Return the row class of a reply
|
|
*
|
|
* @since 2.0.0 bbPress (r2678)
|
|
*
|
|
* @param int $reply_id Optional. Reply ID
|
|
* @param array Extra classes you can pass when calling this function
|
|
* @return string Row class of the reply
|
|
*/
|
|
function bbp_get_reply_class( $reply_id = 0, $classes = array() ) {
|
|
$bbp = bbpress();
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
$forum_id = bbp_get_reply_forum_id( $reply_id );
|
|
$author_id = bbp_get_reply_author_id( $reply_id );
|
|
$reply_pos = bbp_get_reply_position( $reply_id, true );
|
|
$classes = array_filter( (array) $classes );
|
|
$count = isset( $bbp->reply_query->current_post )
|
|
? (int) $bbp->reply_query->current_post
|
|
: 1;
|
|
|
|
// Stripes
|
|
$even_odd = ( $count % 2 )
|
|
? 'even'
|
|
: 'odd';
|
|
|
|
// Forum moderator replied to topic
|
|
$forum_moderator = ( bbp_is_user_forum_moderator( $author_id, $forum_id ) === $author_id )
|
|
? 'forum-mod'
|
|
: '';
|
|
|
|
// Topic author replied to others
|
|
$topic_author = ( bbp_get_topic_author_id( $topic_id ) === $author_id )
|
|
? 'topic-author'
|
|
: '';
|
|
|
|
// Get reply classes
|
|
$reply_classes = array(
|
|
'loop-item-' . $count,
|
|
'user-id-' . $author_id,
|
|
'bbp-parent-forum-' . $forum_id,
|
|
'bbp-parent-topic-' . $topic_id,
|
|
'bbp-reply-position-' . $reply_pos,
|
|
$even_odd,
|
|
$topic_author,
|
|
$forum_moderator
|
|
);
|
|
|
|
// Run the topic classes through the post-class filters, which also
|
|
// handles the escaping of each individual class.
|
|
$post_classes = get_post_class( array_merge( $classes, $reply_classes ), $reply_id );
|
|
|
|
// Filter
|
|
$new_classes = apply_filters( 'bbp_get_reply_class', $post_classes, $reply_id, $classes );
|
|
|
|
// Return
|
|
return 'class="' . implode( ' ', $new_classes ) . '"';
|
|
}
|
|
|
|
/** Pagination ****************************************************************/
|
|
|
|
/**
|
|
* Return the base URL used inside of pagination links
|
|
*
|
|
* @since 2.6.0 bbPress (r6679)
|
|
*
|
|
* @param int $topic_id
|
|
* @return string
|
|
*/
|
|
function bbp_get_replies_pagination_base( $topic_id = 0 ) {
|
|
|
|
// If pretty permalinks are enabled, make our pagination pretty
|
|
if ( bbp_use_pretty_urls() && ! bbp_is_topic_pending( $topic_id )) {
|
|
|
|
// User's replies
|
|
if ( bbp_is_single_user_replies() ) {
|
|
$base = bbp_get_user_replies_created_url( bbp_get_displayed_user_id() );
|
|
|
|
// Root profile page
|
|
} elseif ( bbp_is_single_user() ) {
|
|
$base = bbp_get_user_profile_url( bbp_get_displayed_user_id() );
|
|
|
|
// Any single post (for shortcodes)
|
|
} elseif ( is_singular() ) {
|
|
$base = get_permalink();
|
|
|
|
// Single topic
|
|
} else {
|
|
$base = get_permalink( $topic_id );
|
|
}
|
|
|
|
$base = trailingslashit( $base ) . user_trailingslashit( bbp_get_paged_slug() . '/%#%/' );
|
|
|
|
// Unpretty permalinks
|
|
} else {
|
|
$base = add_query_arg( 'paged', '%#%' );
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_replies_pagination_base', $base, $topic_id );
|
|
}
|
|
|
|
/**
|
|
* Output the topic pagination count
|
|
*
|
|
* The results are unescaped by design, to allow them to be filtered freely via
|
|
* the 'bbp_get_topic_pagination_count' filter.
|
|
*
|
|
* @since 2.0.0 bbPress (r2519)
|
|
*
|
|
*/
|
|
function bbp_topic_pagination_count() {
|
|
echo bbp_get_topic_pagination_count();
|
|
}
|
|
/**
|
|
* Return the topic pagination count
|
|
*
|
|
* @since 2.0.0 bbPress (r2519)
|
|
*
|
|
* @return string Topic pagination count
|
|
*/
|
|
function bbp_get_topic_pagination_count() {
|
|
$bbp = bbpress();
|
|
|
|
// Define local variable(s)
|
|
$retstr = '';
|
|
|
|
// Set pagination values
|
|
$count_int = intval( $bbp->reply_query->post_count );
|
|
$total_int = intval( $bbp->reply_query->found_posts );
|
|
$ppp_int = intval( $bbp->reply_query->posts_per_page );
|
|
$start_int = intval( ( $bbp->reply_query->paged - 1 ) * $ppp_int ) + 1;
|
|
$to_int = intval( ( $start_int + ( $ppp_int - 1 ) > $total_int )
|
|
? $total_int
|
|
: $start_int + ( $ppp_int - 1 ) );
|
|
|
|
// Format numbers for display
|
|
$count_num = bbp_number_format( $count_int );
|
|
$total_num = bbp_number_format( $total_int );
|
|
$from_num = bbp_number_format( $start_int );
|
|
$to_num = bbp_number_format( $to_int );
|
|
|
|
// We are threading replies
|
|
if ( bbp_thread_replies() ) {
|
|
$walker = new BBP_Walker_Reply();
|
|
$threads = absint( $walker->get_number_of_root_elements( $bbp->reply_query->posts ) - 1 );
|
|
$retstr = sprintf( _n( 'Viewing %1$s reply thread', 'Viewing %1$s reply threads', $threads, 'bbpress' ), bbp_number_format( $threads ) );
|
|
|
|
// We are not including the lead topic
|
|
} elseif ( bbp_show_lead_topic() ) {
|
|
|
|
// Several replies in a topic with a single page
|
|
if ( empty( $to_num ) ) {
|
|
$retstr = sprintf( _n( 'Viewing %1$s reply', 'Viewing %1$s replies', $total_int, 'bbpress' ), $total_num );
|
|
|
|
// Several replies in a topic with several pages
|
|
} else {
|
|
$retstr = sprintf( _n( 'Viewing %2$s replies (of %4$s total)', 'Viewing %1$s replies - %2$s through %3$s (of %4$s total)', $count_int, 'bbpress' ), $count_num, $from_num, $to_num, $total_num );
|
|
}
|
|
|
|
// We are including the lead topic
|
|
} else {
|
|
|
|
// Several posts in a topic with a single page
|
|
if ( empty( $to_num ) ) {
|
|
$retstr = sprintf( _n( 'Viewing %1$s post', 'Viewing %1$s posts', $total_int, 'bbpress' ), $total_num );
|
|
|
|
// Several posts in a topic with several pages
|
|
} else {
|
|
$retstr = sprintf( _n( 'Viewing %2$s post (of %4$s total)', 'Viewing %1$s posts - %2$s through %3$s (of %4$s total)', $count_int, 'bbpress' ), $count_num, $from_num, $to_num, $total_num );
|
|
}
|
|
}
|
|
|
|
// Escape results of _n()
|
|
$retstr = esc_html( $retstr );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_topic_pagination_count', $retstr );
|
|
}
|
|
|
|
/**
|
|
* Output topic pagination links
|
|
*
|
|
* @since 2.0.0 bbPress (r2519)
|
|
*/
|
|
function bbp_topic_pagination_links() {
|
|
echo bbp_get_topic_pagination_links();
|
|
}
|
|
/**
|
|
* Return topic pagination links
|
|
*
|
|
* @since 2.0.0 bbPress (r2519)
|
|
*
|
|
* @return string Topic pagination links
|
|
*/
|
|
function bbp_get_topic_pagination_links() {
|
|
$bbp = bbpress();
|
|
|
|
if ( ! isset( $bbp->reply_query->pagination_links ) || empty( $bbp->reply_query->pagination_links ) ) {
|
|
return false;
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_topic_pagination_links', $bbp->reply_query->pagination_links );
|
|
}
|
|
|
|
/** Forms *********************************************************************/
|
|
|
|
/**
|
|
* Output the value of reply content field
|
|
*
|
|
* @since 2.0.0 bbPress (r3130)
|
|
*/
|
|
function bbp_form_reply_content() {
|
|
echo bbp_get_form_reply_content();
|
|
}
|
|
/**
|
|
* Return the value of reply content field
|
|
*
|
|
* @since 2.0.0 bbPress (r3130)
|
|
*
|
|
* @return string Value of reply content field
|
|
*/
|
|
function bbp_get_form_reply_content() {
|
|
|
|
// Get _POST data
|
|
if ( bbp_is_reply_form_post_request() && isset( $_POST['bbp_reply_content'] ) ) {
|
|
$reply_content = wp_unslash( $_POST['bbp_reply_content'] );
|
|
|
|
// Get edit data
|
|
} elseif ( bbp_is_reply_edit() ) {
|
|
$reply_content = bbp_get_global_post_field( 'post_content', 'raw' );
|
|
|
|
// No data
|
|
} else {
|
|
$reply_content = '';
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_form_reply_content', $reply_content );
|
|
}
|
|
|
|
/**
|
|
* Output the value of the reply to field
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*/
|
|
function bbp_form_reply_to() {
|
|
echo bbp_get_form_reply_to();
|
|
}
|
|
|
|
/**
|
|
* Return the value of reply to field
|
|
*
|
|
* @since 2.4.0 bbPress (r4944)
|
|
*
|
|
* @return string Value of reply to field
|
|
*/
|
|
function bbp_get_form_reply_to() {
|
|
|
|
// Set initial value
|
|
$reply_to = 0;
|
|
|
|
// Get $_REQUEST data
|
|
if ( isset( $_REQUEST['bbp_reply_to'] ) ) {
|
|
$reply_to = bbp_validate_reply_to( $_REQUEST['bbp_reply_to'] );
|
|
}
|
|
|
|
// If empty, get from meta
|
|
if ( empty( $reply_to ) ) {
|
|
$reply_to = bbp_get_reply_to();
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_form_reply_to', $reply_to );
|
|
}
|
|
|
|
/**
|
|
* Output a select box allowing to pick which reply an existing hierarchical
|
|
* reply belongs to.
|
|
*
|
|
* @since 2.6.0 bbPress (r5387)
|
|
*
|
|
* @param int $reply_id
|
|
*/
|
|
function bbp_reply_to_dropdown( $reply_id = 0 ) {
|
|
echo bbp_get_reply_to_dropdown( $reply_id );
|
|
}
|
|
/**
|
|
* Return a select box allowing to pick which topic/reply a reply belongs.
|
|
*
|
|
* @since 2.6.0 bbPress (r5387)
|
|
*
|
|
* @param int $reply_id
|
|
*
|
|
* @return string The dropdown
|
|
*/
|
|
function bbp_get_reply_to_dropdown( $reply_id = 0 ) {
|
|
|
|
// Validate the reply data
|
|
$reply_id = bbp_get_reply_id( $reply_id );
|
|
$reply_to = bbp_get_reply_to( $reply_id );
|
|
$topic_id = bbp_get_reply_topic_id( $reply_id );
|
|
|
|
// Get the replies
|
|
$posts = get_posts( array(
|
|
'post_type' => bbp_get_reply_post_type(),
|
|
'post_status' => bbp_get_public_status_id(),
|
|
'post_parent' => $topic_id,
|
|
'numberposts' => -1,
|
|
'orderby' => 'menu_order',
|
|
'order' => 'ASC',
|
|
) );
|
|
|
|
// Append `reply_to` for each reply so it can be walked
|
|
foreach ( $posts as &$post ) {
|
|
|
|
// Check for reply post type
|
|
$_reply_to = bbp_get_reply_to( $post->ID );
|
|
|
|
// Make sure it's a reply to a reply
|
|
if ( empty( $_reply_to ) || ( $topic_id === $_reply_to ) ) {
|
|
$_reply_to = 0;
|
|
}
|
|
|
|
// Add reply_to to the post object so we can walk it later
|
|
$post->reply_to = $_reply_to;
|
|
}
|
|
|
|
// Default "None" text
|
|
$show_none = ( 0 === $reply_id )
|
|
? esc_attr_x( 'None', 'Default reply to dropdown text', 'bbpress' )
|
|
: sprintf( esc_attr__( '%1$s - %2$s', 'bbpress' ), $topic_id, bbp_get_topic_title( $topic_id ) );
|
|
|
|
// Get the dropdown and return it
|
|
$retval = bbp_get_dropdown( array(
|
|
'show_none' => $show_none,
|
|
'select_id' => 'bbp_reply_to',
|
|
'select_class' => 'bbp_dropdown',
|
|
'exclude' => $reply_id,
|
|
'selected' => $reply_to,
|
|
'post_parent' => $topic_id,
|
|
'post_type' => bbp_get_reply_post_type(),
|
|
'max_depth' => bbp_thread_replies_depth(),
|
|
'page' => 1,
|
|
'per_page' => -1,
|
|
'walker' => new BBP_Walker_Reply_Dropdown(),
|
|
'posts' => $posts
|
|
) );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_reply_to_dropdown', $retval, $reply_id, $reply_to, $topic_id );
|
|
}
|
|
|
|
/**
|
|
* Output checked value of reply log edit field
|
|
*
|
|
* @since 2.0.0 bbPress (r3130)
|
|
*/
|
|
function bbp_form_reply_log_edit() {
|
|
echo bbp_get_form_reply_log_edit();
|
|
}
|
|
/**
|
|
* Return checked value of reply log edit field
|
|
*
|
|
* @since 2.0.0 bbPress (r3130)
|
|
*
|
|
* @return string Reply log edit checked value
|
|
*/
|
|
function bbp_get_form_reply_log_edit() {
|
|
|
|
// Get _POST data
|
|
if ( bbp_is_reply_form_post_request() && isset( $_POST['bbp_log_reply_edit'] ) ) {
|
|
$reply_revision = (bool) $_POST['bbp_log_reply_edit'];
|
|
|
|
// No data
|
|
} else {
|
|
$reply_revision = true;
|
|
}
|
|
|
|
// Get checked output
|
|
$checked = checked( $reply_revision, true, false );
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_form_reply_log_edit', $checked, $reply_revision );
|
|
}
|
|
|
|
/**
|
|
* Output the value of the reply edit reason
|
|
*
|
|
* @since 2.0.0 bbPress (r3130)
|
|
*/
|
|
function bbp_form_reply_edit_reason() {
|
|
echo bbp_get_form_reply_edit_reason();
|
|
}
|
|
/**
|
|
* Return the value of the reply edit reason
|
|
*
|
|
* @since 2.0.0 bbPress (r3130)
|
|
*
|
|
* @return string Reply edit reason value
|
|
*/
|
|
function bbp_get_form_reply_edit_reason() {
|
|
|
|
// Get _POST data
|
|
if ( bbp_is_reply_form_post_request() && isset( $_POST['bbp_reply_edit_reason'] ) ) {
|
|
$reply_edit_reason = wp_unslash( $_POST['bbp_reply_edit_reason'] );
|
|
|
|
// No data
|
|
} else {
|
|
$reply_edit_reason = '';
|
|
}
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_form_reply_edit_reason', $reply_edit_reason );
|
|
}
|
|
|
|
/**
|
|
* Output value reply status dropdown
|
|
*
|
|
* @since 2.6.0 bbPress (r5399)
|
|
*
|
|
* @param $args This function supports these arguments:
|
|
* - select_id: Select id. Defaults to bbp_reply_status
|
|
* - tab: Deprecated. Tabindex
|
|
* - reply_id: Reply id
|
|
* - selected: Override the selected option
|
|
*/
|
|
function bbp_form_reply_status_dropdown( $args = array() ) {
|
|
echo bbp_get_form_reply_status_dropdown( $args );
|
|
}
|
|
/**
|
|
* Returns reply status dropdown
|
|
*
|
|
* This dropdown is only intended to be seen by users with the 'moderate'
|
|
* capability. Because of this, no additional capability checks are performed
|
|
* within this function to check available reply statuses.
|
|
*
|
|
* @since 2.6.0 bbPress (r5399)
|
|
*
|
|
* @param $args This function supports these arguments:
|
|
* - select_id: Select id. Defaults to bbp_reply_status
|
|
* - tab: Deprecated. Tabindex
|
|
* - reply_id: Reply id
|
|
* - selected: Override the selected option
|
|
*/
|
|
function bbp_get_form_reply_status_dropdown( $args = array() ) {
|
|
|
|
// Parse arguments against default values
|
|
$r = bbp_parse_args( $args, array(
|
|
'select_id' => 'bbp_reply_status',
|
|
'select_class' => 'bbp_dropdown',
|
|
'tab' => false,
|
|
'reply_id' => 0,
|
|
'selected' => false
|
|
), 'reply_status_dropdown' );
|
|
|
|
// No specific selected value passed
|
|
if ( empty( $r['selected'] ) ) {
|
|
|
|
// Post value is passed
|
|
if ( bbp_is_reply_form_post_request() && isset( $_POST[ $r['select_id'] ] ) ) {
|
|
$r['selected'] = sanitize_key( $_POST[ $r['select_id'] ] );
|
|
|
|
// No Post value was passed
|
|
} else {
|
|
|
|
// Edit reply
|
|
if ( bbp_is_reply_edit() ) {
|
|
$r['reply_id'] = bbp_get_reply_id( $r['reply_id'] );
|
|
$r['selected'] = bbp_get_reply_status( $r['reply_id'] );
|
|
|
|
// New reply
|
|
} else {
|
|
$r['selected'] = bbp_get_public_status_id();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Start an output buffer, we'll finish it after the select loop
|
|
ob_start(); ?>
|
|
|
|
<select name="<?php echo esc_attr( $r['select_id'] ) ?>" id="<?php echo esc_attr( $r['select_id'] ); ?>_select" class="<?php echo esc_attr( $r['select_class'] ); ?>"<?php bbp_tab_index_attribute( $r['tab'] ); ?>>
|
|
|
|
<?php foreach ( bbp_get_reply_statuses( $r['reply_id'] ) as $key => $label ) : ?>
|
|
|
|
<option value="<?php echo esc_attr( $key ); ?>"<?php selected( $key, $r['selected'] ); ?>><?php echo esc_html( $label ); ?></option>
|
|
|
|
<?php endforeach; ?>
|
|
|
|
</select>
|
|
|
|
<?php
|
|
|
|
// Filter & return
|
|
return apply_filters( 'bbp_get_form_reply_status_dropdown', ob_get_clean(), $r, $args );
|
|
}
|
|
|
|
/**
|
|
* Verify if a POST request came from a failed reply attempt.
|
|
*
|
|
* Used to avoid cross-site request forgeries when checking posted reply form
|
|
* content.
|
|
*
|
|
* @see bbp_reply_form_fields()
|
|
*
|
|
* @since 2.6.0 bbPress (r5558)
|
|
*
|
|
* @return boolean True if is a post request with valid nonce
|
|
*/
|
|
function bbp_is_reply_form_post_request() {
|
|
|
|
// Bail if not a post request
|
|
if ( ! bbp_is_post_request() ) {
|
|
return false;
|
|
}
|
|
|
|
// Creating a new reply
|
|
if ( bbp_verify_nonce_request( 'bbp-new-reply' ) ) {
|
|
return true;
|
|
}
|
|
|
|
// Editing an existing reply
|
|
if ( bbp_verify_nonce_request( 'bbp-edit-reply' ) ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|