サポート » 使い方全般 » カスタム投稿タイプの月別アーカイブ

  • t t

    (@tsugubai)


    カスタム投稿タイプの月別アーカイブリストを表示したいのですが、wp get archives()を使っても何も表示されなくて困っています。

    <?php
    /*
    Template Name: bookテンプレート
    */
    ?>
    
    <!--タイトル一覧表示-->
    
    <ul>
    
    <?php
    query_posts('post_type=book&posts_per_page=10');
    if(have_posts()):
    while(have_posts()): the_post();
    ?>
    
    <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    
    <?php endwhile; endif; wp_reset_query();?>
    
    </ul>
    
    <!--月別リスト表示-->
    
    <?php wp_get_archives('type=monthly'); ?>

    こんな感じでやっていますが、最後の行の<?php wp_get_archives(‘type=monthly’); ?>
    で何も表示されません。

    bookというカスタム投稿タイプの投稿を表示するページを、固定ページを使って作成しているのですが、これがまずいのでしょうか?

    月別リストを表示したら、もちろん月別ページも作成したいのですが、カスタム投稿タイプってアーカイブ用のテンプレートとか用意されていませんよね?

    みなさま、どうやってカスタム投稿タイプの月別アーカイブを作成されていますか?

    教えてくださいm(__)m

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • #未検証

    テーマフォルダの functions.php に以下を追加:
    ※<?php ?> の間にテキトウにコピペってください。

    add_filter( 'getarchives_where', 'my_getarchives_where', 10, 2 );
    function my_getarchives_where( $where, $r ) {
      if ( isset $r['post_type'] )
        $where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
      return $where;
    }

    表示したいところで

    <?php wp_get_archives('type=monthly&post_type=book'); ?>

    と書けば OK◎

    トピック投稿者 t t

    (@tsugubai)

    いただいたコードで、表示部分はいけました。
    ありがとうございます。

    が、表示されたリンクをクリックすると、404エラーのページが表示されます。
    urlはこれです↓
    http://xxx.com/test/?m=201004

    archive.phpもdate.phpもindex.phpもあるのに、なぜそちらが表示されないのでしょうか?

    #たぶん初歩的なことなんだと思いますが。。すみません。

    トピック投稿者 t t

    (@tsugubai)

    ひとつ上↑の疑問ですが、解決しました。

    2010年4月に「投稿」で作成した記事がなかったため、404エラーが出ていたようです。
    試しに2010年4月の記事を「投稿」で作成したら、date.phpで表示されました。

    2010年4月に「book」というカスタム投稿タイプで作った記事はあるのですが、wordpressが吐き出すパーマリンクでは拾ってくれないようですね。

    #基本的なことなのでしょうね。。勉強中なのです。すみません。

    カスタム投稿タイプの記事を、http://xxx.com/test/?m=201004の形式で月別アーカイブ表示することは可能でしょうか?

    他にも何か手段があればご教授ください。。

    トピック投稿者 t t

    (@tsugubai)

    何度も失礼します。

    http://xxx.com/test/?m=201004&post_type=book

    のように、パーマリンクの最後に「&post_type=book」を強引につけてやると、指定したカスタム投稿タイプの指定した年月のアーカイブがdate.phpにて表示され、希望通りの動作を得ることができました。

    urlの最後に「&post_type=post_type」をつけるなら、get_archives_linkをフックしたらよい?かな?と思ったのですが。。

    イメージとしては、
    get_archives_link($url, $text, $format, $before, $after);

    get_archives_link($url, $text, $format, $before, $after, $post_type);
    のように、もうひとつ引数を増やして、正規表現か何かで細工したら良いかと思ったのですが。。

    格闘してみたのですが、add_filterやapply_filtersの使い方をまだよく理解しておらず、うまくいきませんでした。。

    そもそも、このようなことは実現可能でしょうか?

    思考の方向間違っているでしょうか?

    どなたかご助言お願いいたしますm(__)m

    はじめまして 月別アーカイブを表示する投稿タイプが固定(この場合はbookのみ)であれば
    archive.phpにてループ前に
    <?php query_posts($query_string.’&post_type=book’); ?>

    すべての投稿タイプを含むなら
    post_type=any

    選別するなら
    http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts
    の「オリジナルクエリの保持(ページングなど)」の部分を参考にするといいかと思います。

    ただ、postの月別アーカイブ、bookの月別アーカイブなどのようにaタグリンクにて
    別々に表示させようとするのならurlに含めないといけないかと思いますが・・・

    #未検証

    global $my_archives_post_type;
    add_filter( 'getarchives_where', 'my_getarchives_where', 10, 2 );
    function my_getarchives_where( $where, $r ) {
      global $my_archives_post_type;
      if ( isset $r['post_type'] ) {
        $my_archives_post_type = $r['post_type'];
        $where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
      } else {
        $my_archives_post_type = '';
      }
      return $where;
    }
    add_filter( 'get_archives_link', 'my_get_archives_link' );
    function my_get_archives_link( $link_html ) {
      global $my_archives_post_type;
      if ( '' != $my_archives_post_type )
        $link_html .= '&post_type=' . $my_archives_post_type;
      return $link_html;
    }

    でどうでしょう。

    トピック投稿者 t t

    (@tsugubai)

    jdbbさま、kzさま、アドバイスありがとうございます。
    返信が遅くなっており、申し訳ありません。

    ご助言いただいたコードを元に、現在がんばっているところです(汗

    カスタム投稿タイプの中にカスタムタクソノミーまで作っている関係で、
    カスタマイズにてこずっているところです。

    ページングも考えなあかんし。。

    もしうまくいったら、コード載せさせてもらいます!

    同じことで悩んでいたのですが、一応解決したので、コードを載せさせていただきます。

    global $my_archives_post_type;
    add_filter( 'getarchives_where', 'my_getarchives_where', 10, 2 );
    function my_getarchives_where( $where, $r ) {
      global $my_archives_post_type;
      if ( isset($r['post_type']) ) {
        $my_archives_post_type = $r['post_type'];
        $where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
      } else {
        $my_archives_post_type = '';
      }
      return $where;
    }
    add_filter( 'get_archives_link', 'my_get_archives_link' );
    function my_get_archives_link( $link_html ) {
      global $my_archives_post_type;
      if ( '' != $my_archives_post_type )
        $add_link .= '?post_type=' . $my_archives_post_type;
    	$link_html = preg_replace("/href=\'(.+)\'\s/","href='$1".$add_link."'",$link_html);
    
      return $link_html;
    }

    ttさま、jdbbさま、kzさま、ありがとうございました。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「カスタム投稿タイプの月別アーカイブ」には新たに返信することはできません。