{"id":12888,"date":"2025-04-07T18:59:31","date_gmt":"2025-04-07T18:59:31","guid":{"rendered":"https:\/\/scopedesign.com\/?p=12888"},"modified":"2026-08-25T23:53:47","modified_gmt":"2026-08-25T23:53:47","slug":"how-to-mass-disable-comments-on-old-wordpress-posts","status":"publish","type":"post","link":"https:\/\/scopedesign.com\/cms\/how-to-mass-disable-comments-on-old-wordpress-posts\/","title":{"rendered":"How to Mass Disable Comments on Old WordPress Posts (5 Proven Methods)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>If you want to disable comments on old WordPress posts without deleting the discussion that is already there, start with WordPress\u2019s built-in age rule.<\/strong> Go to <strong>Settings \u2192 Discussion<\/strong>, enable <strong>Automatically close comments on articles older than X days<\/strong>, choose the cutoff, and save. WordPress stops accepting new comments on posts older than that threshold while leaving previously approved comments visible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That distinction matters: <strong>disabling comments is a state change; deleting comments is content destruction.<\/strong> If the job is \u201cstop new comments on our archive,\u201d there is normally no reason to empty <code>wp_comments<\/code>, truncate tables, or erase legitimate conversation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quick-answer\">The quick answer: five ways to disable comments on old WordPress posts<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Situation<\/th><th>Best method<\/th><th>Plugin?<\/th><th>Existing comments preserved?<\/th><\/tr><\/thead><tbody><tr><td>Automatically close discussion after posts age<\/td><td>1. Native age rule<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Close selected existing posts or pages<\/td><td>2. Bulk Edit<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Close large or repeatable batches with shell access<\/td><td>3. WP-CLI<\/td><td>No<\/td><td>Yes<\/td><\/tr><tr><td>Enforce an ongoing no-comments policy<\/td><td>4. Disable Comments plugin<\/td><td>Yes<\/td><td>Usually<\/td><\/tr><tr><td>Close everything before an exact date at database scale<\/td><td>5. Direct SQL<\/td><td>No<\/td><td>Yes, if you only change post state<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The native methods come first on purpose. Adding a permanent plugin for a one-time checkbox job creates another dependency to maintain. Direct SQL sits last because it is powerful and precise, but it bypasses the normal WordPress application path. Powerful does not automatically mean better. Sometimes it just means the mistake happens faster.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"shutdown-ladder\">Close, hide, and delete are three different jobs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Scope Design Comment Shutdown Ladder keeps the operations separate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Close:<\/strong> stop new comment submissions while approved history can remain visible. This is the default recommendation.<\/li>\n\n<li><strong>Hide:<\/strong> change what visitors see. The data can still exist, and hiding a form is not the same as changing whether WordPress accepts comments.<\/li>\n\n<li><strong>Delete:<\/strong> remove comment data. This is a separate cleanup or retention decision and deserves its own backup and approval.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Before any large WP-CLI or database change, protect a recovery point and preview what will be affected. That is the same controlled-change discipline in our <a href=\"https:\/\/scopedesign.com\/cms\/wordpress-plugin-management-security-guide-professional-updates\/\">safe WordPress plugin update guide<\/a>: know the scope, have a way back, make the smallest necessary change, then prove the result.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"method-1\">Method 1: automatically close comments after X days<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Best for:<\/strong> sites that want discussion on fresh articles but want old content to close automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In <strong>Settings \u2192 Discussion \u2192 Other comment settings<\/strong>, enable <strong>Automatically close comments on articles older than X days<\/strong>. Enter the age threshold that fits your publishing model\u201430, 60, 90, 180, or another number\u2014and save. <a href=\"https:\/\/wordpress.org\/documentation\/article\/settings-discussion-screen\/\" target=\"_blank\" rel=\"noopener\">WordPress\u2019s Discussion settings documentation<\/a> explicitly says the setting prevents new comments after the period while leaving previously approved comments visible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is different from unchecking <strong>Allow people to post comments on new articles<\/strong>. That option controls the default for new content going forward. The age rule is the built-in answer when you specifically need to disable comments on old WordPress posts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"custom-post-types\">Custom post types need a separate check<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress core\u2019s old-post closure logic defaults to the standard <code>post<\/code> post type. The <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/_close_comments_for_old_posts\/\" target=\"_blank\" rel=\"noopener\">core reference for <code>_close_comments_for_old_posts()<\/code><\/a> shows the default and the <code>close_comments_for_post_types<\/code> filter developers can use to extend it. Do not assume the dashboard age rule automatically covers products, events, portfolios, or every custom post type.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That matters because features can use comments under the hood. WooCommerce product reviews are an obvious example. Inventory the content types before applying a broad rule.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"method-2\">Method 2: Bulk Edit selected existing posts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Best for:<\/strong> a one-time batch where you know which existing posts or pages should stop accepting comments.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>Posts \u2192 All Posts<\/strong>.<\/li>\n\n<li>Use date, category, author, or search filters to narrow the list.<\/li>\n\n<li>Select the posts and choose <strong>Bulk actions \u2192 Edit<\/strong>.<\/li>\n\n<li>Set <strong>Comments<\/strong> to <strong>Do not allow<\/strong>.<\/li>\n\n<li>Click <strong>Update<\/strong> and verify representative posts on the front end.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/wordpress.org\/documentation\/article\/posts-screen\/\" target=\"_blank\" rel=\"noopener\">WordPress\u2019s Posts screen documentation<\/a> confirms that Bulk Edit can change Comments Allowed for selected posts. The same general approach is available for Pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some tutorials call 20 posts a hard Bulk Edit limit. It is not. Twenty is a common default number of rows shown in the admin list. You can display more rows and work in sensible batches. On large sites, smaller batches are often smarter because they make failures easier to isolate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"method-3\">Method 3: WP-CLI for large or repeatable batches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Best for:<\/strong> developers and administrators with shell access who need a repeatable, reviewable change across many posts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The official <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/post\/list\/\" target=\"_blank\" rel=\"noopener\">wp post list<\/a> command can preview IDs, dates, titles, and comment status. The official <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/post\/update\/\" target=\"_blank\" rel=\"noopener\">wp post update<\/a> command supports <code>--comment_status=open|closed<\/code> for one or more IDs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Preview first:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wp post list --post_type=post --post_status=publish --fields=ID,post_date,post_title,comment_status --format=table<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Then close a known batch:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wp post update 123 456 789 --comment_status=closed<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For a whole publication year, <code>wp post list<\/code> can pass the WordPress <code>year<\/code> query argument:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wp post update $(wp post list --post_type=post --post_status=publish --year=2024 --format=ids) --comment_status=closed<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use batches on very large sites. Giant all-at-once shell commands can hit argument-length limits and are harder to inspect. Years, categories, or known ID groups create safer checkpoints.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"method-4\">Method 4: a Disable Comments plugin for an ongoing policy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Best for:<\/strong> organizations that do not want comments at all, or want a persistent no-comments policy on particular post types or a multisite network.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The official WordPress.org listing for <a href=\"https:\/\/wordpress.org\/plugins\/disable-comments\/\" target=\"_blank\" rel=\"noopener\">Disable Comments by WPDeveloper<\/a> can disable comments across posts, pages, media, or the network and remove much of the comments-related admin interface. Its documentation also says not to use it merely for selectively disabling individual posts because WordPress already supports that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That matches our normal WordPress rule: <strong>do not add a permanent dependency to solve a temporary checkbox problem.<\/strong> If \u201ccomments are not a feature here\u201d is truly an ongoing policy, a plugin can centralize that decision. Before activation, check whether comments power product reviews, memberships, support threads, or custom workflows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you add the plugin, own it like any other production dependency: updates, monitoring, rollback, and compatibility. Our <a href=\"https:\/\/scopedesign.com\/cms\/website-maintenance-guide-2025\/\">website maintenance guide<\/a> explains why \u201cinstalled\u201d is not the same as \u201cowned.\u201d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"method-5\">Method 5: direct SQL for an exact cutoff<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Best for:<\/strong> experienced administrators who need an exact date cutoff across a very large site and have a verified database backup plus direct database access.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Direct SQL should change the post\u2019s comment state, not delete the comments. If the goal is to close intake, update <code>comment_status<\/code> on the matching posts. Do not truncate <code>wp_comments<\/code> or <code>wp_commentmeta<\/code>. Those operations destroy data and solve a different problem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Back up first, then preview.<\/strong> Replace <code>wp_<\/code> if your site uses a different table prefix and replace the sample date with the real cutoff:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT ID, post_title, post_date, comment_status\nFROM wp_posts\nWHERE post_type = 'post'\n  AND post_status = 'publish'\n  AND post_date &lt; '2025-01-01 00:00:00'\nORDER BY post_date DESC\nLIMIT 50;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Only after the preview is correct, run the narrow state change:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE wp_posts\nSET comment_status = 'closed'\nWHERE post_type = 'post'\n  AND post_status = 'publish'\n  AND post_date &lt; '2025-01-01 00:00:00';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If pingbacks and trackbacks also need to close, handle <code>ping_status<\/code> as a separate explicit decision. A direct database change should be as narrow as the requirement. Because SQL bypasses the normal WordPress application path, verify representative posts immediately afterward and clear the normal persistent cache if the site uses one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the database workflow feels opaque, use Method 1, 2, or 3 instead. The database is a lousy place to learn by vibes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"verify\">How to verify the shutdown<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open an old post that should now be closed in a private browser window.<\/li>\n\n<li>Confirm the comment form is unavailable.<\/li>\n\n<li>Confirm approved historical comments still display when preservation was part of the plan.<\/li>\n\n<li>Open a recent post that should remain open and confirm it still accepts comments.<\/li>\n\n<li>If you changed pages or custom post types, test at least one representative item from each type.<\/li>\n\n<li>If you used SQL or changed a production plugin policy, record what changed, when, and how to reverse it.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This is the same principle behind our <a href=\"https:\/\/scopedesign.com\/cms\/fast-functional-web-development-performance-mastery\/\">Web Development &amp; Technical Optimization framework<\/a>: a change is not complete when it is typed. It is complete when the intended behavior is proven.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faq-delete\">Does disabling comments delete existing comments?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. Closing comments prevents new submissions; it does not inherently delete approved comments already stored on the post. WordPress\u2019s built-in age setting explicitly leaves previously approved comments visible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faq-all\">How do I disable comments on all existing posts without a plugin?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use Posts \u2192 All Posts \u2192 select the target posts \u2192 Bulk actions \u2192 Edit \u2192 Comments \u2192 Do not allow. For large sites with shell access, WP-CLI can set <code>comment_status<\/code> to <code>closed<\/code> for controlled batches.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faq-pages\">Can I disable comments on pages too?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Pages also have a comment permission state, and the Pages screen supports bulk editing Comments Allowed. Whether a theme displays a page comment form is a separate presentation question.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"faq-reopen\">Can I reopen comments later?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Bulk Edit and WP-CLI can set comment status back to open, and the age rule can be disabled or changed. That reversibility is another reason to prefer a state change over deletion.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Close the door; do not burn the guestbook<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For most sites, the right way to disable comments on old WordPress posts is a native setting followed by a quick verification. Use Bulk Edit when the set is selective, WP-CLI when the work is large or repeatable, a plugin when the policy is persistent, and SQL only when the scale and precision justify bypassing the normal application path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If comment cleanup is one symptom of a WordPress site nobody clearly owns\u2014updates are ad hoc, backups are theoretical, and every change feels risky\u2014review what <a href=\"https:\/\/scopedesign.com\/cms\/wordpress-maintenance-services-2024-support-guide\/\">real WordPress maintenance support should include<\/a>. Good maintenance is intentionally uneventful: scoped, recoverable, tested, and documented.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sources\">Sources and further reading<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/wordpress.org\/documentation\/article\/settings-discussion-screen\/\" target=\"_blank\" rel=\"noopener\">WordPress.org: Settings Discussion screen<\/a><\/li>\n\n<li><a href=\"https:\/\/wordpress.org\/documentation\/article\/posts-screen\/\" target=\"_blank\" rel=\"noopener\">WordPress.org: Posts screen and Bulk Edit<\/a><\/li>\n\n<li><a href=\"https:\/\/wordpress.org\/documentation\/article\/comments-in-wordpress\/\" target=\"_blank\" rel=\"noopener\">WordPress.org: Comments in WordPress<\/a><\/li>\n\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/_close_comments_for_old_posts\/\" target=\"_blank\" rel=\"noopener\">WordPress Developer Resources: _close_comments_for_old_posts()<\/a><\/li>\n\n<li><a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/post\/list\/\" target=\"_blank\" rel=\"noopener\">WP-CLI: wp post list<\/a><\/li>\n\n<li><a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/post\/update\/\" target=\"_blank\" rel=\"noopener\">WP-CLI: wp post update<\/a><\/li>\n\n<li><a href=\"https:\/\/wordpress.org\/plugins\/disable-comments\/\" target=\"_blank\" rel=\"noopener\">WordPress.org: Disable Comments plugin<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Disable comments on old WordPress posts without deleting historical discussion. Compare the native age rule, Bulk Edit, WP-CLI, a plugin, and SQL.<\/p>\n","protected":false},"author":1,"featured_media":16876,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[173],"tags":[649,496,57,648,650],"class_list":["post-12888","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-development-technical-optimization","tag-comment-management","tag-website-maintenance","tag-wordpress","tag-wordpress-comments","tag-wp-cli"],"acf":{"scope_editorial_pick":false},"_links":{"self":[{"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/posts\/12888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/comments?post=12888"}],"version-history":[{"count":0,"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/posts\/12888\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/media\/16876"}],"wp:attachment":[{"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/media?parent=12888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/categories?post=12888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scopedesign.com\/cms\/wp-json\/wp\/v2\/tags?post=12888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}