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 自作フォーム その1(サンプルと設置)
Wordpress でプラグインを使わずにフォームをやってみます。 簡単に名前、メールアドレス、メ
-
-
WordPress レスポンシブ テンプレート の メニューやブログの設置
前回の 「WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダ
-
-
「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ
1.移行元サイトでのデータエクスポート 「All-in-One WP Migration(公式リン
-
-
WordPress の PHP をちょっと見てみよう Ⅱ
前記事の続きで、wp-settings.php の68行目あたりから見ていきます。 <今回のピ
-
-
WordPress 自作フォーム その3(チェックボックスなど)
以前、WordPress 自作フォーム その1の記事で Wordpress で自作フォームを作ってみ
-
-
WordPress カレンダー カスタマイズ
WordPressでカレンダーの表示部分をいじってみようかと思います。 どうやら、カレンダー関
-
-
WordPress で VR させて、360°のパノラマ画像を表示する
WordPress.com内ショートコードで VR させる WordPress.com内で、VR(
-
-
WordPress twentyseventeen の function.php を見る – その2
前回の続きです。 次のスターターコンテンツは、今回のシンプルテンプレートには不要ですが、よくわ
-
-
レンタルサーバでWordPressを設置してみよう!
WordPress.com 内に、ブラウザだけで無料でサイトを作成出来きるサービスもありますが、Wo
-
-
WordPress エラー:Failed to load plugin: table from url https://cdn.tinymce.com/4/plugins/table/plugin.min.js
WordPress エラーの状態 WordPress 管理画面のテキスト入力欄で(ビジュアルタブの