Benutzerdefinierte Post-Bestellung für einen benutzerdefinierten Beitragstyp

Ich brauche eine benutzerdefinierte WP-Abfrage, die eine Liste paginierter Seiten (benutzerdefinierter Post-Typ) in einer benutzerdefinierten Reihenfolge anzeigt.

Ich habe einen benutzerdefinierten Beitragstyp namens “Kurse” Ich habe einen benutzerdefinierten Beitragstyp namens “Ereignisse”

Der benutzerdefinierte Beitragstyp “Kurse” hat einen Metaschlüssel namens “course_id”. Der benutzerdefinierte Nachrichtentyp “events” hat einen Metaschlüssel namens “course_id”.

Momentan verwende ich Code wie den folgenden, um eine Liste von paginierten “Kursen” anzuzeigen.

$args = array( 'post_type'=> 'courses', 'order' => 'DESC' ); query_posts( $args ); // The Loop while ( have_posts() ) : the_post(); echo '
  • '; the_title(); echo '
  • '; endwhile; // Reset Query wp_reset_query();

    Was ich gerne tun könnte, ist, dieselbe Liste von Kursen anzuzeigen, aber basierend auf der Anzahl der zugehörigen “Ereignisse” geordnet.

    Beispiel:-

     Course A -> course_id = A01 Course B -> course_id = B01 Course C -> course_id = C01 Event 01 -> course_id = A01 Event 02 -> course_id = A01 Event 03 -> course_id = B01 Event 04 -> course_id = B01 Event 05 -> course_id = B01 Event 06 -> course_id = C01 

    Die benutzerdefinierte WP-Abfrage prüft jeden “Kurs” und jede Kurs-ID. Es wird dann die Anzahl der zugehörigen “Ereignisse” mit der Kurs-ID als eindeutiger Schlüssel zählen. Der Code würde dann die “Kurse” als ausgeben

     Course B Course A Course C 

    oder (wenn in aufsteigender Reihenfolge aufgelistet):

     Course C Course A Course B 

    Um Ihnen eine Vorstellung von der Größe zu geben, gibt es wahrscheinlich etwa 200 verschiedene “Kurse”. Jedem “Kurs” sind wahrscheinlich 20 – 200 “Ereignisse” zugeordnet.

    Solutions Collecting From Web of "Benutzerdefinierte Post-Bestellung für einen benutzerdefinierten Beitragstyp"

    Da nicht klar angegeben ist, wie (im Code) die “verwandten” CPTs miteinander verbunden sind, möchte ich eine meist übersehene Möglichkeit für CPTs veröffentlichen.

    Wenn Sie register_post_type() , haben Sie das Argument hierarchical , das auf true , um 'supports' => array( 'page-attributes' ) . Dies ermöglicht Ihnen dann, einen Auftrag manuell zu definieren.

    Bildbeschreibung hier eingeben

    Als erstes query_posts() nie query_posts() 🙂

    Was die Reihenfolge der Anzahl der Ereignisse anbelangt – dies könnte teuer geschehen, mit ein wenig angepasster SQL-Arbeit.

    Ein besserer und einfacherer Weg wäre die Erstellung eines anderen _event_count (zB _event_count – der Unterstrich verhindert, dass WordPress ihn automatisch anzeigt) für die Kurse, in denen die Anzahl der mit diesem Kurs verbundenen Ereignisse _event_count .

    Dies müsste “geschickt” aktualisiert werden, wenn ein Event aktualisiert wird: (zB ob sich die Kurs-ID geändert hat, ob der Kurs geändert wurde und der Kurs geändert wurde, um diese Änderung widerzuspiegeln).

    Sobald Sie das eingerichtet haben, können Sie nach dem Wert des _event_count .

    Sie können den _event_count mit update_post_meta erstellen / aktualisieren. Sie müssen sich an save_post (Überprüfung von Berechtigungen und Nonces etc.), Überprüfung des Post-Typs (Überprüfung eines Ereignisses) und schließlich, ob sich die Kurs-ID geändert hat oder nicht, anschließen:

    • update_post_meta
    • get_post_meta

    save_post Sie, dass die save_post abgefeuert wird, nachdem WordPress aktualisiert hat, dass benutzerdefinierte Felder aktualisiert wurden. Sie müssen also course_id in _course_id (wodurch es aus der _course_id der benutzerdefinierten Felder entfernt wird) und Ihre eigene Metabox erstellen und die Aktualisierung selbst _course_id .

    Ein allgemeines Beispiel zum Erstellen von metabox / update post meta finden Sie unter:

    Sie sollten Taxonomie, nicht ID Meta-Box verwenden, um zwischen 2 Post-Typen zu verknüpfen. Auch ich muss nicht mit der Antwort über mir über query_posts () übereinstimmen, Sie sollten es aber nur für die Hauptschleife verwenden, und nur einmal, überprüfen Sie den Codex.