Полное отключение функции комментирования в WordPress

Click here to view original web page at wp-kama.ru

Если ваш сайт на WordPress не использует функцию комментирования, отключение всех связанных с комментариями функций может помочь сделать админ-панель чище и улучшить производительность сайта. В этой статье мы рассмотрим, как полностью отключить комментирование на WordPress.

Допустим у вас есть сайт на WordPress на котором комментирование не используется. При этом:

  • В админ-панели находится пункт меню комментариев.
  • В тулбаре (админ-баре) есть пункт меню.
  • В блоках есть блок комментариев.
  • Есть возможность отправлять комментарии на сайт через POST/REST запрос.
  • и т.д.

Чтобы полностью отключить (удалить) функциональность WordPress связанную с комментариями можно использовать этот плагин:

Отключаем комментарии через код

Ниже код, который взят из плагина https://github.com/WPDevelopers/disable-comments-mu и немного адаптирован, чтобы его можно было использовать как один файл.

Создайте файл disable-comments.php в папке wp-content/mu-plugins cо следующим содержимым.

<?php
/**
 * Plugin Name: Disable Comments (Must Use version)
 * Description: Disables all WordPress comment functionality on the entire network.
 * Version: 1.1.2 (changed)
 * Plugin Changed URI: https://gist.github.com/doiftrue/ab931c1d866cb113b4ff318a5faeb3b3
 * Plugin URI: https://github.com/WPDevelopers/disable-comments-mu
 * GitHub Plugin URI: https://github.com/WPDevelopers/disable-comments-mu
 * Author: WPDeveloper
 * Author URI: https://wpdeveloper.com
 * License: GPL2
 */

if( ! defined( 'ABSPATH' ) ){
	exit;
}

new Disable_Comments_MU();

class Disable_Comments_MU {

	public function __construct() {
		// these need to happen now
		add_action( 'widgets_init', [ $this, 'disable_rc_widget' ] );
		add_filter( 'wp_headers', [ $this, 'filter_wp_headers' ] );
		add_action( 'template_redirect', [ $this, 'filter_query' ], 9 ); // before redirect_canonical

		// Admin bar filtering has to happen here since WP 3.6
		add_action( 'add_admin_bar_menus', [ $this, 'filter_admin_bar' ], 0 );
		add_action( 'admin_init', [ $this, 'filter_admin_bar' ] );

		// these can happen later
		add_action( 'wp_loaded', [ $this, 'setup_filters' ] );

		add_action( 'enqueue_block_editor_assets', [ $this, 'filter_gutenberg_blocks' ] );
		add_filter( 'rest_endpoints', [ $this, 'filter_rest_endpoints' ] );
		add_filter( 'xmlrpc_methods', [ $this, 'disable_xmlrc_comments' ] );
		add_filter( 'rest_pre_insert_comment', [ $this, 'disable_rest_API_comments' ], 10, 2 );
		add_filter( 'comments_array', '__return_empty_array', 20, 2 );
	}

	public function setup_filters() {
		$types = array_keys( get_post_types( [ 'public' => true ], 'objects' ) );
		if( ! empty( $types ) ){
			foreach( $types as $type ){
				// we need to know what native support was for later
				if( post_type_supports( $type, 'comments' ) ){
					remove_post_type_support( $type, 'comments' );
					remove_post_type_support( $type, 'trackbacks' );
				}
			}
		}

		// Filters for the admin only
		if( is_admin() ){
			add_action( 'admin_menu', [ $this, 'filter_admin_menu' ], 9999 );    // do this as late as possible
			add_action( 'admin_print_styles-index.php', [ $this, 'admin_css' ] );
			add_action( 'admin_print_styles-profile.php', [ $this, 'admin_css' ] );
			add_action( 'wp_dashboard_setup', [ $this, 'filter_dashboard' ] );
			add_filter( 'pre_option_default_pingback_flag', '__return_zero' );
		}
		// Filters for front end only
		else {
			add_action( 'template_redirect', [ $this, 'check_comment_template' ] );
			add_filter( 'comments_open', '__return_false', 20, 2 );
			add_filter( 'pings_open', '__return_false', 20, 2 );

			// remove comments links from feed
			add_filter( 'post_comments_feed_link', '__return_false', 10, 1 );
			add_filter( 'comments_link_feed', '__return_false', 10, 1 );
			add_filter( 'comment_link', '__return_false', 10, 1 );

			// remove comment count from feed
			add_filter( 'get_comments_number', '__return_false', 10, 2 );

			// Remove feed link from header
			add_filter( 'feed_links_show_comments_feed', '__return_false' );
		}
	}

