web-dev-qa-db-fra.com

Changer une fonction principale de WordPress sans pirater le coeur

Je cherche à changer une ligne dans une fonction essentielle. La fonction est wp_allow_comment() située dans /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;
}

Je voudrais changer $approved = 'spam'; pour $approved = 'trash'; - est-ce quelque chose qui peut être accompli sans pirater le noyau? J'essaie de faire le tour des filtres comme solution possible, mais je n'ai aucune chance.

J'ai essayé quelque chose comme ça:

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';
}

mais cela a fini par éliminer le filtrage de spam, je n'utilise certainement pas les filtres correctement.

2
Josh Mountain

Vous ne filtrez pas correctement. Tout d'abord, vous ne transmettez pas de variables à la fonction. Votre fonction n'a donc aucun moyen de savoir ce qu'est $comment_author, etc. Si le mode débogage est activé, vous obtiendrez probablement des erreurs concernant les variables non définies. Deuxièmement, vous devez renvoyer une valeur.

Non testé, mais il semble que cela devrait fonctionner:

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;
}
3
helgatheviking