年と月ごとのカスタム投稿タイプのアーカイブ?


17

年と月ごとにカスタム投稿タイプのアーカイブをどのように表示しますか?


作品の下に私のソリューションあなたはWP 4.4 <使用しているが、WP 4.4のリリース以降、wp_get_archivesは()最後に、カスタムポストタイプのサポートしている場合:developer.wordpress.org/reference/functions/wp_get_archivesを
トレバー

回答:


17

はい、できます。必要なのは、パラメーターを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を渡すだけです:

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

3
このソリューションを試しましたか?CPTからの投稿と投稿数を含む月のリストを正しく取得しますが、リンクは役に立ちません。クリックすると、CPTではなくサイト全体の月に移動します。
jerclarke

掘り下げた後(以下のTom Nowellの回答を参照)、カスタム投稿タイプの月間アーカイブをあきらめました。代わりに、投稿カテゴリを使用し、パーマリンク構造をに変更しました/%category%/%year%/%monthnum%/%postname%/。次に、上記のようなフックを使用して/%category%/、日付だけでなく開始するリンクを変更することができます。
ケビンC.

これに関する質問。これは、のようなURLを作成しますmysite.com/2013/04が、404にこのリードは、カスタムポストタイプは次の場所にあります。mysite.com/cats私はと思わせるそのmysite.com/cats/2013/04リンクがどうあるべきかになりますが、これはまた、あなたが仕事にアーカイブリンクを取得するにはどうすればよい404に解決しますか?
gaoshan88

2
さらに良いことに、WordPressのこの欠落した機能を処理するプラグインがついに登場しました。これは、コアのこの問題を修正しようとするコア貢献者によって作成されました。プラグインは、コアで問題が適切に解決されるまで、私たちを通過させるために提供されています。wordpress.org/plugins/archives-for-custom-post-types
トレバー14

6

Wordpress開発者からの公式の意見は、カスタム投稿タイプは通常の通常の投稿の仕事をすることを意図したものではなく、日付などの投稿アーカイブが必要な場合、あなたは物事を正しく行っていないということでした投稿フォーマットなどを使用した方が良いでしょう。

カスタム投稿タイプはWebアプリケーションなどを対象としていますが、別の名前(たとえば、ブログとニュースなど)でセカンダリまたはパラレルブログとして機能するカスタム投稿タイプを設定するなどの機能は、機能とは異なりますその実装から生じる他の技術的な問題を意図しており、意味します。

それでもこれに固執していて、カスタムの分類法と投稿形式を使用するだけでは不十分な場合は、functions.phpに書き換えルールを追加し、特定のURLの年/月アーカイブを投稿アーカイブページにリダイレクトしてから、カスタムを確認できます書き換えルールで変数を指定し、別のテンプレートを読み込む場合は、アーカイブページを投稿します。書き換えルールで適切な値を設定してください。


彼らがこの機能でこれまでにしか行かないのは少し奇妙に思えます。カスタム投稿の使用方法の例を教えてください。
ダン・リー

カスタム投稿は、ページやブログ投稿の範囲に含まれないもの(または、異なる名前のブログ投稿でも同じように機能するもの、例えばarticle / news / diary / etc)に使用する必要があります。カスタム投稿の正しい使用例は次のとおりです。 :イベント、メニュー、場所、フォーム、ログなど
トムJノウェル

基本的に、カスタム投稿はWebアプリを作成する手段であり、バックエンドの投稿メニューを複製して簡単に編集する手段ではありません(そのような使用は、wordpressをはるかに遅くし、あなたが実現するよりもタスクになります)
トムJノウェル

1
うううう これは、質問に対する悲劇的な正解です。上記の説明が「CPTの日付URLがあってはならない」ことに基づいているとは信じられませんが、実装しないという実際の決定を下すのは、ほぼ間違いなく「CPTの日付URLが複雑すぎる」ことです。明らかに、カスタム投稿タイプの日付アーカイブが必要な場合がありますが、投稿形式を指摘することによってその明白な欲求を消滅させることはできません。
jerclarke

1
私は強く反対しなければなりません。カスタム投稿タイプは、使用したいものすべてに使用することを目的としていますが、コーデックスのどこで「ウェブアプリ」用であるとは言われていません。また、独自のカスタム分類を持つ「ニュース」セクションが非常に必要になる場合があり、それらのアーカイブが必要になります。または、推奨される「イベント」タイプでさえ、CPTの完全な使用法であることに同意しますが、ここでも日付ベースのアーカイブが簡単に必要になる可能性があります。
トレバー

5

編集 ->この回答は<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ため、受け入れる通常の引数を使用できます。ただし、カスタムの投稿タイプ名引数を追加できるようになるだけです。


2

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

1

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
Pieter Goosen 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.