	public function check_comment_template() {
		if( is_singular() ){
			// Kill the comments' template. This will deal with themes that don't check comment stati properly!
			add_filter( 'comments_template', '__return_empty_string', 20 );
			// Remove comment-reply script for themes that include it indiscriminately
			wp_deregister_script( 'comment-reply' );
			// Remove feed action
			remove_action( 'wp_head', 'feed_links_extra', 3 );
		}
	}

	public function filter_wp_headers( $headers ) {
		unset( $headers['X-Pingback'] );
		return $headers;
	}

	public function filter_query() {
		if( is_comment_feed() ){
			wp_die( __( 'Comments are closed.' ), '', [ 'response' => 403 ] );
		}
	}

	public function filter_admin_bar() {
		remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 );
		if( is_multisite() ){
			add_action( 'admin_bar_menu', [ $this, 'remove_network_comment_links' ], 500 );
		}
	}

	public function remove_network_comment_links( $wp_admin_bar ) {
		if( is_user_logged_in() ){
			foreach( (array) $wp_admin_bar->user->blogs as $blog ){
				$wp_admin_bar->remove_menu( 'blog-' . $blog->userblog_id . '-c' );
			}
		}
	}

	public function filter_admin_menu() {
		global $pagenow;

		if( in_array( $pagenow, [ 'comment.php', 'edit-comments.php', 'options-discussion.php' ] ) ){
			wp_die( __( 'Comments are closed.' ), '', [ 'response' => 403 ] );
		}

		remove_menu_page( 'edit-comments.php' );
		remove_submenu_page( 'options-general.php', 'options-discussion.php' );
	}

	public function filter_dashboard() {
		remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' );
	}

	public function admin_css() {
		?>
		<style>
			#dashboard_right_now .comment-count,
			#dashboard_right_now .comment-mod-count,
			#latest-comments,
			#welcome-panel .welcome-comments,
			.user-comment-shortcuts-wrap {
				display: none !important;
			}
		</style>
		<?php
	}

	public function disable_rc_widget() {
		// This widget has been removed from the Dashboard in WP 3.8 and can be removed in a future version
		unregister_widget( 'WP_Widget_Recent_Comments' );
		/**
		 * The widget has added a style action when it was constructed - which will
		 * still fire even if we now unregister the widget... so filter that out
		 */
		add_filter( 'show_recent_comments_widget_style', '__return_false' );
	}

	public function filter_gutenberg_blocks( $hook ) {
		add_action( 'admin_footer', [ $this, 'print_footer_scripts' ] );
	}

	public function print_footer_scripts() {
		?>
		<script>
			wp.domReady( () => {
				const blockType = 'core/latest-comments';
				if( wp.blocks && wp.data && wp.data.select( 'core/blocks' ).getBlockType( blockType ) ){
					wp.blocks.unregisterBlockType( blockType );
				}
			} );
		</script>
		<?php
	}

	/**
	 * Remove the comments endpoint for the REST API
	 */
	public function filter_rest_endpoints( $endpoints ) {
		if( isset( $endpoints['comments'] ) ){
			unset( $endpoints['comments'] );
		}
		if( isset( $endpoints['/wp/v2/comments'] ) ){
			unset( $endpoints['/wp/v2/comments'] );
		}
		if( isset( $endpoints['/wp/v2/comments/(?P<id>[\d]+)'] ) ){
			unset( $endpoints['/wp/v2/comments/(?P<id>[\d]+)'] );
		}

		return $endpoints;
	}

	public function disable_xmlrc_comments( $methods ) {
		unset( $methods['wp.newComment'] );

		return $methods;
	}

	public function disable_rest_API_comments( $prepared_comment, $request ) {
		return new WP_Error( 'rest_comment_disabled', 'Commenting is disabled.', [ 'status' => 403 ] );
	}

}

Готово! Функциональность комментирования отключена.