Zu $loop = new WP_Query( $args );
:
Eine Query ist noch keine Loop. Die Loop ist erst eine Schleife durch die Ergebnisse der Query. Deshalb würde ich die Variable z.B. $query
nennen. 🤓
Bei $query = new WP_Query( $args );
ist
$query->posts[0]->ID
die ID des ersten Posts und
$query->posts[1]->ID
die ID des zweiten Posts.
Die kannst du in einem Array zusammenfassen:
$top = array( $query->posts[0]->ID, $query->posts[1]->ID );
Nun kannst du prüfen, ob in dem Array die ID des Teilnehmers vorhanden ist, der nicht auf den ersten beiden Plätzen der Liste erscheinen soll:
if( in_array( '42', $top ) ) { … }
Für den Fall, dass er dort auftaucht, kannst du das Array neu mischen:
if( in_array( '42', $top ) ) {
shuffle($query->posts);
}
Nun könnte das Mischen dafür sorgen, dass der Teilnehmer mit der ID 42 doch wieder auf den ersten beiden Plätzen landet. Das können wir dadurch umgehen, dass wir so lange mischen, bis sichergestellt ist, dass der Teilnehmer nicht mehr unter den ersten beiden ist:
while( in_array( '42', $top ) ) {
shuffle($query->posts);
}
In einem kleinen Test mit nur drei Teilnehmern (bei denen einer nach den Regeln der Wahrscheinlichkeitsrechnung sehr oft unter den obersten beiden ist) führte die while-Schleife allerdings zu erheblichen Performance-Problemen. Das Script mischt die Posts eben immer wieder neu. Wenn du eine größere Datenmenge hast, sinkt die Wahrscheinlichkeit, dass du den gleichen Teilnehmer beim Mischen immer wieder auf die ersten beiden Plätze setzt. Vermutlich wäre es aber geschickter, der Post aus dem Array auszuschneiden und mit array_splice()
an einer anderen, zufallsgenerierten Stelle wieder einzufügen.
Hier der Code nochmal an einem Stück:
$query = new WP_Query( $args );
$top = array( $query->posts[0]->ID, $query->posts[1]->ID );
while( in_array( '42', $top ) ) {
shuffle($query->posts);
}
// The Loop
if ( $query->have_posts() ) {
echo '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
} else {
echo '<strong>Keine Bücher gefunden</strong>';
}
Wie Hans-Gerd schon geschrieben hat, möchten wir hier Anwendungssupport anbieten, während für Fragen zur Programmierung WordPress Stackexchange der bessere Ort ist. Es würde auch den Rahmen sprengen, wenn wir hier PHP-Grundlagen (oder HTML, JavaScript, CSS, REACT usw.) vermitteln würden.
Viel Erfolg bei deinem Projekt.
Nachtrag:
Ich hab mir die Aufgabenstellung nochmal durchgelesen:
… haben wir einen Partner immer ausgeblendet und nun möchten wir …, dass ein anderer bestimmter Partner in der Liste niemals als erster oder zweiter aufscheint
Das lässt sich auch lösen, in dem du den „bestimmten Partner“ ebenfalls aus der Query ausschließt, mit get_posts()
eine getrennte Abfrage des Posts dieses Partners machst und mit array_slice()
an einem zufälligen „Array-Index + 2“ einfügst. Das ist wahrscheinlich sauberer, als die while()
-Loop.
-
Diese Antwort wurde geändert vor 1 Jahr, 7 Monaten von Bego Mario Garde. Grund: Nachtrag