it-swarm.com.de

Überprüfen Sie, ob der aktuelle Begriff ein untergeordnetes Element eines anderen Begriffs ist

Ich versuche, eine Archivvorlage zu erstellen, die nur für Unterkategorien eines bestimmten Begriffs gilt. Meine Struktur sieht ungefähr so ​​aus:

  • Ereignisse (Haupttaxonomie)
    • Messe
      • Unterkatze 1 anzeigen
      • Unterkatze 2 anzeigen
    • Andere Taxonomien

Ich möchte, dass Show subcat 1 und Show subcat 2 (und alle anderen Unterkategorien) dieselbe Archivvorlage erhalten. Dies ist einer meiner Versuche, der definitiv nicht funktioniert. Hier ist der Code aus meinem functions.php.

    add_filter( 'template_include', 'kd_event_subcategory_archive' );

    function kd_event_subcategory_archive( $template ) {
        $term = get_queried_object()->term_id;
        if ( $term->parent == 'tradeshow' ) {
            $event_subcat = locate_template( 'taxonomy-tradeshow-subcategory.php' );

            return $event_subcat;
        }

        return $template;
    }

Ich kann nicht herausfinden, wie ich richtig überprüfen kann, ob ein Begriff das Kind meines Ausdrucks tradeshow ist.

1
KreigD

Es gibt zwei Probleme, die Ihren Scheck vereitelt haben:

    $term = get_queried_object()->term_id;
    if ( $term->parent == 'tradeshow' ) {

Beginnen mit:

    $term = get_queried_object()->term_id;

Hier enthält $term die ID eines Begriffs, kein Begriffsobjekt. Nehmen wir an, dies ist Term Nummer 5, das Ergebnis ist:

    $term = 5;
    if ( $term->parent == 'tradeshow' ) {

Welches wird nicht funktionieren. $term ist eine Zahl, kein Objekt, also kannst du ->parent nicht darauf schreiben.

Das Update besteht darin, das abgefragte Objekt direkt zu verwenden:

    $term = get_queried_object();

Was uns zum nächsten Problem führt:

    if ( $term->parent == 'tradeshow' ) {

Das übergeordnete Element ist keine Zeichenfolge, sondern eine Term-ID. 0 Wenn es kein übergeordnetes Element gibt, ist dies die ID des übergeordneten Elements. Dies wird angezeigt, wenn WP_Term nachgeschlagen wird:

/**
 * ID of a term's parent term.
 *
 * @since 4.4.0
 * @var int
 */
public $parent = 0;

Sie müssen also die Messe-Laufzeit im Voraus erwerben, um die ID herauszufinden. In diesen Szenarien codieren Entwickler den Slug normalerweise nicht fest, sondern stellen stattdessen eine Einstellung bereit, die Begriffe auflistet und die ID als Option speichert, um diese Art der Suche zu vermeiden und die Flexibilität zu erhöhen

In diesem Fall können Sie jedoch die Funktion get_term_by verwenden, z.

$tradeshow = get_term_by('slug', 'tradeshow', 'events')

Dann mit:

$tradeshow->term_id === $term->parent

Probleme und Ratschläge

Dies sind zusätzliche Punkte, die ich erwähnen wollte und die nichts damit zu tun haben

Debuggen

Wenn Sie var_dump, einen Debugger oder ein anderes Tool verwenden, um den Inhalt von $term zu ermitteln, wurden diese Probleme aufgedeckt.

Darüber hinaus sind PHP Fehlerprotokolle voll von Warnungen und Hinweisen, die auf die if-Anweisung verweisen, wenn Sie versuchen, das Äquivalent von 5->parent zu tun, was für PHP keinen Sinn ergibt. Achten Sie auf Fehlerprotokolle. Ich würde empfehlen, das Query Monitor-Plugin zu verwenden, um unerwartete Warnungen auf einfache Weise abzufangen

Das abgefragte Objekt ist nicht immer ein Begriff

Dieser Code wird bei jedem Seitenaufruf ausgeführt:

add_filter( 'template_include', 'kd_event_subcategory_archive' );

function kd_event_subcategory_archive( $template ) {
    $term = get_queried_object()->term_id;
    if ( $term->parent == 'tradeshow' ) {

Was aber, wenn der Benutzer ein Datumsarchiv oder ein Autorenarchiv besucht? Jetzt läuft der Code trotzdem und erzeugt Fehler. Daher muss dieser Filter getestet werden, um zu überprüfen, ob sich der Benutzer in einem Taxonomiearchiv befindet und ob die Taxonomie übereinstimmt.

Es kann sich sogar um einen einzelnen Beitrag handeln. Wenn der Messe-Begriff eine Term-ID von 5 hat und Sie sich auf dem Beitrag oder der Seite mit der ID 5 befinden, wird ein Beitrag in einem Taxonomie-Archiv angezeigt.

Ich vermute jedoch, dass es einfacher wäre, eine separate Taxonomie zu verwenden.

https://codex.wordpress.org/Function_Reference/get_queried_object

  • wenn Sie sich in einem einzelnen Beitrag befinden, wird das Beitragsobjekt zurückgegeben
  • wenn Sie sich auf einer Seite befinden, wird das Seitenobjekt zurückgegeben
  • wenn Sie sich auf einer Archivseite befinden, wird das Objekt post type zurückgegeben
  • wenn Sie sich in einem Kategoriearchiv befinden, wird das Kategorieobjekt zurückgegeben
  • wenn Sie sich in einem Autorenarchiv befinden, wird das Autorenobjekt zurückgegeben
  • usw.
4
Tom J Nowell