Skip to content

Instantly share code, notes, and snippets.

@mattclements
Last active March 22, 2024 04:18
Show Gist options
  • Save mattclements/eab5ef656b2f946c4bfb to your computer and use it in GitHub Desktop.
Save mattclements/eab5ef656b2f946c4bfb to your computer and use it in GitHub Desktop.
Wordpress Disable Comments (add to function.php)
<?php
add_action('admin_init', function () {
// Redirect any user trying to access comments page
global $pagenow;
if ($pagenow === 'edit-comments.php') {
wp_redirect(admin_url());
exit;
}
// Remove comments metabox from dashboard
remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');
// Disable support for comments and trackbacks in post types
foreach (get_post_types() as $post_type) {
if (post_type_supports($post_type, 'comments')) {
remove_post_type_support($post_type, 'comments');
remove_post_type_support($post_type, 'trackbacks');
}
}
});
// Close comments on the front-end
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);
// Hide existing comments
add_filter('comments_array', '__return_empty_array', 10, 2);
// Remove comments page in menu
add_action('admin_menu', function () {
remove_menu_page('edit-comments.php');
});
// Remove comments links from admin bar
add_action('init', function () {
if (is_admin_bar_showing()) {
remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
}
});
@lindenism
Copy link

Your code has a flaw! It does not remove existing comment count in admin bar.

function df_disable_comments_admin_menu() {
remove_menu_page('edit-comments.php');
}
add_action('init', 'df_disable_comments_admin_menu');

This code is not working and is broken. init should be admin-init.

See working code...

function df_disable_comments_admin_bar() {
if (is_admin_bar_showing()) {
remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
}
}
add_action('admin_init', 'df_disable_comments_admin_bar');

@mattclements
Copy link
Author

Thanks @danielpost!

I have updated the very old version that I had to yours, much cleaner and I think it covers all the other flaws that others have commented on.

@thiendo
Copy link

thiendo commented Nov 13, 2019

  1. Change setting in Settings > Discussion.
  2. Disable Comments section in Admin by adding this code to functions.php
function remove_menus() {
    remove_menu_page( 'edit-comments.php' );
}
add_action( 'admin_menu', 'remove_menus' );

@EarthlingDavey
Copy link

EarthlingDavey commented Jan 30, 2020

Thank you.

For a class that can be included then initialised with \x\Comments::initialise(); try this gist:
https://gist.github.com/EarthlingDavey/bc72015b23449a10e4476c2fe6a63fec

@TechRemarker
Copy link

Still shows in the admin bar. Updating that portion to this and appears to work: https://www.isitwp.com/remove-comments-link-from-admin-bar/.

@ramsesdelr
Copy link

Works perfectly, thanks!

@craigiswayne
Copy link

Thank you 👍

@manuki76
Copy link

manuki76 commented Dec 9, 2020

Thank you works great!

@svsdesign
Copy link

Nice one - 👍

@flyingwebie
Copy link

Thanks million :D

@dexterski
Copy link

It works!

@SteaveRayvon
Copy link

SteaveRayvon commented Apr 19, 2021

thanks!

@robbiegod
Copy link

Does this function prevent comment spam as well?

@SteaveRayvon
Copy link

Does this function prevent comment spam as well?
yes

@jadamec
Copy link

jadamec commented Jun 2, 2021

Thanks, but the last part Remove comments links from admin bar doesn't work for me. Comment icon is still showing in Admin Bar.

Wordpress 5.7.2

@glafarge
Copy link

glafarge commented Jun 6, 2021

You could also remove the submenu page Settings > Discussion from admin as no longer needed.

I updated @danielpost clean code, reflecting those changes :

<?php

/**
 * For example, copy the following to "wp-content/mu-plugins/disable-comments.php"
 * to use it as a "must-use plugin" (always-on and before "normals" plugins)
 */ 

add_action('admin_init', function () {
    // Redirect any user trying to access comments page
    global $pagenow;
    
    if ($pagenow === 'edit-comments.php' || $pagenow === 'options-discussion.php') {
        wp_redirect(admin_url());
        exit;
    }

    // Remove comments metabox from dashboard
    remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');

    // Disable support for comments and trackbacks in post types
    foreach (get_post_types() as $post_type) {
        if (post_type_supports($post_type, 'comments')) {
            remove_post_type_support($post_type, 'comments');
            remove_post_type_support($post_type, 'trackbacks');
        }
    }
});

// Close comments on the front-end
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);

// Hide existing comments
add_filter('comments_array', '__return_empty_array', 10, 2);

// Remove comments page and option page in menu 
add_action('admin_menu', function () {
    remove_menu_page('edit-comments.php');
    remove_submenu_page('options-general.php', 'options-discussion.php');
});

// Remove comments links from admin bar
add_action('init', function () {
    if (is_admin_bar_showing()) {
        remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
    }
});

@erwinpratama
Copy link

Thanks you.
I want to disable my wordpress comment on my site.

@quasiDigi
Copy link

Thank @glafarge and @danielpost!

