WordPressの通常の404.phpでは、下書き投稿、非公開投稿、予約投稿など、非表示にするべきページを一括して非表示としています。
WEBサイトの構成によっては、ログインユーザーには、予約投稿である事をあえて表示したいといった事が必要になることがあります。
非公開ページが、どのような種類のもので、必要な一部の情報を表示することが出来るように工夫をしてみました。
functions.php
function my_get_404_id( ){ global $wp_query,$wpdb; if ( is_404() ) { if ( $wp_query->found_posts== 0 ) { return false; } /* 固定ページ */ if ( isset( $wp_query->queried_object->ID ) ) { return absint( $wp_query->queried_object->ID ); } /* 下書き */ if ( isset( $wp_query->query['page_id'] ) ) { return absint( $wp_query->query['page_id'] ); } /* 投稿 非ログイン固定ページ*/ if ( isset( $wp_query->request ) ) { return absint( $wpdb->get_var( $wp_query->request ) ); } } } function my_get_404_status( ) { global $wp_query; if ( is_404() ) { if ( $wp_query->found_posts== 0 ) { return false; } /* page */ if( isset( $wp_query->queried_object->post_status ) ) { return $wp_query->queried_object->post_status; } /* 下書き */ if ( isset( $wp_query->query['page_id'] ) ) { $id= my_get_404_id(); return get_post_status( $id ); } /* post */ if ( isset( $wp_query->request ) ) { $id= my_get_404_id(); return get_post_status( $id ); } } }
404.php
<?php $my_status_html= '<h3>%1$s</h3>'; if ( $status= my_get_404_status() ) { switch( $status ) { case( 'draft'): printf( $my_status_html, 'この投稿は、草稿です。公開していません' ); break; case( 'pending'): printf( $my_status_html, 'この投稿は、レビュー待ちです。公開していません' ); break; case( 'future'): printf( $my_status_html, 'この投稿は、近日公開予定です' ); break; case( 'private'): printf( $my_status_html, 'この投稿は、非公開です' ); break; } } else { ?> <article id="post-0" class="post error404 no-results not-found"> // 元々の404ページの表示内容 </article><!-- #post-0 --> <?php } ?>