web-dev-qa-db-ja.com

年月によるカスタム投稿タイプのアーカイブ

カスタム投稿タイプのアーカイブを年月ごとに表示するにはどうすればよいですか。

17
Dan Lee

はい、できます。必要なのはwp_get_archives();用のフィルタを作成するだけなので、post_typeパラメータを受け入れます。

function my_custom_post_type_archive_where($where,$args){  
    $post_type  = isset($args['post_type'])  ? $args['post_type']  : 'post';  
    $where = "WHERE post_type = '$post_type' AND post_status = 'publish'";
    return $where;  
}

それからこれを呼び出します。

add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);

カスタム投稿タイプでアーカイブを表示したい場合は、post_type引数を渡すだけです。

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
16
takien

あなたはそうではありません、Wordpress開発者からの公式の線はカスタム投稿タイプが通常の普通の投稿の仕事をすることを意図していなかったということです、そしてあなたが日付の投稿アーカイブなどを必要とするなら投稿フォーマットなどを使うほうがいいです。

カスタム投稿タイプはWebアプリケーションなどを対象としていますが、別の名前を持つセカンダリブログまたはパラレルブログとして機能するカスタム投稿タイプを設定するなどの操作を行います。同じ機能を持つblog対newsは、その機能が意図されていたものではなく、その実装から生じる他の技術的問題を意味するでしょう。

それでもこれに固執し、単にカスタム分類法と投稿フォーマットを使うだけでは不十分な場合は、functions.phpに書き換え規則を追加し、特定のURLの年/月アーカイブを投稿アーカイブページにリダイレクトしてから、カスタムをチェックします。書き換えルールで変数を指定して別のテンプレートをロードした場合は、アーカイブページを投稿し、書き換えルールで適切な値を設定してください。

6
Tom J Nowell

EDIT - >この回答は<WP4.4でも機能します。4.4カスタム投稿タイプのサポートがwp_get_archives()に含まれるようになったためです。


WordPressでカスタム投稿タイプの日付ベースのアーカイブを作成するための、シンプルですばやく簡単なソリューションがついに登場しました。これは ここで記録されている [WP Core Tracの中で長年にわたる問題でした。

まだ解決されていませんが、Tracの貢献者の1人がGitHubに シンプルなプラグインを投稿しました これにより、CPT用の日付ベースのアーカイブを作成できます。

このプラグインをインストールした後、または自分の関数のコードを手動で追加した後は、CPTのアーカイブを次のように使用します。

<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>

この新しい関数wp_get_archives_cptは、標準のwp_get_archivesと同じように機能するので、使用できる通常の引数を使用できます。ただし、カスタム投稿タイプ名の引数を追加できるようにするための機能が追加されただけです。

5
Trevor

これをtaikenの回答に追加するのに十分な評判がないので申し訳ありません。

しかし、彼の答えは私にはうまくいくと付け加えたかったのですが、リンクは 'localhost/date/2010'の形式でした。私は 'localhost/postslug/2010'フォーマットが必要でしたが。 wp_get_archivesの出力に文字列置換を使用することでこれを修正できました。

それで、あなたのパーマリンクがどのように設定されているかに依存して、このコードは404問題を修正しそしてカスタム投稿タイプパーマリンク構造へのリンクをリダイレクトするでしょう:

$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<your post type name>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<your post type slug>'),$yearly_archive);
2
mrbencowell

Takienの投稿に追加することはできませんので、ここに私がしなければならなかったものがあります:

functions.php

add_action('init', 'my_year_archive_rewrites');  
function my_year_archive_rewrites() {   
    add_rewrite_rule('resource/news/([0-9]{4})/page/?([0-9]{1,})/?', 'index.php?post_type=news&year=$matches[1]&paged=$matches[2]', 'top');
    add_rewrite_rule('resource/news/([0-9]{4})/?', 'index.php?post_type=news&year=$matches[1]', 'top');
}

add_filter('getarchives_where', 'my_custom_post_type_archive_where', 10, 2);
function my_custom_post_type_archive_where($where,$args){  
    $post_type = isset($args['post_type']) ? $args['post_type'] : 'post';  
    return "WHERE post_type = '$post_type' AND post_status = 'publish'";
}

add_filter('year_link', 'my_year_link');
function my_year_link($link) {
    global $wp_rewrite;

    if(true) { // however you determine what archive you want
        $link = str_replace($wp_rewrite->front, '/resource/news/', $link);
    }

    return $link;
}

wp_get_archives()を呼び出す

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
1
pkmatte