@AcademicHumber
Copy link

Thanks, it worked 😄

@dave-slaughter
Copy link

dave-slaughter commented Nov 20, 2021

Thanks, however the code to remove the comments menu from the admin bar doesn't work as the call to add_action wp_admin_bar_comments_menu doesn't happen until after the init hook. The correct hook to use is add_admin_bar_menus, which runs just after all the actions for the admin bar menus are added.

// Remove comments links from admin bar
add_action('add_admin_bar_menus', function () {
    remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
});

@ShaneMuir
Copy link

Thank you!

@Azzamean-zz
Copy link

If anyone uses a Multsite... they will notice the 'manage comments' are still in the top admin bar.

add_action( 'admin_bar_menu', 'remove_toolbar_items', PHP_INT_MAX -1 );
function remove_toolbar_items( $bar )
{
	// global $wp_admin_bar;
	// $wp_admin_bar->remove_node( 'blog-1-c' );
		
    $sites = get_blogs_of_user( get_current_user_id() );
    foreach ( $sites as $site )
    {
        $bar->remove_node( "blog-{$site->userblog_id}-c" );
    }
}

Worked for me to remove it. Comments is an example if you just wanted one...

@jack-fdrv
Copy link

jack-fdrv commented May 3, 2022

image
We also need to hide this info.

@amarineau
Copy link

Nice ! Thx :)

@masterewot
Copy link

I need this for my site

@drnickyoung
Copy link

drnickyoung commented Dec 19, 2022

@jack-fdrv You may have already found an answer but thought I'd comment in case. This does depend on the theme used but the following code works in many cases.

// Return a comment count of zero to hide existing comment entry link.
function zero_comment_count($count){
     return 0;
}
add_filter('get_comments_number', 'zero_comment_count');

@shanemac10
Copy link

Here's the collective code from this thread to date, as it worked for me...

<?php

add_action('admin_init', function () {
	// Redirect any user trying to access comments page
	global $pagenow;

	if ($pagenow === 'edit-comments.php' || $pagenow === 'options-discussion.php') {
		wp_redirect(admin_url());
		exit;
	}

	// Remove comments metabox from dashboard
	remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');

	// Disable support for comments and trackbacks in post types
	foreach (get_post_types() as $post_type) {
		if (post_type_supports($post_type, 'comments')) {
			remove_post_type_support($post_type, 'comments');
			remove_post_type_support($post_type, 'trackbacks');
		}
	}
});

// Close comments on the front-end
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);

// Hide existing comments
add_filter('comments_array', '__return_empty_array', 10, 2);

// Remove comments page in menu
add_action('admin_menu', function () {
  remove_menu_page('edit-comments.php');
	remove_submenu_page('options-general.php', 'options-discussion.php');
});

// Remove comments links from admin bar
add_action('init', function () {
	if (is_admin_bar_showing()) {
		remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
	}
});

// Remove comments icon from admin bar
add_action('wp_before_admin_bar_render', function() {
	global $wp_admin_bar;
	$wp_admin_bar->remove_menu('comments');
});

// Return a comment count of zero to hide existing comment entry link.
function zero_comment_count($count){
	return 0;
}
add_filter('get_comments_number', 'zero_comment_count');

// Multisite - Remove manage comments from admin bar
add_action( 'admin_bar_menu', 'remove_toolbar_items', PHP_INT_MAX -1 );
function remove_toolbar_items( $bar )
{
	$sites = get_blogs_of_user( get_current_user_id() );
	foreach ( $sites as $site )
	{
		$bar->remove_node( "blog-{$site->userblog_id}-c" );
	}
}

I put mine in a separate file disable-comments.php and included it in functions.php, to make it more portable moving forward...

// Disable Comments
include('inc/disable-comments.php');

@dave-slaughter
Copy link

Nice work by this thread, so here's an additional improvement you might like.

I noticed 5 queries on wp_comments were running for each admin page, which can be removed. I put this in the "init" hook where I already have code inside an is_admin() test, but you don't need this test. Also, the filter can't go in the "admin_init" hook as that is too late as the queries will have already run.

add_action('init', function () {
	if (is_admin()) {
		// stop queries to count comments, which are called when the admin menu is displayed
		add_filter('wp_count_comments', function() {
			return (object) [
				'approved'       => 0,
				'moderated'      => 0,
				'spam'           => 0,
				'trash'          => 0,
				'post-trashed'   => 0,
				'total_comments' => 0,
				'all'            => 0,
			];
		});
	}
});

@OzzyCzech
Copy link

You can disable comment feed with:

add_filter('feed_links_show_comments_feed', '__return_false');

@EarthlingDavey
Copy link

To hide the default first comment from the activity feed

add_filter( 'the_comments', '__return_empty_array' );

also

// Return a comment count of zero to hide existing comment entry link.
function zero_comment_count($count){
	return 0;
}
add_filter('get_comments_number', 'zero_comment_count');

can be shortened to:

add_filter('get_comments_number', '__return_zero');

Thanks folks :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment