Zeige nur Beiträge aus der referenzierten Kategorie auf der Archivseite des Datums an

Ich benutze wp_get_archive () in category.php.

Wenn ich auf der Seite der Kategorie = 2 bin, sollte es meine Archive nur dieser Kategorie zeigen. Es ist jedoch für alle Kategorien. Im Folgenden finden Sie den Code für meine category.php und archive.php

 1, ); $loop = new WP_Query( $args ); if($loop->have_posts()):while ( $loop->have_posts() ): $loop->the_post(); the_content(); endwhile; endif; ?>  'daily') ); ?> 

Der erste Teil, der das Archiv einer bestimmten Kategorie zeigen soll, wurde mit diesem Code dank Pieter Goosen getriggers – Antwort von ihm gegeben Wie ändere ich die SQL-Abfrage für wp_get_archive ()

Aber jetzt Problem ist, dass, wenn ich zu diesem Archiv von der Kategorieseite gehe, ich auch nur Pfosten von dieser Kategorie nur anzeigen muss.

Solutions Collecting From Web of "Zeige nur Beiträge aus der referenzierten Kategorie auf der Archivseite des Datums an"

Bevor ich erneut beginne, 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 getriggers, um nur die Archive der aktuell angezeigten Kategorie anzuzeigen. Das nächste Problem besteht darin, nur Einträge aus der aktuellen Kategorie anzuzeigen, wenn Sie das Datumsarchiv aus der aktuellen Kategorie aufrufen

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

  • pre_get_posts

  • query_vars

  • get_archives_link

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

Als nächstes müssen wir die Archiv-Links von wp_get_archives() ändern, wenn sie auf Kategorieseiten angezeigt werden. Wir müssen die Kategorie-ID zur URL 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 get_archives_link , verwenden wir den Filter get_archives_link zum Ändern der Links und add_query_arg zum Hinzufügen der benutzerdefinierten add_query_arg zu den neuen Links

Nun, da wir die neuen Links haben, wenn Sie auf die Links von den Kategorieseiten klicken, sehen Sie so etwas wie Ihre URL auf den Seiten des Date-Archivs ?cq=21 . 21 ist die Kategorie ID in meiner Testseite.

Wir müssen jetzt prüfen, wann wir uns auf einer Datenarchivseite befinden, wenn die neue quey-Variable an die URL angehängt wird. Wir verwenden filter_input( INPUT_GET, 'cq', FILTER_VALIDATE_INT ); Um den Wert zu erhalten, bereinigen und validieren Sie den Wert von der URL. Wenn die neue Abfragevariable an die URL angehängt wird, müssen wir unsere Hauptabfrage so anpassen, dass nur Beiträge aus der Kategorie zurückgegeben werden, deren ID cq als Wert hinzugefügt wurde. 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 ); } });