Изменение основной функции WordPress без взлома ядра

Я хочу изменить одну строку в основной функции. Функция wp_allow_comment() находится в /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; } 

Я хотел бы изменить $approved = 'spam'; to $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'; } 

но это закончилось тем, что я убил спам-фильтрацию вместе, я определенно не использую фильтры правильно.

Solutions Collecting From Web of "Изменение основной функции WordPress без взлома ядра"

Вы не фильтруете правильно. Во-первых, вы не передаете переменные функции, поэтому ваша функция не знает, что такое $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; }