WordPress: Wenn das Sortierkriterium an letzter Stelle im Beitragstitel steht

organ whistle 411515 1920
Bildquelle: Pixabay, gewa

Eine Netzwerkpartnerin betreut seit langer Zeit ein WordPress-Projekt auf dem unter anderem eine Seite mit einer Liste der Mitarbeiter geführt wurde. Enthalten waren Positionen, Kontaktdaten und je ein (floatendes) Bild pro Person. Das alles auf einer Seite war für den Kunden nicht angenehm zu editieren. Da das Blog bisher nicht genutzt worden war, hatte sie die Idee, pro Mitarbeiter einen Beitrag anzulegen und der Kategorie «team» zuzuordnen. Der Name war der Beitragstitel, und die Sortierung sollte alphabetisch erfolgen. Die Herausfordung daran war, dass eine Sortierung per Nachname gewünscht war, der aber im Beitragstitel zuletzt kam.

Unsere Umsetzung bestand darin, aus dem Beitragstitel via explode (an Leerzeichen) ein Array zu generieren, von diesem mit end den letzten Wert zu extrahieren und automatisch in einem Custom Field zu speichern. Dieses wählten wir dann als Sortierkriterium aus.

Nachfolgende Funktion befüllt das Custom Field, sortmeta (sofern dieses leer ist, um ggf. auch eine manuelle Kontrolle über die Sortierung zuzulassen).

function pptf_add_field_tosort ( $post_id ) {
    $title = get_the_title( $post_id );
    $pieces = explode(' ',$title);
    $field = end($pieces);
    $post_meta = get_post_meta( $post_id, 'sortmeta', true );
    if ( empty( $post_meta ) ) update_post_meta( $post_id, 'sortmeta', $field  );
}
add_action( 'save_post', 'pptf_add_field_tosort', 100, 2);

Das Feld wird übrigens auch dann befüllt, wenn man in der Übersichtsliste der Beiträge die Stapelverarbeitung für Bearbeiten aktiviert, und einfach alle Posts (neu) speichert.

Hier wird abgefragt, ob wir uns in der Kategorie team befinden, und wenn ja, der Query modfiziert und die Sortierung über das benutzerdefinierte Feld angewendet.

function pptf_loop_the_cat($query) {
    if ( is_admin() || !$query->is_main_query() )
        return;

    if ( $query->is_category('team') ) {
        $queried_object = $query->get_queried_object();
        $term = $queried_object->term_id;
        $query->set( 'posts_per_page', -1 );
        $query->set( 'cat', $term );
        $query->set( 'meta_key', 'sortmeta' );
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'order', 'ASC' );
    }
}
add_action( 'pre_get_posts', 'pptf_loop_the_cat' );

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable