Oder: was ihr schon immer über die native WordPress-Galerie wissen wolltet und nie zu fragen wagtet …
Problemstellung: Die native WordPress-Galerie in Kombination mit Attachment-Seiten ist wirklich smart, bis auf die Links zum jeweils nächsten Bild. Siehe z.B. auch hier: http://forum.wpde.org/allgemeines/15…rblaettern.html
Erklärung: Die previous_image- und next_image-Links, die WordPress out of Core zur Verfügung stellt, verlinken nur zum Bild mit der nächsthöheren bzw. nächstgeringeren ID, ohne Rücksicht darauf, ob und wo dieses Bild eingebunden ist.
Die native WordPress-Galerie funktioniert davon unabhängig und wird lediglich durch Eingabe der IDs im Galerie-Shortcode innerhalb des Beitrags gebildet. Verändern der Reihenfolge der IDs innerhalb des Shortcodes verändert die Reihenfolge der Bilder in der Galerie. Die Galerie als solche ist nicht eigenständig in der Datenbank gespeichert, sondern existiert nur als Shortcode im Postcontent.
Es geht also darum, die Galerie selber auszulesen und nicht irgendein Geschwurbel mit „ermittle die IDs aller Anhänge zum jeweiligen Post“. Das geht mit get_post_gallery() => siehe https://codex.wordpress.org/Function_Refer…et_post_gallery
Für die tatsächlichen Links (wenn man dann erstmal die IDs in der richtigen Galerie-Reihenfolge hat) hilft dann wp_get_attachment_link() => siehe https://codex.wordpress.org/Function_Refer…attachment_link
Ich binde den folgenden Codeschnipsel an passender Stelle in meine image.php ein:
<?php
if ( get_post_gallery( $post->post_parent ) ) :
$current_attachment_id = get_the_ID();
$gallery = get_post_gallery( $post->post_parent, false ); // Galerie holen, aber nicht ausgeben
$attachment_ids = explode( ",", $gallery['ids'] ); // ids auslesen
$count_total = count( $gallery['src'] ); // Gesamtzahl der Bilder in der Galerie ermitteln
$image_counter = 0; // definieren, dass man von vorne anfängt zu zählen
foreach( $attachment_ids as $id ) {
++ $image_counter; // bei jedem Attachment wird einen Wert weiter gezählt
if ($current_attachment_id == $id) { // wenn wir beim aktuellen Bild angelangt sind
echo $image_counter . " | " . $count_total; // diese Zeile ist noch so nebenbei mit herausgehüpft
if ( isset($attachment_ids[$image_counter -2])) { // Kontrolle, ob die ID existiert
$previous_image_id = $attachment_ids[$image_counter - 2]; ?>
<div>
<?php
echo wp_get_attachment_link( $previous_image_id, 'thumbnail', true );
echo wp_get_attachment_link( $previous_image_id, '', true, false, 'vorheriges Bild' );
?>
</div>
<?php
}
if ( isset($attachment_ids[$image_counter])) { // Kontrolle
$next_image_id = $attachment_ids[$image_counter]; // schon hochgezählt ?>
<div>
<?php
echo wp_get_attachment_link( $next_image_id, 'thumbnail', true );
echo wp_get_attachment_link( $next_image_id, '', true, false, 'nächstes Bild' );
?>
</div>
<?php
}
}
}
endif;
?>
Alles anzeigen
Die beiden if ( isset … -Abfragen sind zur Kontrolle für das erste und letzte Bild: der Versuch, einen Link zu einem Bild vor dem ersten Bild oder nach dem letzten Bild auszugeben, würde sonst eine Fehlermeldung produzieren. Man kann natürlich auch definieren, dass der Link dann vorwärts oder rückwärt „über Los“ geht …
Die previous- und next-Links habe ich dann jeweils doppelt ausgegeben, einmal als Thumbnail, einmal als Text. Sie sind hier jeweils zur Attachment-Seite, wp_get_attachment_link() kann aber auch einen Link zur Mediendatei ausgeben (default-Einstellung); Kombination von Thumbnail und Text kann die Funktion leider nicht, deswegen einmal Bild, einmal Text.
Erwähnte ich, dass ich gerne die Bordmittel zum Einsatz bringe?
Hoffe, ich kann ein bisschen für solche Ansätze begeistern …
Gruß
helix