it-swarm.com.de

Sortieren Sie Beiträge nach Tags auf Kategorieseiten

Ich möchte Beiträge nach Tags in Kategorien und Archivseiten sortieren. (Leider gibt es keinen orderby-Parameter für Tags. Das würde die Sache so einfach machen!)

Eine Kategorieseite würde also so aussehen:

Kategoriename

  • Beitrag 1 (Tag 1)
  • Beitrag 2 (Tag 1)
  • Beitrag 3 (Tag 1)
  • Beitrag 4 (Tag 2)
  • Beitrag 5 (Tag 2)
  • Beitrag 6 (Tag 2)
  • Beitrag 7 (Tag 3)
  • Beitrag 8 (Tag 3)
  • Beitrag 9 (Tag 3) ...

Oder noch besser:

Kategoriename

Tag 1

  • Post 1
  • Post 2
  • Beitrag 3

Tag 2

  • Beitrag 4
  • Post 5
  • Post 6

Tag 3

  • Beitrag 7
  • Beitrag 8
  • Beitrag 9 ...

Die Tags werden in alphabetischer Reihenfolge angezeigt. Die Beiträge unter den Tags werden ebenfalls in alphabetischer Reihenfolge angezeigt.

Wenn ein Beitrag mehr als ein Tag hat, muss er mehrmals erscheinen (eines für jedes Tag).

Gibt es eine Möglichkeit, das zu tun?

Ich habe überlegt, etwas zu tun wie dies , aber ich konnte keine Lösung finden, die nur die Posts und Tags in der Kategorie anzeigt. (Der verknüpfte Code zeigt alle Beiträge und Tags.)

Oder gibt es eine Möglichkeit, Tags als meta_value zu behandeln? Dann könnte ich einfach pre_get_posts wie folgt verwenden:

add_action( 'pre_get_posts', 'archive_post_order'); 

function archive_post_order($query){
    if(is_archive()):
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'metakey', 'tag' );
        $query->set( 'order', 'ASC' );
    endif;    
}

Irgendwelche Ideen sind willkommen. Danke im Voraus.

3
Argumentum

Es gibt wirklich keinen vernünftigen Weg, um dies zu erreichen, insbesondere wenn Sie Posts haben, die mehr als einem Tag zugeordnet sind (was fast immer der Fall ist). Was sehr sicher ist, Sie haben Ihre Arbeit für Sie ausgeschnitten.

Hier sind einige Gedanken und Ideen, die Sie verfolgen können:

POSTS MIT MEHREREN BEGRIFFEN

Wenn Posts mehr als ein Tag (oder ein anderer Begriff) zugewiesen wurde, bedeutet dies, dass es mehr als eine Beziehung zu einem anderen Post oder einer Reihe von Posts gibt. ein). Sei unmöglichohneVervielfältigung, oder (b). Möglich sein,mitDuplikation von Beiträgen.

Die Begriffe (Tags in diesem Fall), die einem Beitrag aus einer bestimmten Taxonomie (post_tag in diesem Fall) zugewiesen wurden, werden in einer bestimmten Reihenfolge angeordnet, wenn mehr als ein Begriff vorhanden ist. Das einfache Aufrufen des ersten Terms ist möglicherweise nicht immer der Begriff, den Sie verwenden möchten.

Das Sortieren von Tags nach get_the_tags() (oder der allgemeineren get_the_terms()) erfordert eine zusätzliche PHP Sortierung, um das zurückgegebene Array des Tag-Objekts nach Ihren Anforderungen zu sortieren, oder Sie möchten eine Funktion wie verwenden wp_get_post_tags(), um die Sortierung über SQL durchzuführen, aber es würde einen zusätzlichen DB-Aufruf erfordern.

Wenn Sie nur nach dem ersten Tag sortieren möchten, ist es ganz einfach, das Tag-Array nach Suite oder Bedarf zu sortieren. Ich werde später einen Beispielcode posten

WORKAROUND

Wenn Sie Posts mit mehreren Tags haben, müssen Sie eine bestimmte eindeutige Beziehung zwischen Posts finden, und dementsprechend müssen Sie entweder:

  • weisen Sie einer Gruppe von Beiträgen ein benutzerdefiniertes Feld mit einem sortierbaren Wert zu und sortieren Sie Ihre Kategorieseiten mit pre_get_posts nach dem Wert des benutzerdefinierten Felds

  • erstellen Sie hierfür eine bestimmte Taxonomie, weisen Sie einer Reihe von Posts einen speziellen Begriff zu und sortieren Sie die zurückgegebenen Posts mithilfe des Filters the_posts, den ich veröffentlichen werde

Wenn es Ihnen nichts ausmacht, nach dem Duplizieren etwas zu tun zu haben, sehen Sie sich this post an. Dies wurde jedoch für benutzerdefinierte Felder durchgeführt, sodass Sie es aufschlüsseln und modifizieren müssen, um mit Tags zu arbeiten, aber im Wesentlichen das Prinzip Wenn Sie ein multidimentionales Array erstellen, reduzieren Sie es später und geben Sie dann ein sortiertes Array mit doppelten Beiträgen zurück

POSTS MIT EINZELNEN TAGS

Wenn Sie Beiträge nur einem Tag zugewiesen haben (oder Sie sortieren gerne nur nach dem ersten Tag), können Sie die Beiträge mithilfe des Filters the_posts ganz einfach entsprechend sortieren. Sie können dann Folgendes versuchen (UNTESTED und sehr einfach)

add_filter( 'the_posts', function ( $posts, \WP_Query $q )
{
    // Make sure we only target the main query on category pages
    if (    !is_admin()
         && $q->is_main_query()
         && $q->is_category()
    ) {
        // Use usort to sort the posts
        usort( $posts, function( $a, $b )
        {
            return strcasecmp( 
                get_the_tags( $a->ID )[0]->name, 
                get_the_tags( $b->ID )[0]->name 
            );
        });
    }
}, 10, 2 );
2
Pieter Goosen