マイ忘備録

フィリピン関連のメモ、ワードプレス関連のメモなど

sitemapショートコード

Cocoonではサイトマップを"[sitemap]"と書くだけで表示する便利なショートコードがある。
参考 簡単なサイトマップページを生成できるsitemapショートコードの使い方 | Cocoon

ワードプレスの勉強がてら、このショートコードをコピペ改造してみた。

1. ソースを読む

オリジナルのsitemapショートコードのソースは以下のsitemap_shortcode関数だ
参考 https://github.com/yhira/cocoon/blob/master/lib/shortcodes.php#L387

知らない処理をググって調べた見た

ob_start() / return ob_get_clean()

これは結果の出力をキャッシュする操作のようだ。これをしないと、目次がうまく表示されなかったりするみたい
参考 PHPのob_startでまとめて結果出力

<?php _e( 'ほげほげ', THEME_NAME ) ?>

これは国際化(日本語以外でも表示)処理用の書き方のようだ。
THEME_NAMEはCocoonで以下のように定義されている。

define('THEME_NAME', 'cocoon');

練習で作るショートコードではこれは無視でいいかな。
参考 関数リファレンス/ e - WordPress Codex 日本語版

テンプレート関数

wp_list_pages
wp_get_archives
wp_list_categories
wp_get_archives
このあたりを呼び出して簡単に表示している。

2. 改造する

カテゴリーと月別アーカイブに件数表示を追加。あと、タグ一覧も表示するように改造してみた。

カテゴリーに件数表示

wp list categoriesで引数show_count=trueを渡すと件数が表示される。

<?php wp_list_categories('show_count=true&title_li='); ?>


こんな感じでカッコで件数が付く

カテゴリー1(10)
カテゴリー2(5)

参考 テンプレートタグ/wp list categories - WordPress Codex 日本語版

月別アーカイブに件数表示

月別アーカイブの件数表示も似た感じ。wp get archivesで引数show_post_count=trueを渡すと件数が表示される。

<?php wp_get_archives('type=monthly&show_post_count=true'); ?>

参考 テンプレートタグ/wp get archives - WordPress Codex 日本語版

カッコが消える処理の対処

Cocoonではウィジット上での件数表示のスタイルのために、このカッコを除去する処理が行われている。
参考 投稿数に付加されるカッコを除去するカスタマイズ方法

add_filter( 'wp_list_categories', 'remove_post_count_parentheses' );
add_filter( 'get_archives_link',  'remove_post_count_parentheses' );

style.cssにうまいこと記述するとキレイに表示されるようだが、固定ページ上で試してるためか?何だかうまくいかなかったので、とりあえず自分が利用するサイトマップページ上では、この処理を無効ににしてカッコが表示されるように戻してみた↓かなり場当たり的な対処な気はする。

remove_filter( 'wp_list_categories', 'remove_post_count_parentheses' );
remove_filter( 'get_archives_link',  'remove_post_count_parentheses' );

タグ一覧の表示

タグ一覧は上のソースコードにないので、他からサンプルを拾ってきた。
一番簡単そうなのは、wp_tag_cloud()の引数にformat=list(リスト表示)、show_count=true(件数表示)とかすれば表示される

<?php wp_tag_cloud('format=list&show_count=true&smallest=11&largest=11'); ?>

だが、この方法だと何か他の一覧と見栄えが違う(文字の大きさだけじゃなくてスタイルが違う?)ので、get_tags関数を利用することにした。以下からコピーしただけ。
参考 WordPressでタグの一覧をリスト表示させる方法 | TechMemo

3. 実行する

コピペ改造したコードが以下になります。2段表示するため、2つに分けた。

//============================================
//サイトマップAショートコード関数(カテゴリー、タグ、月別アーカイブ)
//============================================
add_shortcode('my_sitemap', 'my_showSitemap');
function my_showSitemap() {

  remove_filter( 'wp_list_categories', 'remove_post_count_parentheses' );
  remove_filter( 'get_archives_link',  'remove_post_count_parentheses' );

  ob_start();?>

  <h2>カテゴリー</h2>
  <ul><?php wp_list_categories('show_count=true&title_li='); ?></ul>
  <h2>タグ</h2>
  <ul>
  <?php
    $posttags = get_tags();
    if ($posttags) {
      foreach($posttags as $tag) {
        echo '<li><a href="'. get_tag_link($tag->term_id) .'">' . $tag->name . '</a> ('. $tag->count .')</li>';
      }
    }
  ?>
  </ul>
  <h2>月別アーカイブ</h2>
  <ul><?php wp_get_archives('type=monthly&show_post_count=true'); ?></ul>

  <?php return ob_get_clean();
}

//============================================
//サイトマップBショートコード関数(固定ページ、ABC順)
//============================================
add_shortcode('my_sitemap2', 'my_showSitemap2');
function my_showSitemap2() {
  ob_start();?>

  <h2>固定ページ</h2>
  <ul><?php wp_list_pages('title_li='); ?></ul>
  <h2>記事一覧(ABC順)</h2>
  <ul><?php wp_get_archives( 'type=alpha' ); ?></ul>

  <?php return ob_get_clean();
}

固定ページからこれのショートコードを呼び出して
f:id:tagayshin:20190518180818p:plain
こんな感じで表示できた↓
f:id:tagayshin:20190518180946p:plain
https://papangit.com/wp/sitemap/

helloショートコードの次に作ったやつなので、何かおかしなことやってるかもしれないが、動いてはいる。