it-swarm.com.de

Archivseite für Taxonomie des benutzerdefinierten Beitragstyps

Ich erstelle eine Vorlage für eine Archivseite mit der Taxonomie eines benutzerdefinierten Beitragstyps.

Grundsätzlich muss ich je nach Monat gerne zeigen

August 2015
July 2015

Um oben anzuzeigen, habe ich unten Filter verwendet:

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

add_filter('getarchives_join', 'custom_archives_join', 10, 2);

function custom_archives_join($x, $r) {
  global $wpdb;
  $cat_ID = $r['cat'];
  if (isset($cat_ID)) {
    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
  } else {
    return $x;
  }
}

Wenn Sie auf August 2015 klicken, sollten alle Posts angezeigt werden, insbesondere die Taxonomie des CPT. Aber momentan bekomme ich alle Beiträge.

Kann mir jemand diese Archivseite für die Taxonomie von benutzerdefinierten Beitragstypen vorschlagen?

1
Blue Rose

Bevor ich anfange, haben Sie einen Fehler in Ihrem Code, den Sie hätten finden sollen, wenn Sie den Debug aktiviert hätten. Sie weisen einer Variablen zuerst $r['cat'] zu, bevor Sie auch nur prüfen, ob $r['cat'] festgelegt ist. Da cat keine Standardeinstellung ist, wird sie möglicherweise nicht festgelegt. Dies führt zu einem PHP -Fehler, wenn cat nicht festgelegt ist. Sie können Ihren Code so umgestalten: ( Benötigt PHP5.3 +. Ich bin auch davon ausgegangen, dass dies wie beabsichtigt funktioniert, also habe ich nichts geändert )

add_filter('getarchives_join', function ( $x, $r ) 
{
  global $wpdb;

  // Set $cat_ID to the value of $r['cat'] if it is set, otherwise set to false
  $cat_ID = isset( $r['cat'] ) ? $r['cat'] : false;

  // If $cat_ID is false, return $x as is
  if ( !$cat_ID )
    return $x;

  // We have a value in $cat_ID, lets modify and return the required sql string
  return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";

}, 10, 2 );

Nachdem wir das aus dem Weg geräumt haben, schauen wir uns hier das eigentliche Problem an. Um die richtigen Beiträge auf der Archivseite zu erhalten, wenn ein Archiv ausgewählt ist, müssen wir

  • wissen, woher die Anfrage kam

  • filtern Sie die Hauptabfrage nach der Herkunft des Posts, um die richtigen Posts anzuzeigen.

Um Punkt 1 anzugehen, benötigen wir eine Art Referrer, damit wir wissen, woher die Anforderung der Archivseite stammt. Dieser Referrer ist unser Schlüssel, mit dem wir die korrekten Beiträge nach Begriff anzeigen können.

HTTP-Referrer sind äußerst unzuverlässig, da es viele clientseitige Faktoren gibt, die den Wert eines Referrers ändern oder steuern können. Der folgende Abschnitt ist ein Abschnitt, den ich aus einer meiner vorherigen Antworten als zusätzliche Informationen für Überweiser entnommen habe, sodass Sie sich die Zeit nehmen und die folgenden Informationen lesen können

Das Problem bei Referrern ist, dass sie benutzerseitig eingestellt und gesteuert werden. Verweise können deaktiviert oder blockiert werden (wie Benutzer, die hinter einem Proxy auf eine Site zugreifen). Nur aus Gründen des Interesses ist hier eine sehr interessante Antwort auf die Frage In welchen Fällen wird der http-Verweis leer sein , entnommen aus diesem Beitrag auf SO

Es wird/kann leer sein, wenn der Endbenutzer

  • geben Sie die Site-URL in die Adressleiste des Browsers ein.
  • besuchte die Website von einem Browser gepflegten Lesezeichen.
  • besuchte die Seite als erste Seite im Fenster/Reiter.
  • von einer https-URL zu einer http-URL gewechselt.
  • von einer https-URL zu einer anderen https-URL gewechselt.
  • hat Sicherheitssoftware installiert (Antivirus/Firewall/etc), die den Referrer von allen Anfragen befreit.
  • steht hinter einem Proxy, der den Referrer von allen Anfragen befreit.
  • besuchte die Website programmatisch (wie, locken), ohne den Referrer-Header zu setzen (Suchbots!).

