bbp_check_for_moderation( array $anonymous_data = array(), int $author_id, string $title = '', string $content = '', mixed $strict = false )

Checks topics and replies against the discussion moderation of blocked keys


Description Description


Parameters Parameters

$anonymous_data

(Optional) - if it's an anonymous post. Do not supply if supplying $author_id. Should be sanitized (see bbp_filter_anonymous_post_data()

Default value: array()

$author_id

(Optional) Topic or reply author ID

$title

(Optional) The title of the content

Default value: ''

$content

(Optional) The content being posted

Default value: ''

$strict

(Optional) False for moderation_keys. True for blacklist_keys. String for custom keys.

Default value: false


Top ↑

Return Return

(bool) True if test is passed, false if fail


Top ↑

Source Source

File: includes/common/functions.php

function bbp_check_for_moderation( $anonymous_data = array(), $author_id = 0, $title = '', $content = '', $strict = false ) {

	// Custom moderation option key
	if ( is_string( $strict ) ) {
		$strict = sanitize_key( $strict );

		// Use custom key
		if ( ! empty( $strict ) ) {
			$hook_name   = $strict;
			$option_name = "{$strict}_keys";

		// Key was invalid, so default to moderation keys
		} else {
			$strict = false;
		}
	}

	// Strict mode uses WordPress "blacklist" settings
	if ( true === $strict ) {
		$hook_name   = 'blacklist';
		$option_name = 'blacklist_keys';

	// Non-strict uses WordPress "moderation" settings
	} elseif ( false === $strict ) {
		$hook_name   = 'moderation';
		$option_name = 'moderation_keys';
	}

	// Allow for moderation check to be skipped
	if ( apply_filters( "bbp_bypass_check_for_{$hook_name}", false, $anonymous_data, $author_id, $title, $content, $strict ) ) {
		return true;
	}

	// Maybe perform some author-specific capability checks
	if ( ! empty( $author_id ) ) {

		// Bail if user is a keymaster
		if ( bbp_is_user_keymaster( $author_id ) ) {
			return true;

		// Bail if user can moderate
		// https://bbpress.trac.wordpress.org/ticket/2726
		} elseif ( ( false === $strict ) && user_can( $author_id, 'moderate' ) ) {
			return true;
		}
	}

	// Define local variable(s)
	$_post     = array();
	$match_out = '';

	/** Max Links *************************************************************/

	// Only check max_links when not being strict
	if ( false === $strict ) {
		$max_links = get_option( 'comment_max_links' );
		if ( ! empty( $max_links ) ) {

			// How many links?
			$num_links = preg_match_all( '/(http|ftp|https):\/\//i', $content, $match_out );

			// Allow for bumping the max to include the user's URL
			if ( ! empty( $_post['url'] ) ) {
				$num_links = apply_filters( 'comment_max_links_url', $num_links, $_post['url'], $content );
			}

			// Das ist zu viele links!
			if ( $num_links >= $max_links ) {
				return false;
			}
		}
	}

	/** Moderation ************************************************************/

	/**
	 * Filters the bbPress moderation keys.
	 *
	 * @since 2.6.0 bbPress (r6050)
	 *
	 * @param string $moderation List of moderation keys. One per new line.
	 */
	$moderation = apply_filters( "bbp_{$hook_name}_keys", trim( get_option( $option_name ) ) );

	// Bail if no words to look for
	if ( empty( $moderation ) ) {
		return true;
	}

	/** User Data *************************************************************/

	// Map anonymous user data
	if ( ! empty( $anonymous_data ) ) {
		$_post['author'] = $anonymous_data['bbp_anonymous_name'];
		$_post['email']  = $anonymous_data['bbp_anonymous_email'];
		$_post['url']    = $anonymous_data['bbp_anonymous_website'];

	// Map current user data
	} elseif ( ! empty( $author_id ) ) {

		// Get author data
		$user = get_userdata( $author_id );

		// If data exists, map it
		if ( ! empty( $user ) ) {
			$_post['author'] = $user->display_name;
			$_post['email']  = $user->user_email;
			$_post['url']    = $user->user_url;
		}
	}

	// Current user IP and user agent
	$_post['user_ip'] = bbp_current_author_ip();
	$_post['user_ua'] = bbp_current_author_ua();

	// Post title and content
	$_post['title']   = $title;
	$_post['content'] = $content;

	// Ensure HTML tags are not being used to bypass the moderation list.
	$_post['comment_without_html'] = wp_strip_all_tags( $content );

	/** Words *****************************************************************/

	// Get words separated by new lines
	$words = explode( "\n", $moderation );

	// Loop through words
	foreach ( (array) $words as $word ) {

		// Trim the whitespace from the word
		$word = trim( $word );

		// Skip empty lines
		if ( empty( $word ) ) {
			continue;
		}

		// Do some escaping magic so that '#' chars in the
		// spam words don't break things:
		$word    = preg_quote( $word, '#' );
		$pattern = "#{$word}#i";

		// Loop through post data
		foreach ( $_post as $post_data ) {

			// Check each user data for current word
			if ( preg_match( $pattern, $post_data ) ) {

				// Post does not pass
				return false;
			}
		}
	}

	// Check passed successfully
	return true;
}

Top ↑

Changelog Changelog

Changelog
Version Description
2.1.0 Introduced.

Top ↑

User Contributed Notes User Contributed Notes

You must log in before being able to contribute a note or feedback.