wordpress カスタム投稿で 2ページ目以降が404になってしまう
公開日:
:
WordPress, wordpress テンプレート
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 の PHP をちょっと見てみよう Ⅰ
WordPress には、たくさんのファイルが入っています。 ここではテーマ内ではなく、トップ
-
WordPress フォルダー・ファイル系の関数 is_dir や opendir や exif_imagetype で Warning エラー
Wordpress の管理画面でフォルダーの中身を読み込む関数 opendir でエラー Word
-
WordPress twentyseventeen の function.php を見る – その1
WordPress の最低限の機能だけのシンプルなテンプレートが欲しかったので、作っておくことにしま
-
WordPress 独自テーブル
Wordpress で独自テーブルを作ってみようと思います。 独自テーブルのデータ 今回のデ
-
WordPress カレンダー カスタマイズ
WordPressでカレンダーの表示部分をいじってみようかと思います。 どうやら、カレンダー関
-
WordPress レスポンシブ テンプレート 元にサイトを作ってみる その1
「レスポンシブ テンプレート の メニューやブログの設置」の記事では、メニューやブログの設置例をやっ
-
WordPress タイトルの変更
テンプレートタグ the_title(); get_the_title(); WordPress
-
WordPress レスポンシブ テンプレート 元にサイトを作ってみる その2
DEMO を見る カスタム投稿タイプ functions.php 今回は3つのリストメニュ
-
レンタルサーバでWordPressを設置してみよう!
WordPress.com 内に、ブラウザだけで無料でサイトを作成出来きるサービスもありますが、Wo
-
WordPress twentyseventeen の function.php を見る – その2
前回の続きです。 次のスターターコンテンツは、今回のシンプルテンプレートには不要ですが、よくわ