wenpai.org/wp-content/plugins/bbp-style-pack/modtools/bbpress.php
2024-11-14 02:29:46 +08:00

449 lines
No EOL
13 KiB
PHP

<?php
class bspbbPressModToolsPlugin_bbPress extends bspbbPressModToolsPlugin {
public static function init() {
$self = new self();
// Show a notice to users
add_action( 'bbp_template_before_single_forum', array( $self, 'anon_pending_notice' ) );
add_action( 'bbp_template_before_single_topic', array( $self, 'anon_pending_notice' ) );
// Add blocked link to user details and profile
$priority = apply_filters ('tc_moderation_priority', 10) ;
add_action( 'bbp_theme_after_reply_author_details', array( $self, 'user_admin_links' ),$priority );
add_action( 'bbp_theme_after_topic_author_details', array( $self, 'user_admin_links' ), $priority );
add_action( 'bbp_template_before_user_profile', array( $self, 'user_admin_links' ), $priority );
// Do additional actions on approval of topics
add_action( 'bbp_approved_topic', array( $self, 'moderation_approve_action' ) );
add_action( 'bbp_approved_reply', array( $self, 'moderation_approve_action' ) );
remove_action( 'bbp_template_redirect', 'bbp_forum_enforce_blocked', 1 );
add_action( 'bbp_template_redirect', array( $self, 'bbp_forum_enforce_blocked' ), 1 );
// Redirect anon users back to parent forum
add_filter( 'bbp_new_topic_redirect_to', array( $self, 'redirect_pending_anon' ), 20, 3 );
add_filter( 'bbp_new_reply_redirect_to', array( $self, 'redirect_pending_anon' ), 20, 3 );
// Include pending posts into replies and topic lists
add_filter( 'bbp_has_topics_query', array( $self, 'pending_query' ) );
add_filter( 'bbp_has_replies_query', array( $self, 'pending_query' ) );
// Intercept the content and show awaiting moderation message
add_filter( 'bbp_get_reply_content', array( $self, 'moderate_content' ), 10, 2 );
add_filter( 'bbp_get_topic_content', array( $self, 'moderate_content' ), 10, 2 );
// Intercept the post title and add awaiting moderation notice
add_filter( 'bbp_get_topic_title', array( $self, 'pending_title' ), 10, 2 );
// Disable ability to reply if topic is awaiting moderation.
add_filter( 'bbp_current_user_can_publish_replies', array( $self, 'pending_topic_reply_check' ) );
// Intercept the admin bar and add approve post
add_filter( 'bbp_topic_admin_links', array( $self, 'add_moderation_links'), 10, 2 );
add_filter( 'bbp_reply_admin_links', array( $self, 'add_moderation_links'), 10, 2 );
}
/**
* Redirect users back to parent with pending variable to display notice for anon users
*
* @since 1.0.0
*
* @param $redirect_url
* @param $redirect_to
* @param $post_id
*
* @return $redirect_url
*
*/
public function redirect_pending_anon( $redirect_url, $redirect_to, $post_id ) {
$post = get_post( $post_id );
if ( in_array( $post->post_type, array( 'topic', 'reply' ) ) && 'pending' == $post->post_status && $post->post_author == 0 ) {
$redirect_url = add_query_arg(
array( 'moderation_pending' => $post_id ),
get_permalink( $post->post_parent )
);
}
return $redirect_url;
}
/**
* Add the post status to the topic and reply query
*
* @since 0.1.0
*
* @param array $bbp
*
* @return array $bbp
*/
public function pending_query( $bbp ) {
$user = wp_get_current_user();
if ( ! $user->ID ) {
return $bbp;
}
$bbp['post_status'] = 'pending,publish,closed,private,hidden,reported';
$user_can_moderate = $this->user_can_moderate( $user->ID, bbp_get_forum_id() );
if ( ( isset( $_GET['view'] ) && $_GET['view'] == 'all' ) && $user_can_moderate ) {
$bbp['post_status'] .= ',spam,trash';
}
if ( ! $user_can_moderate ) {
add_filter( 'posts_where', array( $this, 'posts_where' ) );
}
return $bbp;
}
/**
* Posts where...
*
* @since 0.1.0
*
* @param str $where
*
* @return str $where
*/
public function posts_where( $where = '' ) {
global $wpdb;
$user = wp_get_current_user();
$where = str_ireplace( $wpdb->prefix . "posts.post_status = 'pending'", "(" . $wpdb->prefix . "posts.post_status = 'pending' AND " . $wpdb->prefix . "posts.post_author = " . $user->ID . ")", $where );
return $where;
}
/**
* Replace the content with an awaiting moderation message
*
* @since 0.1.0
*
* @param string $content
* @param int $post_id
*
* @return string $content
*/
public function moderate_content( $content, $post_id ) {
$post = get_post( $post_id );
// Why would it be empty? no one knows, but better safe than sorry!
if ( empty( $post ) ) {
return $content;
}
if ( 'pending' == $post->post_status ) {
$notice = '<div class="bbp-mt-template-notice">' . __( 'This post is awaiting moderation.', 'bbp-style-pack' ) . '</div>';
if ( $this->user_can_moderate( get_current_user_ID(), bbp_get_forum_id() ) ) {
$content = $notice . '<br>' . $content;
} else {
$content = $notice;
}
}
return $content;
}
/**
* Add 'Block user' link into the author profile and post author
* @since 1.0.0
*/
public function user_admin_links() {
global $post;
$user_role = strtolower( bbp_get_user_display_role( get_current_user_id() ) );
if ( $this->user_can_moderate( get_current_user_id() ) ) {
$post_id = bbp_get_reply_id() ;
$author_id = bbp_get_reply_author_id ($post_id) ;
$role = bbp_get_user_display_role( $author_id );
//if ($author_id == 1362) update_option ('rew' , '1362 '.$role ) ;
if ( ! in_array( $role, array( 'Blocked', 'Keymaster', 'Moderator', 'Senior Moderator' ) ) && $author_id > 0 ) {
$action = 'block';
} elseif ( in_array( $role, array( 'Blocked' ) ) ) {
if ( $user_role == 'keymaster' or $user_role == 'senior moderator' ) {
$action = 'unblock';
}
}
$output = '<ul class="moderationlinks">';
if ( isset( $action ) ) {
$url = add_query_arg( array(
'author_id' => $author_id,
'action' => $this->plugin_slug . '-' . $action . '_user',
));
$nonce_url = wp_nonce_url( $url, 'moderator_action', $this->plugin_slug . '-wp_nonce' );
//$confirm = '" onclick="return confirm(\'' . esc_js( esc_html__( 'Confirm you wish to block this user', 'cd' ) ). '\' );"' ;
$confirm = esc_html__( 'Confirm you wish to ', 'cd' ). ucfirst( $action ) . esc_html__(' User', 'bbp-style-pack') ;
$confirm = esc_js( $confirm ) ; // '\' ) ;
$confirm = '" onclick="return confirm(\'' . $confirm. '\' );"' ;
$output .= '<li class="moderationlinks-block"><a href="' . $nonce_url . '" class="bbp-reply-edit-link"'.$confirm.'>' . ucfirst( $action ) . esc_html__(' User', 'bbp-style-pack') . '</a></li>';
}
// Add a user moderation flag link
if ( ! in_array( $role, array( 'Keymaster', 'Moderator', 'Senior Moderator' ) ) && $author_id > 0 && ! get_user_meta( $author_id, '_bbp_moderation_flagged', true ) ) {
$lockdown_action = 'add_moderation_flag';
$lockdown_action_text = __( 'Add User Moderation Flag', 'bbp-style-pack' );
} elseif ( get_user_meta( $author_id, '_bbp_moderation_flagged', true ) ) {
$lockdown_action = 'remove_moderation_flag';
$lockdown_action_text = __( 'Remove User Moderation Flag', 'bbp-style-pack' );
}
if ( isset( $lockdown_action ) ) {
$url = add_query_arg( array(
'author_id' => $author_id,
'action' => $this->plugin_slug . '-' . $lockdown_action,
));
$nonce_url = wp_nonce_url( $url, 'moderator_action', $this->plugin_slug . '-wp_nonce' );
$confirm = esc_html__( 'Confirm you wish to ', 'bbp-style-pack' ).$lockdown_action_text ;
$confirm = esc_js( $confirm ) ; // '\' ) ;
$confirm = '" onclick="return confirm(\'' . $confirm. '\' );"' ;
$output .= '<li class="moderationlinks-flag"><a href="' . $nonce_url . '" class="bbp-reply-edit-link"'.$confirm.'>' . $lockdown_action_text . '</a></li>';
}
$output .= '</ul>';
$output = apply_filters ('bbp_user_admin_links' ,$output ) ;
echo $output ;
}
}
/**
* Action to add flags to users on topic/reply approval
*
* @since 1.0.0
*
* @param $post_id
*/
public function moderation_approve_action( $post_id ) {
if ( 'custom' != get_option( '_bbp_moderation_type' ) ) {
return;
}
$post_author = get_post_field( 'post_author', $post_id );
if ( 0 == $post_author ) {
return;
}
$custom_moderation_options = get_option( '_bbp_moderation_custom' );
if ( ! empty( $custom_moderation_options ) && in_array( 'links', $custom_moderation_options ) && get_post_meta( $post_id, '_bbp_moderation_link_found', true ) ) {
update_user_meta( $post_author, '_link_moderation_approved', TRUE );
}
if ( ! empty( $custom_moderation_options ) && in_array( 'ascii_unnaproved', $custom_moderation_options ) && get_post_meta( $post_id, '_bbp_moderation_ascii_found', true ) ) {
update_user_meta( $post_author, '_ascii_moderation_approved', TRUE );
}
}
/**
* Add pending indicator to message title
*
* @since 0.1.0
*
* @param string $title
* @param int $post_id
*
* @return string $title
*
*/
public function pending_title( $title, $post_id ) {
$post = get_post( $post_id );
// Why would it be empty? no one knows, but better safe than sorry!
if ( empty( $post ) ) {
return $title;
}
if ( 'pending' == $post->post_status ) {
return $title . ' ('. __( 'Awaiting moderation', 'bbp-style-pack' ) . ')';
}
if ( $this->user_can_moderate() ) {
$args = array(
'post_parent' => $post_id,
'post_type' => 'reply',
'numberposts' => -1,
'post_status' => 'pending'
);
$children = get_children( $args );
$child_count = count ( $children );
if ( $child_count > 1 ) {
return $title . ' ('. $child_count . ' ' . __( 'Replies awaiting moderation', 'bbp-style-pack' ) . ')';
} else if ( $child_count == 1 ) {
return $title . ' ('. $child_count . ' ' . __( 'Reply awaiting moderation', 'bbp-style-pack' ) . ')';
}
}
return $title;
}
/**
* Check if the topic is waiting moderation. Disable ability to reply if it is
*
* @since 0.1.0
*
* @param boolean $retval
*
* @return boolean - true can reply
*/
public function pending_topic_reply_check( $retval ) {
if ( ! $retval ) {
return $retval;
}
$topic_id = bbp_get_topic_id();
return ( 'publish' == bbp_get_topic_status( $topic_id ) );
}
/**
* Display pending notice to anon users when submitted post is pending
* @since 1.0.0
*/
public function anon_pending_notice() {
if ( ! empty( $_GET['moderation_pending'] ) ) {
$post_id = absint( filter_var( $_GET['moderation_pending'], FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH ) );
$post = get_post( $post_id );
if ( in_array( $post->post_type, array( 'topic', 'reply' ) ) && 0 == $post->post_author ) {
switch( $post->post_type ) {
case 'topic':
$message = __('Your topic has been submitted and is pending further moderation', 'bbp-style-pack' );
break;
case 'reply':
$message = __('Your reply has been submitted and is pending further moderation', 'bbp-style-pack' );
break;
}
echo '<div class="bbp-template-notice"><p>' . $message . '</p></div>';
}
}
}
/**
* Check if a user is blocked, or cannot spectate the forums.
*
* @since 1.0.0
*
* @uses is_user_logged_in() To check if user is logged in
* @uses bbp_is_user_keymaster() To check if user is a keymaster
* @uses current_user_can() To check if the current user can spectate
* @uses is_bbpress() To check if in a bbPress section of the site
* @uses bbp_set_404() To set a 404 status
*/
public function bbp_forum_enforce_blocked() {
if ( ! is_user_logged_in() || bbp_is_user_keymaster() )
return;
// Redirect to custom block page or Set 404 if in bbPress and user cannot spectate
if ( is_bbpress() && ! current_user_can( 'spectate' ) ) {
if ( $page_id = get_option( '_bbp_blocked_page_id' ) ) {
wp_redirect( get_permalink( $page_id ) );
exit;
} else {
bbp_set_404();
}
}
}
/**
* Add 'approve' or 'pending' link into the mod links
*
* @since 0.1.0
* @since 1.0.0 Added bbPress version check to remove links being added to unapprove/approve posts
* @since 1.2.0 Updated to use bbp_topic_admin_links and bbp_reply_admin_links hook
*
* @param array $links
* @param int $post_id
*
* @return array $links
*/
public function add_moderation_links( $links, $post_id ) {
if ( $this->user_can_moderate() ) {
$post_status = bbp_get_topic_status( $post_id );
$post_type = get_post_type( $post_id );
$bbpress_version = bbp_get_version();
$bbpress_version = explode( '-', $bbpress_version );
$bbpress_version = reset( $bbpress_version );
$is_pre_bbpress_2_6 = ( version_compare( '2.6', $bbpress_version ) <= 0 ) ? true : false;
if ( 'spam' != $post_status && 'pending' == $post_status && ! $is_pre_bbpress_2_6 ) {
$url = add_query_arg( array(
$post_type . '_id' => $post_id,
'action' => $this->plugin_slug . '-approve',
));
$nonce_url = wp_nonce_url( $url, 'moderator_action', $this->plugin_slug . '-wp_nonce' );
array_push( $links, '<a href="' . $nonce_url . '" class="bbp-reply-edit-link">' . __( 'Approve', 'bbp-style-pack' ) . '</a>' );
} else if ( 'spam' != $post_status && 'pending' != $post_status && ! $is_pre_bbpress_2_6 ) {
$url = add_query_arg( array(
$post_type . '_id' => $post_id,
'action' => $this->plugin_slug . '-remove',
));
$nonce_url = wp_nonce_url( $url, 'moderator_action', $this->plugin_slug . '-wp_nonce' );
array_push( $links, '<a href="' . $nonce_url . '" class="bbp-reply-edit-link">' . __( 'Unapprove', 'bbp-style-pack' ) . '</a>' );
}
}
return $links;
}
}
bspbbPressModToolsPlugin_bbPress::init();