If you are creating a WordPress theme or editing an existing theme and you’re seeing private posts in your blog feed, you’ve come to the right place. We don’t want no stinking private posts on our WordPress blog page! So, how the heck do we get rid of them.
Step 1: Make sure you’re using a Child Theme
If you are currently editing a theme that you developed or are editing a child theme, proceed to Step 2. However, if you’re editing a theme that you haven’t developed you need to create a child theme. This will preserve the changes that you make to it, otherwise, they will be lost forever if you ever decide to update your theme. Check out our post on creating a child theme.
Step 2: Find the Posts Page for your WordPress Website
Hover over appearance in your WordPress dashboard and click on Editor.
Then, select the theme that you wish to edit.
Then, find the Posts page, sometimes named home.php. This will typically lead you to
Step 3: Edit the Template-Parts/Content.php File
In order to prevent private posts from being shown in the WordPress blog page, we need to first get the page id. Do that with the following code:
$ID = get_the_id();
Then, you’re going to want to see if the current post is currently set to a private status. You can check a post’s status with the get_post_status function. We want to set it equal to a variable in order to use that variable later.
$class = get_post_status($ID) == 'private' ? 'hide' : '';
Then, we need to add a class to the article element holding our post excerpt. This class will be associated with display:none; if the post is private. In our case, we associated the hide class with display
<article id="post-<?php the_ID(); ?>" <?php post_class($class); ?>>
That code adds the hide class if the post is private or adds an empty class if the post is public (making sure that public posts are displayed and private posts are hidden from view).
In full, the code that we added to the content.php page is listed below:
<?php
// add this to prevent private posts from showing up in the blog feed
$ID = get_the_id();
$class = get_post_status($ID) == 'private' ? 'hide' : '';
?>
<article id="post-<?php the_ID(); ?>" <?php post_class($class); ?>>