記事の有無でリンクを表示
Image by slash201 from Pixabay
2022.05.14(更新日:2022.05.14)
サイト内のナビゲーションリンクを表示する時、自動的に有無を判断してリンク先を出したい。
こうすることでクライアントが新規記事を追加しても勝手に表示されるし、デッドリンクも防げる。
単純なことなんだけど毎回調べているのでまとめる。
この記事は1年以上経過しています。内容的に古い場合があります。
記事の並び順を考慮してコーディング
まずその投稿タイプは「時系列か任意の順番で表示させるか」を考える。
これにより必要なコードを付加する必要性があるからだ。
「時系列」の場合、wordpressデフォルトの表示方法なので特段考える必要はないだろう。
「任意の順番で」の場合は、管理ページの各投稿タイプ一覧内にてドラッグで順番入れ替えが最も手軽じゃないかな?
Intuitive Custom Post Orderで任意の順番で変更を可能にする
この秀逸なプラグインのおかげで簡単に実現出来る。日本語なのも助かります。
公式なので管理ページからインストール、設定も投稿タイプを選ぶだけの簡単設定。「任意の順番で」の場合は、これをインストールしてあることを前提で進める。
記事があったらカスタム投稿の一覧ページへのリンクを表示
例えばコーポレートサイトなどでブログの投稿タイプを付加させた場合。
「必要なの〜」と言われて付けたが、記事を書くか自体怪しい時など直にリンクを貼っておくと非常に危険。
何年たっても「空のページ」もしくはデッドリンクとなるのがオチ。
なので以下のコードで有無を確かめて記事があるようだったら一覧へのリンクを表示させる。
/* カスタム投稿「blog」の一覧ページへのリンク */
<?php
$post_type = 'blog';
$custom_posts = 0;
$post_label = '';
$obj = get_post_type_object( $post_type );
if( isset( $obj ) ){
$count_custom = wp_count_posts( $post_type );
$custom_posts = $count_custom->publish;
$post_label = $obj->label;
}
?>
<?php if( $custom_posts > 0 ) : ?>
<a href="<?php echo get_post_type_archive_link( $post_type ); ?>"><?php echo esc_html( $post_label ); ?></a>
<?php endif; ?>
任意の順番で一覧を表示させるには
一覧側のテンプレートを作り表示順を指定してあげる。上の例から「archive-blog.php」とでもしておく。
/* archive-blog */
<?php
$post_type = get_query_var( 'post_type' );
$args = array(
'post_type' => $post_type,
'orderby' => 'menu_order', //管理ページ一覧の表示
'order' => 'ASC', //上から順番に
'post_status' => 'publish',
'posts_per_page' => -1 //数は要調整
);
?>
<?php $loop = new WP_Query( $args ); ?>
<?php if( $loop->have_posts() ) : ?>
<?php while( $loop->have_posts() ) : $loop->the_post(); ?>
//表示処理
<?php endwhile; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
順番変更は前出のプラグインを使用し管理ページ一覧で。これで管理もラクラク。
記事があるものだけ固定ページ一覧にリンクを表示
なんてことないが、全備取得してあるものだけ表示しているだけ。例えばフッター部分に主要ページのリンクを置いたりする場合などに使える。任意順に並べられ、直リンクをただただ書き綴っていくより効率的。
と言うことで任意順表示の例。当然前出のプラグインで固定ページを設定しておくのを忘れずに。
/* 固定ページの一覧 */
<?php
$args = array( //パラメーター
'sort_order' => 'ASC',
'sort_column' => 'menu_order'
);
$pages = get_pages( $args );
?>
<?php foreach ( $pages as $page ) : ?>
<a href="<?php echo get_page_link( $page->ID ); ?>"><?php echo esc_html( $page->post_title ); ?></a>
<?php endforeach; ?>
パラメーターでお好みに調整
階層をどうするとか、どれかを除外したいなどはパラメーター部分で。