Lesen Sie auch die anderen Antworten, um zusätzliche Informationen zu erhalten

Ich hatte ein ähnliches Problem und suchte nach einer zuverlässigeren Methode zum Festlegen und Übergeben von Verweisen. Dies führte zu [dieser Frage] ( Standard-Permalink-Struktur von hübschen URLs ) und einer wunderbaren Antwort von @gmazzap

Wie ich in den Kommentaren angedeutet habe, übergeben wir einen Wert in der URL, den wir als Verweis verwenden, um die korrekten Beiträge entsprechend dem Begriff auf der Archivseite anzuzeigen. Dazu müssen wir die Funktion get_archives_link() filtern, um unseren Verweis zur Archiv-URL hinzuzufügen, und unseren Verweis zur Liste von query_vars hinzufügen, damit wir ihn lesen und verwenden können.

Fügen Sie zunächst den query_vars hinzu, und nennen Sie ihn ref, die Abkürzung für referrer. ref enthält einen benutzerdefinierten Wert, der der Term-ID entspricht

add_filter( 'query_vars', function ( $vars )
{
    $vars[] = 'ref';

    return $vars;
});

Jetzt ist die ref lesbar und kann über den get_archives_link-Filter zu unserem Archivlink in der get_archives_link()-Funktion hinzugefügt werden: ( Dies erfordert PHP 5.4+ aufgrund der kurzen Array-Syntax ([]) )

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

    if( is_tax() ) { // Adjust this to target specific taxonomies or taxonomy terms if needed

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

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

    }

    return $link_html;

});

Sie werden nun sehen, dass, wenn Sie auf einer Taxonomie-Seite auf einen Archiv-Link klicken, Folgendes zur URL hinzugefügt wird. Dies ist nun unser Verweiser

 ?ref=1

wobei eins die ID unseres Begriffs ist

Der letzte Teil (2. Aufzählungspunkt) besteht darin, unsere Anfrage entsprechend zu filtern. Hier müssen wir

  • überprüfe ob ref gesetzt ist

  • wenn ref gesetzt ist, wird der Wert abgerufen. ( Vergiss nicht zu bereinigen, um Dateninjektion zu vermeiden. )

  • filtern Sie die Hauptabfrage entsprechend

Der letzte Teil des Codes sieht folgendermaßen aus: ( Erfordert mindestens PHP 5.4+ aufgrund der kurzen Array-Syntax )

add_action( 'pre_get_posts', function ( $q )
{
    // VERY VERY IMPORTANT: Check if `ref` is set as $_GET variable, get the value and validate as an integer
    $referrer = filter_var( INPUT_GET, 'ref', FILTER_VALIDATE_INT );

    if (    !is_admin() // Only target front end queries
         && $q->is_main_query() // Only target the main query
         && $q->is_date() // Only targets date archive pages, adjust as needed
         && $referrer // Only proceed if $referrer has a value
    ) {
        // To avoid bugs in a multi custom taxonomy install, check if the term is valid
        if ( term_exists( $referrer, 'CUSTOM_TAXONOMY_NAME' ) ) { // IMPORTANT: Use the correct taxonomy name here
            // Set our taxonomy term filter, again, set the correct taxonomy name
            $tax_query = [
                [
                    'taxonomy' => 'CUSTOM_TAXONOMY_NAME',
                    'terms' => $referrer,
                    'include_children' => false,
                ]
            ];
            $q->set( 'tax_query', $tax_query );
            $q->set( 'post_type', ['post', 'YOUR_CUSTOM_POST_TYPE'] ); // Adds custom post type to date archives
        }
    }
}, PHP_MAX_INT );

BEACHTEN:

Der größte Teil des obigen Codes ist nicht getestet, daher ist er möglicherweise fehlerhaft. Außerdem erfordert der Großteil des Codes PHP5.4 +. Dies sollte die Mindestversion von PHP sein, die Sie installiert haben, da alle älteren Versionen EOL'ed und wird daher nicht mehr unterstützt. Obwohl sie noch funktionieren, erhalten sie keine Sicherheitsupdates. Dies kann die allgemeine Sicherheit Ihrer Site ernsthaft beeinträchtigen

1
Pieter Goosen