wordpress
WordPressでカテゴリーアーカイブの最新記事をコンテンツ表示
作成日: 2024年12月11日
カテゴリーアーカイブの記事一覧はそれだけだと単なる一覧にしかならない。
多くの場合それでよいかもしれないが、そのカテゴリ名=titleなりをSEO上有効利用しようとするならページがarticle=記事の体をなしていなければならないのが基本。
ページネーション/canonicalなどで2ページ目以降は「続き」という認識も検索エンジンはしてくれる筈なので、1ページ目は記事の体を成したいが、適当なものが無い際に最新記事を表示、この場合はexcerptとして表示させるためのコード。
最新記事をexcerpt表示するから一覧表示はoffset=-1とするが、ページネーションで不整合を起こし空ページができたり重複が発生したりもしたが、どうにかできた。
当サイトでメインとなる部分はカテゴリーアーカイブながらすべて固有のコンテンツがある(当たり前だけど)。
ただ備忘録などは「MovableTypeのコードなどの備忘録」といったものしか入らず、専門的なカテゴリーにも係わらずインデックス登録されないのでは勿体ないので最新記事をexcerpt表示させてみた。
もともとは同じ理由で別の案件で欲しかった機能、MovableTypeでは先んじて作った。結果インデックス登録が劇的に増えた。これはそのサイトだからであろうが、中間のカテゴリー一覧ページを単なるナビではなく記事化したところに良化の所以があった。
無意味な場合もあるだろが、千変万化するSEOアルゴリズムに対応するなら、こうした用意はあった方がよいだろう。
<section class="flxSct<?php if (is_category(array('16', '18'))) : ?> clm3<?php endif; ?>">
<h2>
<?php echo get_category($cat)->name; ?>
</h2>
<?php if (is_category('13')) : ?>
<h3>13の場合のh3</h3>
<?php elseif (is_category('16')) : ?>
<h3>16の場合のh3</h3>
<?php endif; ?>
<?php
// 現在のページ番号を取得
$paged = max(1, get_query_var('paged'));
// 投稿の表示件数を設定
$posts_per_page = 9;
// 最新記事(1ページ目のみ表示)
if ($paged == 1) :
$args_latest = array(
'posts_per_page' => 1,
'post_type' => 'post',
'cat' => get_queried_object_id(),
);
$latest_posts = new WP_Query($args_latest);
if ($latest_posts->have_posts()) :
while ($latest_posts->have_posts()) : $latest_posts->the_post();
?>
<p style="text-align:center;font-size:1.5rem;font-weight:600;">最新の投稿</p>
<h2><?php the_title(); ?></h2>
<p class="latest">
<?php $thumbnail_url = wp_get_attachment_image_url(get_post_thumbnail_id(), 'thumbnail');
if ($thumbnail_url) : ?>
<img src="<?php echo esc_url($thumbnail_url); ?>" class="alignright" alt="<?php echo esc_attr(get_the_title()); ?>" />
<?php endif; ?>
<?php
$content = get_the_content();
$content = preg_replace('/<(img|p|strong).*?>|<\/(p|strong)>/i', '', $content);
$content = wp_kses_post($content);
$content = mb_substr($content, 0, 100) . '...';
echo nl2br($content);
?>
<br class="clear">
<a href="<?php echo esc_url(get_permalink()); ?>" class="more" style="margin-top:20px;">詳しく読む</a>
</p>
<?php
endwhile;
wp_reset_postdata();
endif;
endif;
// 最新投稿を除いた通常の記事リスト
$args = array(
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'cat' => get_queried_object_id(),
'post__not_in' => array(get_the_ID()), // 現在の投稿を除外
);
$posts_query = new WP_Query($args);
if ($posts_query->have_posts()) :
while ($posts_query->have_posts()) : $posts_query->the_post();
?>
<div class="post-item">
<a href="<?php the_permalink(); ?>" class="linkImage">
<div class="pdimgWrap">
<img src="<?php the_post_thumbnail_url('thumbnail'); ?>" alt="<?php the_title(); ?>" />
</div>
<h4><?php the_title(); ?></h4>
</a>
</div>
<?php
endwhile;
else :
?>
<p>まだ記事がありません</p>
<?php
endif;
wp_reset_postdata();
?>
<?php
// ページネーション
if ($posts_query->max_num_pages > 1) {
echo '<nav class="pagination">';
echo paginate_links(array(
'total' => $posts_query->max_num_pages,
'current' => $paged, // 現在のページ番号を指定
'prev_text' => '<',
'next_text' => '>',
));
echo '</nav>';
}
?>
</section>
使うなら、html構造内の属性やstyleは適当に変えてください。