WordPress備忘録です。カスタム投稿タイプで苦労したことと解決できたコードを書いておきたいと思います。function.phpちょっといじるとサイト全体が真っ白になったりしてほんと怖い。
カスタム投稿タイプとカテゴリー名を同じにしてしまうと起きる事件。
つまり、
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ページ目が正しく見れない事案が発生するみたいです。
この記事の原因特定にはもう本当に最高でした。感謝しかありません。
この現象が発生するのは以下のとき。
https://meshikui.com/2019/02/25/1537/
1. カスタム投稿タイプの一覧ページで、
2. WP_Queryによる定義を行っており、
3. ‘posts_per_page’で1ページの記事表示数を指定していて、
4. 管理画面の「設定→表示→1ページに表示する最大投稿数」で設定した数値より3の数値のほうが小さいとき。
つまり、管理画面で「1ページに表示する最大投稿数」を10にしていて、カスタム投稿タイプ”shop”の表示数を5とかにしたい場合、ページネーションがうまく機能しなくなる。
え~!!完全に一致!!!(死
……そこで、こちらの記事を参考にして、「テンプレート側では’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' );
カテゴリー名(taxonomy)を取得したいのに取得できない
パンくずリストで起きた事件。
分岐はis_singularとis_tax
カスタム投稿タイプだと、多分こういう分岐を書くことになると思う。
※カスタム投稿タイプをblog、カスタム投稿タイプに設定したカテゴリー(タクソノミー)をblog_catと設定した場合。
- 【記事ページだったら】is_singular(‘blog’)
→ホーム>カテゴリー名>記事名
例)ホーム>カテゴリー:日記>ブログ開設しました! - 【カテゴリーページだったら】is_tax(‘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;
?>
カスタム投稿タイプのカテゴリー一覧ページで使えるコード
【カテゴリーページだったら】is_tax(‘blog_cat’)
→ホーム>カテゴリー:カテゴリー名
例)ホーム>カテゴリー:日記
<?php if (is_tax('blog_cat')): //blog_catがタクソノミー名
echo 'カテゴリー: ';
echo single_term_title( '', false );
endif;
?>
これたどり着くまで結構迷走した。
ページタイトルを取得しようと頑張ったりしたけど、どうやら一覧ループのほうにある記事のほうを取得してしまうらしく…
パーツの読み込みはテーマ内じゃないと読めない
テーマ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フォルダを作ってそこにいれるのが一番ですけどね……