サポート » 使い方全般 » カスタムフィールドで作った日付項目から月別アーカイブリスト作成

  • 解決済 mattune

    (@mattune)


    タイトルの件で質問させて下さい。
    現在、WordPress2.9.2を使用して制作しております。

    カスタムフィールドで日付入力欄(2010.03.25 形式で入力)を作成し、それを使用して

    wp_get_archives(‘type=monthly&format=option&show_post_count=1’);

    で生成されるソース

    <option value=’http://example.com/2010/01/’&gt; 2010年1月  (1)</option>
    <option value=’http://example.com/2010/02/’&gt; 2010年2月  (1)</option>
    <option value=’http://example.com/2010/03/’&gt; 2010年3月  (1)</option>

    と同様の物を作ろうとしていますが、行き詰まってしましました。。。。
    カスタムフィールド項目でソートする場合の記事は見かけたのですが、今回のように

    1.入力月の表示
    2.入力月のアーカイブへのリンク
    3.入力月の記事合計数

    を実装するような記事は見つけられませんでした。

    お手数ですが、教えていただけないでしょうか?

    よろしくお願い致します。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • kz

    (@kz)

    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', '', '&nbsp;('.$count.')');
      }
      return $output;
    }

    HTML ソースを出力したいところで:
    <?php echo my_get_archives(); ?>

    ※カスタムフィールドの年月重複は未考慮。

    トピック投稿者 mattune

    (@mattune)

    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', '', '&nbsp;('.$count.')');
    	}
    	return $output;
    }
    ?>

    kz

    (@kz)

    頂いたソースをfunction.phpにコピペし

    function.php ではなくて functions.php (s が付いて複数形になってます)なのをご確認ください。
    バッチリ動作検証しているので、それでも以降の出力が無いなら他の部分で何かを間違ってると思われます。

    トピック投稿者 mattune

    (@mattune)

    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>

    やはりこれ以上の動作は難しいでしょうか??

    kz

    (@kz)

    カスタムフィールドの年月重複を考慮(未検証)。

    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();
    ?>

    トピック投稿者 mattune

    (@mattune)

    kzさん

    お世話になります。
    返事が遅れてしまい申し訳ありません。

    教えて頂いたソースを参考にしてなんとかやってみます。

    ありがとうございました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「カスタムフィールドで作った日付項目から月別アーカイブリスト作成」には新たに返信することはできません。