wordpress カスタム投稿で 2ページ目以降が404になってしまう

公開日: : WordPress, wordpress テンプレート

wordpress カスタム投稿で 2ページ目以降が404

wordpress のカスタム投稿で、ニュースのページを作っていました。

ニュース一覧で、ページ遷移 get_the_posts_pagination を使おうと思ったら2ページから404エラーになりました。

  • パーマリンク設定は、カスタム構造「/%category%/%postname%/」です。
  • ニュース一覧は、固定ページでテンプレートを指定。
  • スラッグ名(=パーマリンク)は「news」になっている状態。

カスタム投稿はこんな感じで指定していました。
functions.php

//////////////////////////////////////////////////////////
//ニュースカスタム投稿
function custom_post_type_news() {
	$labels = array(
		'name' => _x('News','post type general name'),
		'singular_name' => _x('News', 'post type singular name'),
		'add_new' => _x('新規News', 'book'),
		'add_new_item' => __('新しいNewsを追加'),
		'edit_item' => __('Newsを編集'),
		'new_item' => __('新しいNews'),
		'view_item' => __('Newsを表示'),
		'search_items' => __('Newsを探す'),
		'not_found' =>  __('Newsありません'),
		'not_found_in_trash' => __('ゴミ箱にNewsはありません'),
		'parent_item_colon' => ''
	);
	$args = array(
		'labels' => $labels,
		'public' => true,
		'show_ui' => true,
		'query_var' => true,
		'hierarchical' => false,
		'menu_position' => 4,
		'supports' => array('title','editor'),
	);
	//カスタム投稿タイプを登録
	register_post_type('news', $args);
}
add_action('init', 'custom_post_type_news');

どこが問題かというと、27行目の post_type を登録しているところです。

これだと、一覧と個別ページが同じ「news」というスラッグ名になってしまい、リダイレクトが不具合を起こすということです。

ニュース一覧 1ページ目 /news/
ニュース一覧 2ページ目 /news/page/2/
ニュース個別ページ /news/個別ページスラッグ/

やり方1:一覧と個別ページのスラッグを違うものにする

カスタム投稿の27行目の post_type を複数形に変更してあげます。

register_post_type('news', $args);
↓変更
register_post_type('newss', $args);

こうすることによって、

ニュース一覧 1ページ目 /news/
ニュース一覧 2ページ目 /news/page/2/
ニュース個別ページ /newss/個別ページスラッグ/

になり、無事に404にならずにページ遷移することが出来ました。

でも「newss」ってなんか嫌だな・・・

という場合、一覧を表示する個別ページのスラッグを「newstop」とか「newslist」にすれば大丈夫でした。

ニュース一覧 1ページ目 /newslist/
ニュース一覧 2ページ目 /newslist/page/2/
ニュース個別ページ /news/個別ページスラッグ/

でもやっぱり、「newstop」も「newslist」も嫌だなって思いました・・・

やり方2:function.php でリダイレクトを制御する

一覧と個別ページのスラッグを同じにしたくなったので、以下のように paged という、GETをつけるようなやり方にしました。

ニュース一覧 1ページ目 /news/
ニュース一覧 2ページ目 /news/?paged=2
ニュース個別ページ /news/個別ページスラッグ/

その場合は、function.php でページ遷移時だけ、リダイレクト阻止するというものを入れます。
function.php

// ページ遷移時のリダイレクトを阻止する
add_filter('redirect_canonical','my_disable_redirect_canonical');
function my_disable_redirect_canonical( $redirect_url ) {
if ( is_single() ){
	//リクエストURLに「/page/」があれば、リダイレクトしない
	preg_match('/\/paged\//', $redirect_url, $matches);
	if ($matches){
		$redirect_url = false;
		return $redirect_url;
	}
}
}

WP_Query でのデータの取得は以下のような感じ。

$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
    'post_type' => 'news',
    'posts_per_page' => 10,
    'paged' => $paged,
);
$the_query = new WP_Query( $args );

ページ遷移の表示が以下のようになっているとします。

