Last active
August 9, 2024 20:45
-
-
Save doiftrue/ab931c1d866cb113b4ff318a5faeb3b3 to your computer and use it in GitHub Desktop.
[wp-kama embed] https://wp-kama.com/2539 Disable Comments for WordPress. Original code see here: https://github.com/WPDevelopers/disable-comments-mu
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 | |
*/ | |
defined( 'ABSPATH' ) || exit; | |
new Disable_WP_Comments(); | |
class Disable_WP_Comments { | |
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 ); | |
} | |
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' ); | |
} // phpcs:ignore | |
// Filters for front end only | |
else { | |
add_action( 'template_redirect', [ $this, 'check_comment_template' ] ); | |
add_filter( 'comments_open', '__return_false', 20 ); | |
add_filter( 'pings_open', '__return_false', 20 ); | |
// remove comments links from feed | |
add_filter( 'post_comments_feed_link', '__return_false' ); | |
add_filter( 'comments_link_feed', '__return_false' ); | |
add_filter( 'comment_link', '__return_false' ); | |
// remove comment count from feed | |
add_filter( 'get_comments_number', '__return_false' ); | |
// 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( esc_html__( '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' ], true ) ) { | |
wp_die( esc_html__( '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 ] ); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you so much for this, exactly what I was looking for.