web-dev-qa-db-ja.com

日付アーカイブページの参照カテゴリからの投稿のみを表示する

Category.phpでwp_get_archive()を使用しています。

カテゴリ= 2のページにいる場合は、そのカテゴリのみのアーカイブが表示されます。しかし、それはすべてのカテゴリ用です。以下は私のcategory.phpとarchive.phpのコードです。

<?php get_header(); ?>
 <?php 
   $args =array(               
                'posts_per_page' =>1,                 
           );
  $loop = new WP_Query( $args );                                            
  if($loop->have_posts()):while ( $loop->have_posts() ): $loop->the_post();
   the_content();
  endwhile;
  endif;
 ?>
 <?php wp_get_archives( array( 'type' => 'daily') ); ?>

Pieter Goosenのおかげで特定のカテゴリのアーカイブを表示するという最初の部分はこのコードによって解決されました - 彼の答え:wp_get_archive()のSQLクエリを変更するにはどうすればよいですか

しかし今の問題は、カテゴリページからそのアーカイブにアクセスした場合、そのカテゴリからの投稿のみを表示する必要があることです。

2
user3848698

もう一度始める前に、アーカイブページでメインクエリの代わりにカスタムクエリを実行してはいけないという事実を強調したいと思います。 この記事 を参照してください。カスタムクエリを使用する必要がある場合と使用しない場合について学びます。私はあなたがデフォルトのループに戻らない、そして私の解決策はうまくいかない

前回の記事では、現在表示されているカテゴリのアーカイブのみを表示するように問題を解決しました。次の問題は、現在のカテゴリの日付アーカイブにアクセスしたときに、現在のカテゴリの投稿のみを表示することです。

これを達成するために、以下のフィルタとアクションを利用します。

日付アーカイブページがカテゴリページからのリクエストかどうかを確認し、そのカテゴリのみからの投稿を処理するには、ある種の参照元を設定する必要があります。 wp_get_referer()$_SERVER['HTTP_REFERER']は非常に信頼性が低いので(詳細については この記事 を参照してください)、値を設定するために追加のパラメーターを使用し、どの値を提供するかを決定します。これを実現するために、現在のカテゴリIDを保持する新しいクエリ変数cqを設定します。

次に、カテゴリページに表示されるときにwp_get_archives()のアーカイブリンクを修正する必要があります。アーカイブページにいるときにカテゴリIDを読み取ってメインクエリを変更できるように、カテゴリIDをURLに追加する必要があります。カスタムクエリ変数を含むようにリンクを変更するには、リンクを変更するためにget_archives_linkフィルタを使用し、新しいリンクにカスタムクエリ変数を追加するために add_query_arg を使用します。

新しいリンクができたので、カテゴリページのリンクをクリックすると、アーカイブページの?cq=21のURLにこのようなものが追加されます。 21は私のテストサイトのカテゴリIDです。

新しいquey変数がURLに追加されているかどうか、日付アーカイブページにいるときはいつでもチェックする必要があります。値を取得し、URLから値をサニタイズして検証するためにfilter_input( INPUT_GET, 'cq', FILTER_VALIDATE_INT );を使用します。新しいクエリ変数がURLに追加されている場合、IDがcqの値として追加されているカテゴリからの投稿のみを返すようにメインクエリを調整する必要があります。ここではpre_get_postsが使用されます

これが完全なコードです。

add_filter( 'query_vars', function ( $vars ) {

    $query_vars = [
        'cq'  
    ];
    $vars = array_merge( $vars, $query_vars );

    return $vars;

});


add_filter( 'get_archives_link', function ( $link_html ) {

    if( is_category() ) {

        preg_match ( "/href='(.+?)'/", $link_html, $url );

        $old_url = $url[1];
        $new_url = add_query_arg( ['cq' => get_queried_object_id()], $old_url );
        $link_html = str_replace( $old_url, $new_url, $link_html );

    }

    return $link_html;

});

add_action( 'pre_get_posts', function ( $q ) {

    $cat_id = filter_input( INPUT_GET, 'cq', FILTER_VALIDATE_INT );
    if(     !is_admin() // Target only the front end
         && $q->is_main_query() // Target only the main query
         && $q->is_date() // Only target the date archive pages
         && $cat_id // Only run the condition if we have a valid ID
    ) {

        $q->set( 'cat', $cat_id );

    }
});
2
Pieter Goosen