カスタム投稿が真っ白になったり2ページ目が表示できなかったりタクソノミーが取得できなかったりする件

WordPress備忘録です。カスタム投稿タイプで苦労したことと解決できたコードを書いておきたいと思います。function.phpちょっといじるとサイト全体が真っ白になったりしてほんと怖い。

Contents

カスタム投稿タイプとカテゴリー名を同じにしてしまうと起きる事件。

つまり、
example.com/blog/1234/ (カスタム投稿タイプ)
example.com/blog/book/ (bookというカテゴリー)というページがあると、
bookというカテゴリーページではなく、bookというカスタム投稿ページがあると判断されてカテゴリーページが表示されないなどの事件が起きてしまいます。

そこで一番簡単なのは、タクソノミー名を変えること。
カスタム投稿タイプがnewsなら、カテゴリーに相当するtaxonomyはnews_catにしてあげるのです……

// create custom post type(お知らせ)
function news_custom_post_type(){
  $labels = array(
    //(中略)
    'add_new' => _x('新規追加', 'news'),
  );
  $args = array(
    //(中略)
    'rewrite' => array( 'slug' => 'news'),
  );
  register_post_type('news',$args);
  //(省略)
}
add_action('init', 'news_custom_post_type');

$args = array(
    'label' => 'カテゴリー',
    //(省略)
  );
register_taxonomy('news_cat','news',$args);

完全なコードはこちらの記事からお願いします!

そうすると、
example.com/news/1234/ (カスタム投稿タイプ)
example.com/news_cat/book/ (bookというカテゴリー)になるので何の問題もなく表示できます。

同様の解決をした記事はこちらにもあります。

ただ……やっぱり揃えたいって思いますよね……

function.phpでリダイレクトを制御する方法

こちらの記事にある、function.phpでリダイレクトを制御する方法を使えば、URLがきれいな感じでいけそうです。
が!私の今回の作業では、既に運用しているサイト上での作業だったので、どうもfunction.phpにこれを入れるとサイト全体が真っ白になってしまい、こりゃだめだと断念しました。新規製作している独自テーマの場合だったらいけるかもね……

2ページ目が404エラーになってしまう

調べた所結構定番のつまづきポイントみたいでした…

どうやら、「設定>表示設定>1ページに表示する最大投稿数」が大きい数字で、カスタム投稿アーカイブではもっと少ない件数を取得したいというケースで、2ページ目が正しく見れない事案が発生するみたいです。

この記事の原因特定にはもう本当に最高でした。感謝しかありません。

この現象が発生するのは以下のとき。
1. カスタム投稿タイプの一覧ページで、
2. WP_Queryによる定義を行っており、
3. ‘posts_per_page’で1ページの記事表示数を指定していて、

4. 管理画面の「設定→表示→1ページに表示する最大投稿数」で設定した数値より3の数値のほうが小さいとき。
つまり、管理画面で「1ページに表示する最大投稿数」を10にしていて、カスタム投稿タイプ”shop”の表示数を5とかにしたい場合、ページネーションがうまく機能しなくなる。

https://meshikui.com/2019/02/25/1537/

え~!!完全に一致!!!(死

……そこで、こちらの記事を参考にして、「テンプレート側では’posts_per_page’を指定しない」。
function.phpにpre_get_postsを使って設定したら解消されました。

function change_posts_per_page($query) { //WP設定では100件になっている
    if ( is_admin() || ! $query->is_main_query() )
        return;
    if ( $query->is_archive('blog') ) { //カスタム投稿タイプを指定
        $query->set( 'posts_per_page', '4' ); //表示件数を指定
    }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

既に運用されているサイトの場合、WP設定から表示件数を変えられない事情があったりするので、この方法を知ることができて本当に助かった……泣くかと思った……

カテゴリー名(taxonomy)を取得したいのに取得できない

パンくずリストで起きた事件。

分岐はis_singularとis_tax

カスタム投稿タイプだと、多分こういう分岐を書くことになると思う。
※カスタム投稿タイプをblog、カスタム投稿タイプに設定したカテゴリー(タクソノミー)をblog_catと設定した場合。

  • 【記事ページだったら】is_singular(‘blog’)
    →ホーム>カテゴリー名>記事名
     例)ホーム>カテゴリー:日記>ブログ開設しました!
  • 【カテゴリーページだったら】is_tax(‘blog_cat’)
    →ホーム>カテゴリー:カテゴリー名
     例)ホーム>カテゴリー:日記

日本語で書くと簡単そうなんだけど、つまるところ、普通の「投稿」ページの分岐や「カテゴリー」ページの分岐ではなくて、「カスタム投稿タイプの投稿ページ」の分岐と「カスタム投稿タイプに設定したカテゴリー」で分岐しないといけないので、

【記事ページだったら】is_singular(‘blog’)

is_singleとかpost_type系は×

【カテゴリーページだったら】is_tax(‘blog_cat’)

blogではなくblog_catである点に注意。

カスタム投稿タイプの投稿ページに使えるコード

【記事ページだったら】is_singular(‘blog’)
→ホーム>カテゴリー名>記事名
 例)ホーム>カテゴリー:日記>ブログ開設しました!

<?php
  if ( is_singular('blog') ):
    $terms = get_the_terms($post->ID, 'blog_cat');
    echo 'カテゴリー: ';
    if ( $terms ) {
	    foreach ( $terms as $term ) {
		  $term_link = get_term_link( $term );
		  echo '<a href="'.esc_url( $term_link ).'">'.$term->name.'</a>';
    }
  }
  endif;
?>

$term_link = get_term_link( $term ); の部分が左から二番目の「日記」の部分の出力。

echoで$term_linkと$term->nameをaタグの中に挿入。

カスタム投稿タイプのカテゴリー一覧ページで使えるコード

【カテゴリーページだったら】is_tax(‘blog_cat’)
→ホーム>カテゴリー:カテゴリー名
 例)ホーム>カテゴリー:日記

<?php if (is_tax('blog_cat')): //blog_catがタクソノミー名
	echo 'カテゴリー: ';
	echo single_term_title( '', false );
	endif; 
?>

single_term_titleにすれば、そのページのタクソノミー名…つまりここでは、「日記」というカテゴリー名を取得できる。
→参考サイト:https://elearn.jp/wpman/function/single_term_title.html

これたどり着くまで結構迷走した。
ページタイトルを取得しようと頑張ったりしたけど、どうやら一覧ループのほうにある記事のほうを取得してしまうらしく…

パーツの読み込みはテーマ内じゃないと読めない

テーマA - single.php
テーマB - parts_●●.php(このパーツを使いたい)

こういうときってあると思うんですけど、結論から言うと、テーマAの中にBをぶちこめば可能です。

テーマA ー single.php
     ー parts_●●.php

同層の外のテーマに置いたままだと読み込めません…。
めんどくさいひとは、テーマBフォルダごとテーマAにぶちこむとテーマAの「テーマの編集」画面が綺麗かもしれません。

テーマA ー single.php
     ー Bフォルダ ー parts_●●.php

<?php get_template_part( 'B/parts_●●' ); //最後の.phpは不要 ?>

こうすれば楽です。まあ、partsフォルダを作ってそこにいれるのが一番ですけどね……

シェアしてね
  • URLをコピーしました!
Contents