it-swarm.com.de

Nur Posts der angegebenen Kategorie auf der Datumsarchivseite anzeigen

Ich benutze wp_get_archive () in category.php.

Wenn ich mich auf der Seite der Kategorie 2 befinde, sollten nur meine Archive dieser Kategorie angezeigt werden. Es ist jedoch für alle Kategorien. Es folgt der Code für meine category.php sowie 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') ); ?>

Der erste Teil, der das Archiv einer bestimmten Kategorie anzeigen soll, wurde durch diesen Code dank Pieter Goosen gelöst - Antwort von ihm auf Wie ändere ich die SQL-Abfrage für wp_get_archive ()

Aber jetzt ist das Problem, dass, wenn ich zu diesem Archiv von der Kategorieseite gehe, ich auch nur Beiträge von dieser Kategorie nur zeigen muss.

2
user3848698

Bevor ich wieder anfange, möchte ich nur die Tatsache betonen, dass Sie keine benutzerdefinierte Abfrage anstelle der Hauptabfrage auf Ihren Archivseiten ausführen sollten. In diesem Beitrag erfahren Sie, wann Sie eine benutzerdefinierte Abfrage verwenden sollten und wo nicht. Wenn Sie nicht zur Standardschleife zurückkehren, funktioniert meine Lösung nicht

Im vorherigen Beitrag haben wir das Problem bereits behoben, sodass nur die Archive der aktuell angezeigten Kategorie angezeigt werden. In der nächsten Ausgabe werden nur Beiträge aus der aktuellen Kategorie angezeigt, wenn Sie das Datumsarchiv aus der aktuellen Kategorie besuchen

Um dies zu erreichen, werden wir die folgenden Filter und Aktionen verwenden

Damit die Datumsarchivseite weiß, ob die Anfrage von einer Kategorieseite stammt, und um die Posts nur von dieser Kategorie bereitzustellen, müssen wir eine Art Referrer festlegen. Da wp_get_referer() und $_SERVER['HTTP_REFERER'] sehr unzuverlässig sind (siehe dieser Beitrag für weitere Informationen), werden wir zusätzliche Parameter in der URL verwenden, um Werte festzulegen, die wir überprüfen und verwenden, um zu bestimmen, welche Beiträge geliefert werden sollen. Um dies zu erreichen, setzen wir eine neue Abfragevariable cq, die die aktuelle Kategorie-ID enthält.

Als nächstes müssen wir die Archivverknüpfungen von wp_get_archives() ändern, wenn sie auf Kategorieseiten angezeigt werden. Wir müssen der URL die Kategorie-ID hinzufügen, damit wir die Kategorie-ID lesen können, wenn wir uns auf der Archivseite befinden, um die Hauptabfrage zu ändern. Um die Links so zu ändern, dass sie unsere benutzerdefinierte Abfragevariable enthalten, verwenden wir den Filter get_archives_link, um die Links zu ändern, und add_query_arg , um die benutzerdefinierten Abfragevariablen zu den neuen Links hinzuzufügen

Nachdem wir die neuen Links haben, sehen Sie, wenn Sie auf die Links auf den Kategorieseiten klicken, etwas Ähnliches, das Ihrer URL auf den Datumsarchivseiten ?cq=21 hinzugefügt wurde. 21 ist die Kategorie-ID auf meiner Testsite.

Wir müssen jetzt überprüfen, wann immer wir uns auf einer Datumsarchivseite befinden, ob die neue Abfragevariable an die URL angehängt ist. Wir werden filter_input( INPUT_GET, 'cq', FILTER_VALIDATE_INT ); verwenden, um den Wert aus der URL abzurufen, zu bereinigen und zu validieren. Wenn die neue Abfragevariable an die URL angehängt wird, müssen wir unsere Hauptabfrage so anpassen, dass nur Posts aus der Kategorie zurückgegeben werden, deren ID als Wert zu cq hinzugefügt wird. pre_get_posts wird hier verwendet

Hier ist der vollständige Code:

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