web-dev-qa-db-ja.com

コアをハッキングせずにWordPressのコア機能を変更する

コア関数内の1行を変更しようとしています。関数は/wp-includes/comment.php内にあるwp_allow_comment()です。

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

$approved = 'spam';$approved = 'trash';に変更したいのですが、これはコアをハックせずに達成できるものですか?私は可能な解決策として私の頭をフィルターで包むことを試みていますが、運がありません。

私はこのようなことを試しました:

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

しかしそれは結局一緒にスパムフィルタリングを殺すことになった、私は間違いなく適切にフィルタを使用していない。

2
Josh Mountain

あなたは正しくフィルタリングしていません。まず、あなたは関数に変数を渡していないので、あなたの関数は$comment_authorが何であるかを知る方法がありません、など。次に、値を返す必要があります。

テストされていませんが、動作するはずです。

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