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;

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

関連記事

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

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

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

記事を読む

レンタルサーバでWordPressを設置してみよう!

WordPress.com 内に、ブラウザだけで無料でサイトを作成出来きるサービスもありますが、Wo

記事を読む

WordPress Twenty Seventeen function.php

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

WordPress の最低限の機能だけのシンプルなテンプレートが欲しかったので、作っておくことにしま

記事を読む

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

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

記事を読む

WordPress Twenty Seventeen function.php

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

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

記事を読む

WordPress PHP

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

WordPress には、たくさんのファイルが入っています。 ここではテーマ内ではなく、トップ

記事を読む

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

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

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

記事を読む

wordpress タイトルの変更

WordPress タイトルの変更

テンプレートタグ the_title(); get_the_title(); WordPress

記事を読む

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

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

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

記事を読む

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

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

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

記事を読む

WordPress wordpress テンプレート

Message

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

WordPress エラー:Failed to load plugin: table from url https://cdn.tinymce.com/4/plugins/table/plugin.min.js
WordPress エラー:Failed to load plugin: table from url https://cdn.tinymce.com/4/plugins/table/plugin.min.js

WordPress エラーの状態 WordPress 管理画面のテキ

wordpress タイトルの変更
WordPress タイトルの変更

テンプレートタグ the_title(); get_the_title

All-in-One WP Migration で サーバ移動
「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ

1.移行元サイトでのデータエクスポート 「All-in-One WP

DNSサーバーとは
ドメインとは?DNSサーバーとは?

ドメインとは? ドメインとは? ドメインとは、インターネット上のネ

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

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

→もっと見る

    • 202403
      Mon Tue Wed Thu Fri Sat Sun
      123
      45678910
      11121314151617
      18192021222324
      25262728293031
    にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ PHPへ にほんブログ村 IT技術ブログ WordPressへ
    にほんブログ村 FC2 Blog Ranking
    PAGE TOP ↑