非公開固定ページ・投稿を直接表示した時の404.phpの内容を変更する

非公開に設定した投稿や固定ページを表示すると404.phpが表示されます。
他にも下書き投稿、予約投稿なども404.phpが表示されます。
404.phpで「投稿がありません」と表示されるのを、投稿のステータスに合わせて表示をカスタマイズしました。

特に「非公開」記事の場合は、ログインが必要なことを表示して、ログインページにリンクしリダイレクト先に該当の記事のURLを設定しました。

記事のIDと記事のステータスを返します。
function.php
//非公開記事の404表示用
function my_get_404_status( ) {

	global $wp_query;

	if ( is_404() ) {

		if ( $wp_query->found_posts == 0 ) {
			return false;
		}
		
		/* 固定ページ */
		if( isset( $wp_query->queried_object->post_status ) ) {
			
			return array($wp_query->queried_object->ID,$wp_query->queried_object->post_status);
		}
		
		/* 投稿 */
		if ( isset( $wp_query->request ) ) {

			$id = $wpdb->get_var( $wp_query->request );
			return array($id,get_post_status( $id ));
		}
	}
}

記事のステータスに合わせた表示の分岐
404.php
<?php
$my_status_html = '<h3>%1$s</h3>';
if ( list($postid,$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, 'この投稿は、非公開です。ログインしてください。' );
			
			echo '<p>この記事は<a href="'. get_option('siteurl') .'/wp-login.php?redirect_to='. get_permalink($postid) .'">ログイン</a>しなければ表示できない会員のみ閲覧可能な記事です。</p>';

		break;
	endswitch;
?>
<?php else: ?>
<p>お探しのページが見あたりません。<br />申し訳ございませんが、記事が削除されたかURLが変更になった可能性があります。</p>
<?php endif; ?>
 

※参考にさせて頂きました。
404.php のカスタマイズ
Comments

コメントする