WordPress 記事一覧から非公開記事を除外する方法

WordPress で記事一覧から非公開記事を除外(非表示)する方法を紹介します。
例えば、クライアント運用時「非公開記事の表示が紛らわしい」場合に便利な方法です。

  1. サイト全体で非公開記事を除外する方法
  2. メインループやサブループから非公開記事を除外する方法

サイト全体で非公開記事を除外する方法

投稿に「非公開記事」がある場合、管理画面へログイン中の時には記事一覧に「非公開記事」が表示されてしまいます。
非公開記事を非表示にするにはクエリをカスタマイズして、公開済みの記事のみを表示するようにすることができます。
例えば、アーカイブページ一覧から非公開記事を除外するには、function.php に次のコードを追加します。

/*【出力カスタマイズ】クエリーカスタマイズ、ループから非公開記事を除外 */
function custom_posts() {
global $wp_query;
if($wp_query->is_admin) return; // 管理画面内は除く
if(is_post_type_archive()){ // アーカイブページ
$wp_query->query_vars['post_status'] = 'publish'; // 投稿ステータス「公開済」
}
}
add_filter('pre_get_posts', 'custom_posts');

アーカイブページで実行されるように条件分岐を追加。特定のページに限定したい場合は、if文の条件を変更または追加してください。
次に、公開済記事のみを表示するために post_status に値 publish(公開済)を指定します。
カスタム投稿タイプのアーカイブのみ指定したい場合などは、is_post_type_archive('example') などと指定してください。

他の条件で記事を除外する場合

非公開記事以外のステータスで記事を除外する場合は以下の表を参照してください。

公開済
publish
予約済
future
下書き
draft
承認待ち
pending
非公開
private
ゴミ箱
trash
自動保存
auto-draft
継承
inherit

メインループやサブループから非公開記事を除外する方法

メインループやサブループから非公開記事を除外する場合は、クエリに条件を追加します。
例えば、サブループから非公開記事を削除する場合は次のコードを追加します。

<?php
$args = array(
'post_type' => 'Products', // 投稿タイプのスラッグを指定
'post_status' => 'publish', // 公開済の投稿を指定
'posts_per_page' => 5 // 投稿件数の指定
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<?php echo get_the_date(); ?>
<?php the_permalink(); ?>
<?php echo get_the_title(); ?>
<?php the_content(); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<!-- 投稿が無い場合の処理 -->
<?php endif; ?>

こちらも同様にステータスの指定 post_status に、値 publish(公開済)を指定します。
また、サブループの詳しい設定方法は「WordPress メインループとサブループの表示方法」をご覧ください。

まとめ

WordPress で記事一覧から非公開記事を除外(非表示)する方法を紹介しました。