• LIGの広告成功事例
WEB

WordPressで「preview」すると「not found」になるときの対処法

WordPressで「preview」すると「not found」になるときの対処法

こんにちは。ひろゆきです。

初夏の陽気の季節ですね。

今回はWordPressのカスタマイズでハマったときの備忘録です。しょうもないことで今回もはまってしまいました。

PreviewしようとするとNot foundになっちゃう

投稿タイプの記事編集画面で、下書きのプレビューだけ表示できないという現象に遭遇しました。

ステータスが“公開済み”の場合

koukai

公開状態で「プレビュー」をクリックすると・・・

 
preview

プレビューできました!

ステータスが“下書き”の場合

sitagaki

下書き状態で「プレビュー」をクリックすると・・・

 
404

プレビューできない!

原因

似たようなバグで、追加した投稿タイプの一覧、詳細ページが表示されないというものがあります。この場合であれば、大抵rewrite ruleが原因で、パーマリンクを更新することで直ることが多いです。

しかし、今回は公開後の詳細ページは表示できるので違いました。
原因はpre get postsでした。

問題があった記述

function change_posts_per_page($query) {
	//管理画面、メインクエリーじゃないときは処理しない
	if ( is_admin() || ! $query->is_main_query())
		return;

	//HOGE POSTTYPE
	if(!empty($query->query_vars["post_type"]) && $query->query_vars["post_type"] == "hoge"){
		$query->set( 'posts_per_page', '10' );//件数変更
		$query->set( 'orderby', 'post_date' );//ソート指定
		$query->set( 'order', 'DESC' );//ソート順番
		$query->set( 'post_status', 'publish' );//公開状態
	}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

hogeポストタイプのアーカイブの表示件数を調整するために書いたコードです。
HOGE POSTTYPEの処理が詳細ページ、プレビュー画面でも通ってしまい、publishじゃない場合には表示されない状態になっていたのが原因でした。

対策

プレビューの場合には処理が走らないように調整しましょう。

修正例

function change_posts_per_page($query) {
	//管理画面、プレビュー、メインクエリーじゃないときは処理しない
	if ( is_admin() || ! $query->is_main_query() || is_preview())
		return;

	//HOGE POSTTYPE
	if(!empty($query->query_vars["post_type"]) && $query->query_vars["post_type"] == "hoge"){
		$query->set( 'posts_per_page', '10' );//件数変更
		$query->set( 'orderby', 'post_date' );//ソート指定
		$query->set( 'order', 'DESC' );//ソート順番
		$query->set( 'post_status', 'publish' );//公開状態
	}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

preview画面でpre_get_postsを使わない場合は上記の記述で良いですが、もし使いたい場合はもう少し細かく分岐する必要がありそうです。
逆に詳細ページでpre_get_postsを使わないという場合などは、is_singleで除外しちゃっても良いかと思います。

まとめ

WordPressはカスタマイズの幅が広いだけに、ニッチ過ぎて検索しても出てこないバグなど、思わぬ落とし穴にはまることがあります。
ただ、冷静になると案外簡単に解決できてしまうことも多いので、常に己との戦いですね。

ではまた。

 

【WordPressを目的に沿ってカスタマイズ】

公開前の記事を共有できるWordPressプラグイン「Public Post Preview」

WordPressのパーマリンク設定を変更して、SEOや日本語URLの対策をしよう

WordPressのカスタムフィールドを利用して、過去記事の公開日時を自動で変更する方法

WordPressでコメントやリビジョンなどの機能を削除・停止するときに使うプラグイン5選

WordPressで「Blade」テンプレートエンジンを使おう!

この記事を書いた人

ひろゆき
ひろゆき バックエンドエンジニア 2010年入社
エンジニアのひろゆきや。大阪生まれの大阪育ち。LIGを代表するエンジニアになるため、頑張るで。ほんま、よろしくやで。