「このカスタムフィールドに値がある記事だけで『前の記事へ』『次の記事へ』のページ送りを実装してください」と言われたけど、思ったより大変だったのでメモ。
通常、詳細記事のページネーションは”previous_post_link()”と”next_post_link()”を使えば簡単に実装できるんだけど、この関数は残念ながらカスタムフィールドの有無の判定とかはできないので、がんばってphpを書いたのであった。
functions.phpに以下を記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
function get_custom_pagenation() { global $post; $html = ''; $current_id = $post->ID; //現在の記事のID $array_has_thumb = array(); // カスタムフィールドに値がある記事を全部出して、"$array_has_thumb"にIDを格納 $wp_query = new WP_Query(); $param = array( 'posts_per_page' => '-1', 'post_type' => 'post', 'meta_key' => 'hoge', 'meta_value' => false, 'meta_compare' => '!=' ); $wp_query -> query( $param ); if( $wp_query -> have_posts() ){ while( $wp_query -> have_posts() ) { $wp_query -> the_post(); $array_has_thumb[] = $post->ID; } } wp_reset_query(); // "$array_has_thumb"から現在の記事IDのキーを取り出しておく $current_key = array_keys( $array_has_thumb, $current_id ); // 前の記事のID foreach( $array_has_thumb as $data ) { if( $data == $current_id ) { break; } $prev_id = $data; } // 次の記事のID foreach( $array_has_thumb as $key => $value ) { $next_id = $value; if( $key > $current_key[0] ) { break; } } if( $next_id == $data ) { $next_id = NULL; } // IDが取得出来たらその記事のパーマリンクを取得 if ( $prev_id ) { $prev_link = get_permalink( $prev_id ); } if ( $next_id ) { $next_link = get_permalink( $next_id ); } // 出力部分 if( $prev_link ) { $html .= '<p class="prev"><a href="' .$prev_link. '">前の記事へ</a></p>'; } $html .= '<p class="list"><a href="' .home_url('/'). '">トップへ</a></p>'; if ( $next_link ) { $html .= '<p class="next"><a href="' .$next_link. '">次の記事へ</a></p>'; } return $html; } |
だいたいコメントに書いてある通りの処理です。
要は、
- まず’hoge’というカスタムフィールドに値がある記事のみループさせ、
- 配列’$array_has_thumb’に記事IDを格納。
- その配列から、今の記事IDの前後の記事IDを取得して、
- 記事IDが取得できていたらページネーションを表示
という流れです。前後の記事IDを取得する部分はもうちょい綺麗に書けそう…あとは、meta_keyやpost_typeの値を引数で渡してやると汎用性高まりますね。まぁそれは気が向いたら挑戦してみてください。🤗
使うときはテンプレートに
1 |
<?php echo get_custom_pagenation(); ?> |
と書くと表示されます。
現場からは以上です。