wenpai.org/wp-content/plugins/bbp-style-pack/includes/functions_quote.php
2024-06-21 23:57:39 +08:00

351 lines
No EOL
18 KiB
PHP

<?php
// Exit if accessed directly
defined( 'ABSPATH' ) || exit;
//functions for the quote tab
global $bsp_style_settings_quote;
if ($bsp_style_settings_quote['quote_position'] == 1) {
add_filter('bbp_topic_admin_links', 'bsp_quote_admin_link');
add_filter('bbp_reply_admin_links', 'bsp_quote_admin_link');
}
if ($bsp_style_settings_quote['quote_position'] == 2) {
add_action ('bbp_theme_before_topic_content' , 'bsp_quote_reply_content');
add_action ('bbp_theme_before_reply_content' , 'bsp_quote_reply_content');
}
if ($bsp_style_settings_quote['quote_position'] == 3) {
add_action ('bbp_theme_after_reply_content' , 'bsp_quote_reply_content');
add_action ('bbp_theme_after_topic_content' , 'bsp_quote_reply_content');
}
function bsp_quote_reply_content($content='') {
global $bsp_style_settings_quote;
if(bbp_current_user_can_access_create_reply_form()) {
//if in admin AND using buddyboss
if ($bsp_style_settings_quote['quote_position'] == 1 && function_exists ('buddyboss_theme')) {
echo '<span class="">'.bsp_quote().'</span>';
}
else echo '<div class="bsp-quote-block">'.bsp_quote().'</div>';
}
}
function bsp_quote_admin_link($links) {
if(bbp_current_user_can_access_create_reply_form()) {
$links['Quote'] = bsp_quote();
}
return $links;
}
function bsp_quote() {
global $bsp_style_settings_quote;
$id = bbp_get_reply_id();
$is_reply = true;
if ($id == 0) {
$is_reply = false;
$id = bbp_get_topic_id();
}
if ($is_reply) {
$url = bbp_get_reply_url($id);
$ath = bbp_get_reply_author_display_name($id);
} else {
$url = get_permalink($id);
$ath = bbp_get_topic_author_display_name($id);
}
$quote_name = (!empty ($bsp_style_settings_quote['quote_name'] ) ? $bsp_style_settings_quote['quote_name'] : 'Quote' );
//if we are using buddyboss
if (function_exists ('buddyboss_theme')) {
//if quote in admin
if ($bsp_style_settings_quote['quote_position'] == 1) {
$retval = '<a data-balloon=" ' . esc_html__( 'Reply', 'buddyboss-theme' ) . ' " data-balloon-pos="up" href="' . esc_url( $r['uri'] ) . '" data-modal-id="bbp-reply-form" class="bbp-reply-to-link"><i class="bb-icon-reply"></i><span class="bb-forum-reply-text">' . esc_html( $r['reply_text'] ) . '</span></a>' . $r['link_after'];
$retval = '<a data-balloon=" '.$quote_name.' " data-balloon-pos="up" href="#'.$id.'" data-modal-id="bbp-reply-form" class="bs-dropdown-link bbp-reply-to-link bsp-quote-link">' ;
$retval.= '<i class="bb-icon-quote bsp-admin-links-border-buddyboss"></i><span class="bb-forum-reply-text">' . $quote_name . '</span></a>' ;
return $retval ;
}
else return '<a href="#'.$id.'" data-modal-id="bbp-reply-form" class="bsp-quote-link">'.$quote_name.'</a>' ;
}
else return '<a href="#'.$id.'" bbp-url="'.$url.'" bbp-author="'.$ath.'" class="bsp-quote-link">'.$quote_name.'</a>';
}
//amend allowed tags to accept <div class> and <span class> tags
add_filter ('bbp_kses_allowed_tags' , 'bsp_allow_div_tag', 100 );
function bsp_allow_div_tag( $tags ) {
$tags['div'] = array(
'class' => true
);
$tags['span'] = array(
'class' => true
);
$tags['br'] = array();
return $tags;
}
//ajax functions
//backend
add_action ('wp_ajax_get_status_by_ajax' , 'bsp_function');
//front end
add_action ('wp_ajax_nopriv_get_status_by_ajax' , 'bsp_function');
function bsp_function() {
//check_ajax_referrer
//this comes from the variables set in generate_css.php wp_localise_script function
wp_verify_nonce( $_POST['quote'], 'get_id_content' );
global $bsp_style_settings_quote;
$id = absint( filter_var( $_POST['id'], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
//set up elements
$preamble = (!empty ($bsp_style_settings_quote['quote_preamble'] ) ? $bsp_style_settings_quote['quote_preamble'] : 'On' );
$conclusion = (!empty ($bsp_style_settings_quote['conclusion'] ) ? $bsp_style_settings_quote['conclusion'] : 'said' );
if (bbp_is_reply ($id)) {
$content = bbp_get_reply_content($id );
$author = bbp_get_reply_author_link(array( 'type' => 'name', 'post_id' => $id, ) );
$date = (!empty ($bsp_style_settings_quote['date'] ) ? '<span class="bbp-reply-post-date">'.bbp_get_reply_post_date($id).'</span>' : '' );
}
if (bbp_is_topic ($id)) {
$content = bbp_get_topic_content($id );
$author = bbp_get_topic_author_link(array( 'type' => 'name', 'post_id' => $id, ));
$date = (!empty ($bsp_style_settings_quote['date'] ) ? '<span class="bbp-topic-post-date">'.bbp_get_topic_post_date($id).'</span>' : '' );
}
// if nested quotes disabled, strip all current quotes from the content
if ( ! empty( $bsp_style_settings_quote['disable_nested_quotes'] ) ) {
// first get rid of the actual quoted content title/link/header info for all quotes (single and nested)
$re = "'<div class=\"bsp-quote-title\">(.*?)</div>'si";
while( preg_match( $re, $content ) ){
$content = preg_replace( $re, '', $content );
}
// second, strip all opening/closing blockquote tags and their content from the main content
// this will handle single quotes, and the inner-most nested quote
$re = "'<blockquote>(.*?)</blockquote>'si";
while( preg_match( $re, $content ) ){
$content = preg_replace( $re, '', $content );
}
// third, handle cases for all other nested quotes where <p> tags/content are used that also need to be cleared
$re = "'<p>(.*?)</p></blockquote>'si";
while( preg_match( $re, $content ) ){
$content = preg_replace( $re, '', $content );
}
}
//set up default order
if (!empty($bsp_style_settings_quote['date'] ) ? $total_items=4 : $total_items=3 );
if ($total_items==3) {
$default_preamble=1;
$default_author=2;
$default_conclusion=3;
}
if ($total_items==4) {
$default_preamble=1;
$default_date = 2;
$default_author=3;
$default_conclusion=4;
}
//now change if set
$order = array();
$i=1;
//set the limit to $total_items and set up order
while($i<=$total_items) {
if ((!empty($bsp_style_settings_quote["preamble_order"]) ? $bsp_style_settings_quote["preamble_order"] : $default_preamble) == $i) $order[$i] = 'preamble_order';
if ((!empty($bsp_style_settings_quote["date_order"]) ? $bsp_style_settings_quote["date_order"] : $default_date) == $i) $order[$i] = 'date_order';
if ((!empty($bsp_style_settings_quote["author_order"]) ? $bsp_style_settings_quote["author_order"] : $default_author) == $i) $order[$i] = 'author_order';
if ((!empty($bsp_style_settings_quote["conclusion_order"]) ? $bsp_style_settings_quote["conclusion_order"] : $default_conclusion) == $i) $order[$i] = 'conclusion_order';
//increments $i
$i++;
}
//start output
echo '<blockquote><div class="bsp-quote-title">';
$i=1;
while($i<=$total_items) {
//then work out which is active and output
if (!empty($order[$i])) {
if ($order[$i] == 'preamble_order') echo $preamble;
if ($order[$i] == 'date_order') echo $date;
if ($order[$i] == 'author_order') echo $author;
if ($order[$i] == 'conclusion_order') echo $conclusion;
}
$i++;
echo ' ';
}
//output
echo '</div>';
echo $content;
echo '</blockquote>';
echo '<br>' ;
wp_die();
}
// function to handle whether quotes should link to user profiles or not
function bsp_custom_quote_profile_links( $content ) {
$has_quotes = strpos( $content, '<div class="bsp-quote-title">' );
// if we indeed are dealing with a quote, process it based on admin settings
if ( $has_quotes !== false ) {
// get admin setting value
global $bsp_style_settings_quote;
$profile_link = ( ! empty( $bsp_style_settings_quote["quoted_user_link"] ) ? $bsp_style_settings_quote["quoted_user_link"] : 'everyone' );
// DISABLE PROFILE LINKS
// if ( setting value is to disable profile links ), or ( setting value is display to logged-in only && user is not logged-in )
if ( $profile_link === 'no_one' || ( $profile_link === 'logged_in' && ! is_user_logged_in() ) ) {
// replace profile links with bbp-author-link class specified in <a href> tag (top-level quotes)
$new_content = preg_replace( '#<a href="[^"]*" title="[^"]*" class="bbp-author-link">(.*?)</a>#i', '$1', $content );
// replace profile links where no bbp-author-link class is specified in <a href> tag (nested quotes)
$new_content = preg_replace( '#<a href="[^"]*" title="[^"]*"><span class="bbp-author-name">(.*?)</span></a>#is', '<span class="bbp-author-name">$1</span>', $new_content );
return $new_content;
}
// ENABLE PROFILE LINKS
// if ( setting value is everyone ), or ( setting value is display to logged-in only && user is logged-in )
if ( $profile_link === 'everyone' || ( $profile_link === 'logged_in' && is_user_logged_in() ) ) {
// If profile links were previously disabled but have been re-enabled,
// then nested quotes may be quoting another quote that had the profile link previously removed.
// For consistency, let's force re-add profile links to quoted usernames
// get all quoted usernames (display_names) and add them to an array
preg_match_all( "'<span class=\"bbp-author-name\">(.*?)</span>'is", $content, $user_names );
if ( is_array( $user_names ) && ! empty( $user_names ) ) {
// loop through all quoted usernames in this post
foreach ( $user_names[1] as $user_name ) {
// get the user object for this user's display_name
$args= array(
'search' => $user_name, // or login or nicename in this example
'search_fields' => array( 'user_login', 'user_nicename', 'display_name' )
);
$user_query = new WP_User_Query($args);
if ( $user_query && ! is_wp_error( $user_query ) ) {
// get the user info for the first result of the search
$user_info = $user_query->results[0]->data;
$user_nicename = bbp_get_user_nicename( $user_info->ID );
// get the user profile link for the current user_id that was quoted
$link = bbp_get_user_profile_link( $user_info->ID );
// Format the user profile link to match what a nested quote looks like
// From this: <a href="https://site.com/forums/users/username/">username</a>
// To this: <a href="https://site.com/forums/users/username/" title="View username's profile"><span class="bbp-author-name">username</span></a>
$view_profile_text = sprintf(
/* translators: %s is a username */
__( 'View %s\'s profile'),
$user_name
);
$new_link = preg_replace( '#">(.*?)</a>#is', '" title="'.$view_profile_text.'"><span class="bbp-author-name">$1</span></a>', $link );
// Note: Top-level quotes will always have the profile link, so we don't have to do anything here with adding profile links
// We're only dealing with profile links for nested quotes here.
// Note: Some nested quotes may have profile links and other nested quotes may not. It all depends on what was previously set.
// We need to handle both cases here.
// There's no good way to search for usernames that don't have profile links or to bulk-add profile links without duplicating,
// so we just force remove any existing profile links for this user's nested quotes (make it all standardized without profile links),
// and then force re-add them afterwards (re-standardize with profile links).
// force-remove nested quote profile links for this user
$content = preg_replace( '#'.$new_link.'#is', '<span class="bbp-author-name">'.$user_name.'</span>', $content );
// force re-add nested quote profile links and/or add them for any that were missing profile links in the first place
$content = preg_replace( '#<span class="bbp-author-name">'.$user_name.'</span>#is', $new_link, $content );
}
}
}
// return the content, with profile links force-added for any post with quotes
return $content;
}
}
// else, no quotes or no setting to disable profile links so just return the content unaltered
return $content;
}
add_filter( 'bbp_get_topic_content', 'bsp_custom_quote_profile_links' );
add_filter( 'bbp_get_reply_content', 'bsp_custom_quote_profile_links' );
// we need to force-add 'display_name' as a column to search for getting user_info from bbPress display_name within quotes
function bsp_user_search_columns( $search_columns ){
if( ! in_array( 'display_name', $search_columns ) ) {
$search_columns[] = 'display_name';
}
return $search_columns;
}
add_filter( 'user_search_columns', 'bsp_user_search_columns', 10, 1 );
//BUDDYBOSS ONLY !
//AMENDED change to show quotes in admin link
//this function sits in \buddyboss-theme\inc\theme\template-functions.php but has an if_exists so we can load a fresh one here
//and add the Quote function
//- this is called by a filter in \buddyboss-theme\bbpress\loop-single-reply.php
function bb_theme_reply_link_attribute_change( $retval, $r, $args ) {
if ( ! function_exists( 'buddypress' ) && ! bp_is_active( 'forums' ) ) {
return;
}
// Get the reply to use it's ID and post_parent
$reply = bbp_get_reply( bbp_get_reply_id( (int) $r['id'] ) );
// Bail if no reply or user cannot reply
if ( empty( $reply ) || ! bbp_current_user_can_access_create_reply_form() )
return;
// If single user replies page then no need to open a modal for reply to.
if ( bbp_is_single_user_replies() ) {
return $retval;
}
// Build the URI and return value
$uri = remove_query_arg( array( 'bbp_reply_to' ) );
$uri = add_query_arg( array( 'bbp_reply_to' => $reply->ID ), bbp_get_topic_permalink( bbp_get_reply_topic_id( $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 = '';
}
$modal = 'data-modal-id-inline="new-reply-'.$reply->post_parent.'"';
// Add $uri to the array, to be passed through the filter
$r['uri'] = $uri;
$reply_link = $r['link_before'] . '<a data-balloon=" ' . esc_html__( 'Reply', 'buddyboss-theme' ) . ' " data-balloon-pos="up" href="' . esc_url( $r['uri'] ) . '" class="bbp-reply-to-link ' . $reply->ID . ' "' . $modal . $onclick . '><i class="bb-icon-reply"></i><span class="bb-forum-reply-text">' . esc_html( $r['reply_text'] ) . '</span></a>' . $r['link_after'];
//add quotes link if needed
global $bsp_style_settings_quote;
$quote_link = '' ;
//if in admin links
if ($bsp_style_settings_quote['quote_position'] == 1) {
$quote_link = bsp_quote_reply_content() ;
}
$retval=$reply_link.$quote_link ;
return $retval;
}