質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

2回答

6388閲覧

wordpress ページ送り /page/2が404になってしまう

tirolmania

総合スコア14

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2016/07/31 06:31

いつもお世話になっております。
wordpress初心者のtirolmaniaです・・・よろしくお願い致します。

ネットであちこち検索しながら会社HPを作成しているのですが
壁にぶち当たってしまいました。

施工事例(case)のカテゴリ一覧ページ(工事分類)は
カスタム投稿でアーカイブページ(archive-case.php)に表示させています。
工事分類別の一覧はtaxonomy-case_category-○○○.phpで表示させています。

taxonomy-case_category-○○○.phpには登録した物件の写真とタイトルを表示させています。
1ページに9件まで表示してそれ以上は次のページに表示させたいのですが
ページ送りは表示できたものの、2ページ目が/page/2となり
クリックしても404エラーになってしまいます。

<div class="tax-term"> <ul> <li class="tax-thumbnail"> <a href="<?php echo home_url() ?>/?case=<?php echo attribute_escape( $post->post_name ); ?>"><?php the_post_thumbnail('150_thumbnail'); ?></a> <h5><a href="<?php echo home_url() ?>/?case=<?php echo attribute_escape( $post->post_name ); ?>"><?php the_title() ?></a></h5> </li> </ul> </div> </article><!--ループ終了 --> <?php endwhile; ?> <?php endif; ?> <div class="tax-term-space"> <?php //Pagenation if (function_exists("pagination")) { pagination($additional_loop->max_num_pages); } ?> 今のページ数は「<?php max_show_page_number(''); ?>ページ中の<?php show_page_number(''); ?>」ページです。 </div>

function.phpにはこのように記述しているのですが間違いなのか
やはりうまくいきません・・・・・
ご教授頂けないでしょうか・・・・。