$GLOBALS['wp_query']->max_num_pages = $the_query->max_num_pages;
$pagination = get_the_posts_pagination( array(
	'prev_text' => '前へ',
	'next_text' => '次へ',
	));
echo $pagination;

↓ 変更
そこにbaseとformatを以下のように足します。

$GLOBALS['wp_query']->max_num_pages = $the_query->max_num_pages;
$pagination = get_the_posts_pagination( array(
	'base'               => '?paged=%#%',
	'format'             => '?paged=%#%',
	'prev_text' => '前へ',
	'next_text' => '次へ',
	));
echo $pagination;

こんな感じで出来ました。

関連記事

WordPress レスポンシブ テンプレート 元にサイトを作ってみる その1

「レスポンシブ テンプレート の メニューやブログの設置」の記事では、メニューやブログの設置例をやっ

記事を読む

WordPress の PHP をちょっと見てみよう Ⅲ

WordPress の PHP をちょっと見てみよう Ⅲ

前記事の続きで、wp-settings.php の91行目あたりから見ていきます。 次は、wp

記事を読む

リビジョンを削除し、テーブルを最適化してDBの容量を削減

WordPress リビジョンを削除し、テーブルを最適化してDBの容量を削減

WordPress リビジョン機能 リビジョンは過去の記事を保存してくれる WordPress の

記事を読む

WordPress の PHP をちょっと見てみよう Ⅱ

WordPress の PHP をちょっと見てみよう Ⅱ

前記事の続きで、wp-settings.php の68行目あたりから見ていきます。 <今回のピ

記事を読む

WordPress Twenty Seventeen function.php

WordPress twentyseventeen の function.php を見る – その2

前回の続きです。 次のスターターコンテンツは、今回のシンプルテンプレートには不要ですが、よくわ

記事を読む

Wordpress 自作フォーム 2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)

WordPress 自作フォーム その2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)

前回(WordPress 自作フォーム 1)のつづきです。 今回は細かいところや注意点とエラーなど

記事を読む

WordPress レスポンシブ テンプレート

WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード

WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード

記事を読む

Wordpress 独自テーブル 商品名と料金

WordPress 独自テーブル

Wordpress で独自テーブルを作ってみようと思います。 独自テーブルのデータ 今回のデ

記事を読む

Wordpress VR Test

WordPress で VR させて、360°のパノラマ画像を表示する

WordPress.com内ショートコードで VR させる WordPress.com内で、VR(

記事を読む

ロリポップでWordPressのPHPバージョンを5から7にする

ロリポップでWordPressのPHPバージョン7.1に変更後「サイトに技術的な問題が発生しています。」

WordPress.org の推奨環境 PHP7以上 MySQL5.6以上またはMaria

記事を読む

WordPress wordpress テンプレート

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

javascriptで複数同じ名前のformの値を取得する
javascriptで複数同じ名前のformの値を取得する Cannot read property ‘value’ of undefined

Javascript で value の値を取得する このようなHT

リビジョンを削除し、テーブルを最適化してDBの容量を削減
WordPress リビジョンを削除し、テーブルを最適化してDBの容量を削減

WordPress リビジョン機能 リビジョンは過去の記事を保存して

Javascript let const アロー関数 クラス
Javascript ES5,6 の新機能(letとconst,アロー関数,クラスなど)

ESとはECMASCriptの略で、ECMA という国際的な標準化機関

Strict モード JavaScript
Javascript Strictモード “use strict”;

Strict モード(厳格モード) Strict モードとは、ECM

CodeIgniter インストール
Codeigniter インストールとバージョンアップ2→3 PHP 5→7 メモ

Codeigniter インストール Codeigniter をサイ

→もっと見る

    • 202104
      Mon Tue Wed Thu Fri Sat Sun
      1234
      567891011
      12131415161718
      19202122232425
      2627282930
    にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ PHPへ にほんブログ村 IT技術ブログ WordPressへ
    にほんブログ村 FC2 Blog Ranking
    PAGE TOP ↑