functions.php に以下を追加:
// use in the loop
function my_get_archives(){
global $wpdb, $wp_locale;
$ymds = get_post_meta(get_the_ID(), 'date');
foreach((array)$ymds as $ymd){
$ym = explode('.', $ymd);
$year = $ym[0];
$month = $ym[1];
$count = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(ID)
FROM $wpdb->posts
WHERE post_type = 'post' AND post_status = 'publish'
AND YEAR(post_date) = $year AND MONTH(post_date) = $month
;"));
$url = get_month_link($year, $month);
$text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($month), $year);
$output .= get_archives_link($url, $text, 'option', '', ' ('.$count.')');
}
return $output;
}
HTML ソースを出力したいところで:
<?php echo my_get_archives(); ?>
※カスタムフィールドの年月重複は未考慮。
kzさん
お返事ありがとうございます。
頂いたソースをfunction.phpにコピペし、
<?php echo my_get_archives(); ?>
を該当箇所に記入しましたが、ページを見るとその箇所から以下が表示されなくなりました。
念のため、function.phpを新規に作成し、頂いたソースのみの関数を記述しましたが、やはり動作しないようです。
作成したfunction.php
<?php
// use in the loop
function my_get_archives(){
global $wpdb, $wp_locale;
$ymds = get_post_meta(get_the_ID(), '日付カスタムフィールドID');
foreach((array)$ymds as $ymd){
$ym = explode('.', $ymd);
$year = $ym[0];
$month = $ym[1];
$count = $wpdb->get_var($wpdb->prepare("
SELECT COUNT(ID)
FROM $wpdb->posts
WHERE post_type = 'post' AND post_status = 'publish'
AND YEAR(post_date) = $year AND MONTH(post_date) = $month
;"));
$url = get_month_link($year, $month);
$text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($month), $year);
$output .= get_archives_link($url, $text, 'option', '', ' ('.$count.')');
}
return $output;
}
?>
頂いたソースをfunction.phpにコピペし
function.php ではなくて functions.php (s が付いて複数形になってます)なのをご確認ください。
バッチリ動作検証しているので、それでも以降の出力が無いなら他の部分で何かを間違ってると思われます。
kzさん
返事が遅れてしまいすいません。
function.php ではなくて functions.php (s が付いて複数形になってます)なのをご確認ください。
恥ずかしいを通り越して情けなくなりました。。。。初歩的なミスですいません。
functions.phpに変更し、記述したところ動作を確認しました。
が、やはり注釈してくださった
※カスタムフィールドの年月重複は未考慮。
の部分や、シングルページに入った時はそのページの年月しか表示されないない 等、いろいろとやはり不安定な動作が発覚しました。
ちなみに該当フォームは以下のようにしています。
<form method="get" name="s" action="<?php bloginfo( 'url' ); ?>">
<select name="c" class="simpleBox"> <option value="" selected="selected">ARCHIVES</option>
<?php if(have_posts()) : ?>
<?php while(have_posts()) : the_post(); ?>
<?php echo my_get_archives(); ?>
<?php endwhile; ?>
<?php endif; ?>
</select>
</form>
やはりこれ以上の動作は難しいでしょうか??
カスタムフィールドの年月重複を考慮(未検証)。
foreach((array)$ymds as $ymd){
$ym = explode('.', $ymd);
を以下に変更。
$yms = array();
foreach((array)$ymds as $ymd){
$temp = explode('.', $ymd);
$yms[$temp[0].$temp[1]] = $temp;
}
foreach($yms as $ym){
シングルページに入った時はそのページの年月しか表示されない
フォームのループ処理前にカスタムフィールドのアーカイブリンクを表示したい投稿を query_posts で集めてきます。
<?php
query_posts('posts_per_page=-1'); // 条件はお好みで。
if(have_posts()) :
while(have_posts()) :
the_post();
echo my_get_archives();
endwhile;
endif;
wp_reset_query();
?>
kzさん
お世話になります。
返事が遅れてしまい申し訳ありません。
教えて頂いたソースを参考にしてなんとかやってみます。
ありがとうございました。