function pagination($pages = '', $range = 2) { $showitems = ($range * 2)+1;//表示するページ数(5ページを表示) global $paged;//現在のページ値 if(empty($paged)) $paged = 1;//デフォルトのページ if($pages == '') { global $wp_query; $pages = $wp_query->max_num_pages;//全ページ数を取得 if(!$pages)//全ページ数が空の場合は、1とする { $pages = 1; } } if(1 != $pages)//全ページが1でない場合はページネーションを表示する { echo "<div class=\"pagenation-custom\">\n"; echo "<ul>\n"; //Prev:現在のページ値が1より大きい場合は表示 if($paged > 1) echo "<li class=\"prev\"><a href='".get_pagenum_link($paged - 1)."'>Prev</a></li>\n"; for ($i=1; $i <= $pages; $i++) { if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems )) { //三項演算子での条件分岐 echo ($paged == $i)? "<li class=\"active\">".$i."</li>\n":"<li><a href='".get_pagenum_link($i)."'>".$i."</a></li>\n"; } } //Next:総ページ数より現在のページ値が小さい場合は表示 if ($paged < $pages) echo "<li class=\"next\"><a href=\"".get_pagenum_link($paged + 1)."\">Next</a></li>\n"; echo "</ul>\n"; echo "</div>\n"; } } //現在のページ数の取得 function show_page_number() { global $wp_query; $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $max_page = $wp_query->max_num_pages; echo $paged; } //総ページ数の取得 function max_show_page_number() { global $wp_query; $max_page = $wp_query->max_num_pages; echo $max_page; } //pre_get_posts function change_posts_per_page($query) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_tax('toilet') ) { $query->set( 'posts_per_page', '6' ); } } add_action( 'pre_get_posts', 'change_posts_per_page' );

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asahina_dev

2016/07/31 07:39

htaccess は有効ですか?
tirolmania

2016/07/31 07:43

有効になっています。
guest

回答2

0

私もこの2,3日 同様の内容でハマってしまい、こちらにたどり着きました。ググった情報からソースつぎはぎしていたら質問者様のソースコードとほぼ同じ状態になっていました笑
タクソノミー(ターム?)の記事一覧ページのページネーションのリンクは'format' => '?page=%#%' ,であれば問題なく表示されるが、
ページャーのcurrent(現在地のページを色変えるためのclassやタグ)がページ移動しても1のままだったり、
質問者さまが試された、自作タイプのぺージャーだと/page/2/のリンクから変える方法なんて分かるはずもなく、、
パーマリンク見直せなど様々な情報みて試しましたがもうタクソノミー一覧ページへのページャー設置は諦めようと思っていました。
そんなところこちらの質問から他の似た質問を見て他の回答者さんが「pre_get_posts」を使えばいいのでは?という書き込みから解決に至りました。
もちろん「pre_get_posts」のことなど初めて聞いた、解決した今も意味も理解できていない初心者です。かなり前の質問に申し訳ないですがアクセス数も多かったので私と同じくらいの初心者の方に参考にもなればと思い書き込みます。
初心者ですのでソース不備あるかもなのと、プラグインなど環境によっては挙動が違うかもしれませんのでご了承ください。
流れがわかったほうが良いと思い、順を追って記載していきます。

●WP本体のブログ以外に「スタッフブログ」を作成
サイドバーやページャーなど、本体ブログとまったく同じようなものに。が先方希望
私の場合は
・カスタム投稿名→スタッフブログ(スラッグ staffblog )
・タクソノミー名→ カテゴリー(スラッグ staffblog_cat )
・ターム → 「日記」「お知らせ」など動的に追加・編集・削除

プラグインCustom Post Type UIで
1.カスタム投稿「スタッフブログ(スラッグは staffblog )」を作成
2.その中にタクソノミー「カテゴリー(スラッグは staffblog_cat )」を作成
3.カスタム投稿「スタッフブログ」>「カテゴリー」メニューでターム(カテゴリ的なもの)となる「日記」「お知らせ」を作成

Custom Post Type UIでの作り方は下記あたりを参考にしました
・カスタム投稿を作成「Custom Post Type UI」
https://jobtech.jp/wp/1834/
・カスタム投稿に新しいカテゴリーを作成
https://jobtech.jp/wp/1862/

●タクソノミー一覧表示用のテンプレートは質問者様同様
taxonomy-(タクソノミー名).php(私の場合はtaxonomy-staffblog_cat.php)で作成し、

<?php if(have_posts()): ?> <?php while(have_posts()): the_post(); ?> <!--ループ部分ご自由に --> <article class="post"> <a href="<?php the_permalink(); ?>"> <h2 class="tit"><?php the_title(); ?></h2> <div class="text"> <p class="ph flexImg"><img src="<?php echo catch_that_image(); ?>" alt="<?php the_title(); ?>" /></p> <p class="read"><?php echo mb_substr(strip_tags($post-> post_content),0,120).'...'; ?></p> </div> <p class="date">投稿日:<?php the_time('Y年m月d日'); ?></p> </a> </article><!-- / post --> <!--ループ部分ご自由に --> <?php endwhile; ?> <?php // ページャー if ( function_exists( 'pagination' ) ) : pagination( $wp_query->max_num_pages, get_query_var( 'paged' ) ); endif; ?> <?php endif; wp_reset_postdata();?>

と記述

●ページャー(ページネーション)は下記サイトを参考に「関数本体のコード」を
https://wemo.tech/978#index_id0
function.phpに

<?php ?>

で囲んでコピペします。

●「pre_get_posts」の設定(上記タクソノミー一覧表示用のテンプレートページに表示する内容)をfunction.phpに記述します。

<?php // -------------------------------------------------- // カスタムタクソノミー>タームの一覧表示 // -------------------------------------------------- function tax_loop($query) { if (is_admin() || ! $query->is_main_query()) { return; } if ($query->is_tax()) { $query->set('post_type', '※変える所 (カスタム投稿名)を記載 私のばあい staffblog '); $query->set('posts_per_page', 5); // 1ページのページ数 WordPress設定の表示数もこの数値に合わせたほうが良さげ $tax_query = array( array( 'taxonomy' => '※変える所 (タクソノミー名)を記載 私のばあい staffblog_cat', //タクソノミー 'field' => 'slug', 'terms' => array('test'), // タームが動的なので全タームを対象にするやりかたが分からなかったのでターム(カテゴリ的なもの)testを下記'operator' => 'NOT IN' 'operator' => 'NOT IN' // で除外することで、それ以外のターム(カテゴリ的なもの)は自動的に選ばれることになったぽいです、testカテゴリ作ったとしても非表示だと思うので一石二鳥 ) ); $query->set('tax_query' , $tax_query); } } add_action('pre_get_posts', 'tax_loop'); ?>

●パーマリンクはプラグインなし
~/%postname%/
で設定


以下は1つのWordpressで本体ブログとほぼ同じ機能のもうひとつのブログ作成する際のその他のことです。
同じ境遇の方いらしたらご参考まで、、

●サイドバーをカスタム投稿用に変える

1.function.phpに下記を記載して、サイドバーを複数つくります

<?php if ( function_exists('register_sidebar') ) { register_sidebar(array( 'name' => 'サイドバー1', 'id' => 'sidebar-1', 'description' => 'デフォルトブログ用', 'class' => 's1', )); register_sidebar(array( 'name' => 'サイドバー2', 'id' => 'sidebar-2', 'description' => 'カスタム投稿(スタッフブログ用)', 'class' => 's2', )); } ?>

2.プラグインCustom Post Type Widgetsを入れます。
https://blog.thingslabo.com/archives/000404.html
使い方はググりました。

3.カスタム投稿用サイドバーテンプレートを作成
sidebar-(カスタム投稿名).php(私の場合は sidebar-staffblog.php )でテンプレート作成して、
下記を記載

<?php if ( is_active_sidebar( 'sidebar-2' ) ) : ?> // sidebar-2は上記function.phpで設定したidを指定 <div id="sideNav"> // ←ご自由に <?php dynamic_sidebar( 'sidebar-2' ); ?> // sidebar-2は上記function.phpで設定したidを指定 </div> // ←ご自由に <?php endif; ?>

4.カスタム投稿用の各種テンプレートのサイドナビ配置したい場所に

<?php get_sidebar('※変える所 (カスタム投稿名)を記載 私のばあい staffblog '); ?>

を記載します。対象となるテンプレート、基本としては
・archive-(カスタム投稿名).php (私の場合 archive-staffblog.php)
・single-(カスタム投稿名).php(私の場合 single-staffblog.php)
・search-(カスタム投稿名).php(私の場合 search-staffblog.php)
・taxonomy-(タクソノミー名).php(私の場合 taxonomy-staffblog_cat.php)
ですかね

5.サイドバーの年・月・日付系アーカイブのパーマリンクを一発で解決してくれそうな下記プラグインも入れました。
Custom Post Type Rewrite
入れるだけでページャーも正常に機能しました。

●カスタム投稿用サイドバーの検索からの結果用のテンプレートを変える
参考URL
https://techmemo.biz/wordpress/post-type-search-template/

1.function.phpに下記を記載

<?php function custom_search_template($template){ if ( is_search() ){ $post_types = get_query_var('post_type'); foreach ( (array) $post_types as $post_type ) $templates[] = "search-{$post_type}.php"; $templates[] = 'search.php'; $template = get_query_template('search',$templates); } return $template; } add_filter('template_include','custom_search_template'); ?>

2.カスタム投稿のみの検索結果表示用テンプレートを作成

search-(カスタム投稿名).php(私の場合は search-staffblog.php )でテンプレート作成して、
一覧表示ループさせるように下記記載(タクソノミー一覧表示用のテンプレートの内容とほぼおなし)

<?php if(have_posts()): ?> <?php while(have_posts()): the_post(); ?> <!--ループ部分ご自由に --> <article class="post"> <a href="<?php the_permalink(); ?>"> <h2 class="tit"><?php the_title(); ?></h2> <div class="text"> <p class="ph flexImg"><img src="<?php echo catch_that_image(); ?>" alt="<?php the_title(); ?>" /></p> <p class="read"><?php echo mb_substr(strip_tags($post-> post_content),0,120).'...'; ?></p> </div> <p class="date">投稿日:<?php the_time('Y年m月d日'); ?></p> </a> </article><!-- / post --> <!--ループ部分ご自由に --> <?php endwhile; ?> <?php // ページャー if ( function_exists( 'pagination' ) ) : pagination( $wp_query->max_num_pages, get_query_var( 'paged' ) ); endif; ?> <?php else : ?> 検索結果がありません。 <?php endif; ?>

●カスタム投稿のカテゴリ(ターム)のデフォルト設定
参考URL
https://takayakondo.com/term-automatic-check/

<?php function term_automatic_check($post_ID) { global $wpdb; $curTerm = wp_get_object_terms($post_ID, 'staffblog_cat'); if (0 == count($curTerm)) { $defaultTerm= array(日記); wp_set_object_terms($post_ID, $defaultTerm, 'staffblog_cat'); } } add_action('publish_staffblog', 'term_automatic_check'); ?>

●その他
例えば
・ブログは院長先生のみ投稿
・スタッフブログはスタッフのみ投稿
のようにユーザーを分けたら、下記のプラグインもいいかと思います。(他のやり方もあるでしょうが、、)
User Admin Simplifier → ユーザーごとに管理ページ内に表示するメニューを変える、スタッフブログにはwp本体ブログメニューを非表示
WP Users Media → ログインしたユーザーがアップしたメディア(画像等)以外を非表示

前述とおり初心者ですのでソース不備多々あるとおもいますので自己責任にてm(_ _)m
カスタムタクソノミータームをアーカイブ的に一覧表示して、ページネーション(ページャー)を設置した所でpage/2のリンクがかなりハマったので他の方も参考になれば幸いです。
私の環境では今日も問題なく動いてます。ながなが失礼しました

投稿2022/02/02 18:29

編集2022/02/02 18:35
pepne

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

$additional_loop->max_num_pages ということは、アーカイブページ内で WP_Query を別途使用していて、それを使ったページングということでしょうか。

「/page/2」が付与されたURLは通常のアーカイブ自身のページングを想定した挙動になるため、別途呼び出した WP_Query のページングにはなりません。(メインクエリのページングになる)
WordPressでその挙動を実装するのはアーカイブ自身のページングとの切り分けが難しいため、あまりお勧めしません。

私なら $additional_loop で呼び出している記事リストのアーカイブへのリンクを設置するか、WordPressのコア機能になるといううわさの WP REST API を使ってJavaScriptで取得すると思います。

投稿2016/07/31 17:07

kei344

総合スコア69398

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tirolmania

2016/08/01 02:09

kei344様 ありがとうございます。 WP REST APIを初めて知ったのですがJavaScriptで取得とはどういうことでしょうか・・・
kei344

2016/08/01 02:20

WordPressの(ほぼ)全機能を操作/取得できるAPIで、JavaScriptからも呼び出せるので、それを使ってリスト追加分を生成する、という意味です。JavaScript自体に慣れていなければお勧めできる方法ではありませんが、選択肢として自分なら考えると思ったので記載しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問