Changing a WordPress core function without hacking core

I am looking to change one line within a core function. The function is wp_allow_comment() located within /wp-includes/comment.php

function wp_allow_comment($commentdata) {
global $wpdb;
extract($commentdata, EXTR_SKIP);

// Simple duplicate check
// expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)
$dupe = $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ", wp_unslash( $comment_post_ID ), wp_unslash( $comment_parent ), wp_unslash( $comment_author ) );
if ( $comment_author_email )
    $dupe .= $wpdb->prepare( "OR comment_author_email = %s ", wp_unslash( $comment_author_email ) );
$dupe .= $wpdb->prepare( ") AND comment_content = %s LIMIT 1", wp_unslash( $comment_content ) );
if ( $wpdb->get_var($dupe) ) {
    /**
     * Fires immediately after a duplicate comment is detected.
     *
     * @since 3.0.0
     *
     * @param array $commentdata Comment data.
     */
    do_action( 'comment_duplicate_trigger', $commentdata );
    if ( defined('DOING_AJAX') )
        die( __('Duplicate comment detected; it looks as though you’ve already said that!') );

    wp_die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
}

/**
 * Fires immediately before a comment is marked approved.
 *
 * Allows checking for comment flooding.
 *
 * @since 2.3.0
 *
 * @param string $comment_author_IP    Comment author's IP address.
 * @param string $comment_author_email Comment author's email.
 * @param string $comment_date_gmt     GMT date the comment was posted.
 */
do_action( 'check_comment_flood', $comment_author_IP, $comment_author_email, $comment_date_gmt );

if ( ! empty( $user_id ) ) {
    $user = get_userdata( $user_id );
    $post_author = $wpdb->get_var($wpdb->prepare("SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1", $comment_post_ID));
}

if ( isset( $user ) && ( $user_id == $post_author || $user->has_cap( 'moderate_comments' ) ) ) {
    // The author and the admins get respect.
    $approved = 1;
} else {
    // Everyone else's comments will be checked.
    if ( check_comment($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent, $comment_type) )
        $approved = 1;
    else
        $approved = 0;
    if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) )
        $approved = 'spam';
}

/**
 * Filter a comment's approval status before it is set.
 *
 * @since 2.1.0
 *
 * @param bool|string $approved    The approval status. Accepts 1, 0, or 'spam'.
 * @param array       $commentdata Comment data.
 */
$approved = apply_filters( 'pre_comment_approved', $approved, $commentdata );
return $approved;
}

I would like to change $approved = 'spam'; to $approved = 'trash'; – is this something that can be accomplished without hacking the core? I am trying to wrap my head around filters as a possible solution but not having any luck.

I have tried something like this:

add_filter('pre_comment_approved', 'custom_blacklist',1, 0);

function custom_blacklist() {
    if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) )
        $approved = 'trash';
}

but it ended up killing spam filtering all together, I am definitely not using filters properly.

1 Answer
1

You aren’t filtering correctly. Firstly, you aren’t passing variables to the function, so your function has no way of knowing what $comment_author is, etc. If you had debug mode enabled you’d probably get errors about undefined variables. Secondly, you need to return a value.

Untested, but seems like it ought to work:

add_filter('pre_comment_approved', 'custom_blacklist', 10, 2 );

function custom_blacklist( $approved, $commentdata ) {
    extract($commentdata, EXTR_SKIP);
    if ( wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent) )
        $approved = 'trash';

    return $approved;
}

Leave a Comment