it-swarm.com.de

Listen Sie mithilfe von URL-Parametern Posts aus der Kategorie und der benutzerdefinierten Taxonomie auf

Zum Beispiel listet http://example.com/?cat=6&tag=books Posts auf, die zur Kategorie ID 6 gehören, und markiert 'books' (d. H. Posts, die beide Bedingungen erfüllen).

In ähnlicher Weise macht http://example.com/feed/?cat=6&tag=books dasselbe für Feeds.

Nehmen wir nun an, mein Blog enthält eine benutzerdefinierte Taxonomie namens "edition" mit den Begriffen "usa", "uk", "china" und so weiter. Die URL http://example.com/?edition=usa,china listet Beiträge auf, die zu den Editionen 'usa' und 'china' gehören.

Und http://example.com/category/cars/?edition=usa listet die Posts aus der Kategorie 'Cars' die auch zu dem benutzerdefinierten Taxonomiebegriff 'usa' gehören.

Das Problem

Ich benutze den folgenden Code in meiner functions.php:

add_filter('pre_get_posts','better_editions_archive');
function better_editions_archive( $better_editions_query ) {

    /* Looks like this line needs to be changed, not sure how */
    if ( $better_editions_query->is_tax( 'edition' ) && $better_editions_query->is_main_query() ) {

        $better_editions_terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
        $better_editions_query->set( 'post_type', array( 'post' ) );
        $better_editions_query->set( 'tax_query',
            array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'edition',
                    'field' => 'id',
                    'terms' => $better_editions_terms,
                    'operator' => 'NOT IN'
                )
            )
        );

    }

    return $better_editions_query;
}

Der Code stellt sicher, dass ein Beitrag, der keinem Edition zugewiesen ist (dh, wenn ein Beitrag keinem Begriff zugeordnet ist, der zur benutzerdefinierten Taxonomie 'edition' gehört), unter allen Begriffen angezeigt/aufgelistet wird Archive/Feeds der benutzerdefinierten Taxonomie 'Edition'.

Jetzt listet http://example.com/category/cars/?edition=usa nur Posts auf, die zur Kategorie 'cars' und speziell markiert 'usa' gehören (ein Begriff, der zur benutzerdefinierten Taxonomie 'edition' gehört). Es werden keine Posts angezeigt, die keinem Begriff in der benutzerdefinierten Taxonomie "Edition" zugewiesen sind. Wie behebe ich das?

( PS: Standardbegriffe für Posts festlegen ist keine Option, da wir später möglicherweise weitere Editionen hinzufügen.)


Gelöst aber ...

Ich habe eine Lösung ausgearbeitet, die Sie als Antwort auf diese Frage sehen können. Das Kopfgeld steht noch, also fühlen Sie sich frei. :)

4
its_me

Unter normalen Umständen können Sie mithilfe von URL-Parametern Posts auflisten, die zu einer bestimmten Kategorie UND einer benutzerdefinierten Taxonomie gehören, z.

http://example.com/category/cars/?edition=usa

Wobei category die Kategoriebasis ist, die Sie für Kategorien auf Ihrer Site verwenden (WordPress Dashboard> Einstellungen> Permalinks> Kategoriebasis); edition ist die Basis/Schnecke der benutzerdefinierten Taxonomie; und usa ist ein Begriff in der benutzerdefinierten Taxonomie.

Wenn Sie mehr als eine Kategorie/benutzerdefinierte Taxonomie einbeziehen möchten, können die folgenden Punkte hilfreich sein:

http://example.com/category/cars/?edition=usa,india
http://example.com/?category_name=cars,books&edition=usa,india

Und Feeds:

http://example.com/category/cars/?edition=usa,india&feed=rss2
http://example.com/?category_name=cars,books&edition=usa,india&feed=rss2

Weiterführende Literatur:


ABER...

Wie in meiner Frage erläutert, handelt es sich bei meiner um einen komplexen Fall, daher habe ich eine einfache Problemumgehung entwickelt. Hier geht...

  1. Der Codeblock in der Frage stellt sicher, dass ein Beitrag, der keiner Edition zugeordnet ist (dh, wenn ein Beitrag keinem Begriff zugeordnet ist, der zur benutzerdefinierten Taxonomie 'edition' gehört), unter allen Termarchiven angezeigt/aufgelistet wird/Feeds der benutzerdefinierten Taxonomie 'Edition'.

    ABER JETZT , ich habe diesen Code entfernt. Anschließend wurde unter der benutzerdefinierten Taxonomie "edition" ein neuer Begriff mit dem Namen "intl" (International) erstellt. Jeder Beitrag, der unter allen Editions angezeigt werden soll, wird 'intl' zugewiesen. Aber wie stelle ich sicher, dass alle Posts, die 'intl' zugewiesen sind, in allen Termarchiven/Feeds meiner benutzerdefinierten Taxonomie angezeigt werden?

    Dafür benutze ich jetzt diesen Code (geht in functions.php):

    add_filter('pre_get_posts','better_editions_archive');
    function better_editions_archive( $query ) {
        if ( $query->is_tax( 'edition' ) && $query->is_main_query() ) {
            $query->set( 'post_type', array( 'post' ) );
            $query->set( 'tax_query',
                array(
                    'relation' => 'OR',
                    array(
                        'taxonomy' => 'edition',
                        'field' => 'slug',
                        'terms' => 'intl',
                        'operator' => 'IN'
                    )
                )
            );
        }
        return $query;
    }
    

    So listet beispielsweise http://example.com/edition/usa/ Posts auf, die entweder zu 'usa' oder 'intl' gehören (Begriffe, die unter meiner benutzerdefinierten Taxonomie 'edition' stehen). Sein Feed http://example.com/edition/usa/feed/ macht dasselbe.

  2. Zurück zum Hauptproblem der Frage. Wie liste ich Posts auf, die zu einer bestimmten Kategorie UND einer Edition gehören, und benutze dabei URL-Parameter?

    Wie liste ich beispielsweise Posts auf, die zur Kategorie "Autos" UND zur Edition "USA" gehören?

    So sollte die URL aussehen: http://example.com/category/cars/?edition=usa,intl (da wir auch die Posts haben möchten, die unter allen Editionen angezeigt werden, d. H. Die Posts, die dem Begriff 'intl' zugewiesen sind). Wie für Feeds: http://example.com/category/cars/feed/?edition=india,intl

Das ist es!

(Besonderer Dank geht an @kaiser für seine Hilfe.)


Anmerkungen

Wenn Sie die Hauptabfrage/Schleife direkt in der Vorlage ändern möchten, z. taxonomy-edition.php (in meinem Fall), hier ein Beispiel, wie es gemacht werden kann:

<?php
$edition_term = get_term( get_queried_object(), 'edition' )->slug;
$better_editions = new WP_Query(
    array(
        'post_type' => 'post',
        'tax_query' => array(
            array(
                'taxonomy' => 'edition',
                'field' => 'slug',
                'terms' => array( $edition_term, 'intl' )
            )
        )
    )
);
?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php if ( $better_editions->have_posts() ) : ?>

    <?php /* Start the Loop */ ?>
    <?php while ( $better_editions->have_posts() ) : $better_editions->the_post(); ?>
        <?php get_template_part( 'content', get_post_format() ); ?>
    <?php endwhile; wp_reset_postdata(); ?>

<?php else : ?>

    <?php /* Blah, Blah, Blah! */ ?>

<?php endif; ?>

Trotzdem, es sei denn, Sie müssen wirklich, wirklich mit pre_get_posts gehen.

3
its_me