Möchte man mit seinem Plugin zwischen verschiedenen Blogs einer Multisite wechseln und dabei Daten zu Mediendateien abrufen, muss man derzeit einen Bug von 2013 berücksichtigen.
Für mein Plugin Externe Dateien in der Mediathek habe ich in den letzten Wochen vorbereitet, dass man bei einer Multisite-Installation Dateien aus beliebigen Quellen in den einzelnen Seiten verwenden kann. Auch kann man eine Mediathek für alle Seiten aktivieren. Und genau dabei stieß ich auf den folgenden Bug: https://core.trac.wordpress.org/ticket/25650
Der Bug
Das Problem entsteht, wenn man mit switch_to_blog() zu einem anderen Blog wechselt und anschließend z.B. mit attachment_url_to_postid() die ID einer URL abrufen will. In dem Fall erhält man keinerlei Ergebnis zurück, da der Blog-Wechsel nicht berücksichtigt wird.
Leider gibt es genau dafür seit 2013 keine Lösung. Im verlinkten Ticket ist nachzulesen, dass dies durchaus schwierig ist, weshalb ich mich nach Alternativen umgeschaut habe.
Meine Lösungen
Ich benötigte das Auslesen von Attachment IDs aus einem Blog an verschiedenen Stellen. Z.B. sollte ich mit attachment_url_to_postid() die Attachment ID einer URL erhalten. Das habe ich nun so gelöst:
$path = str_replace( trailingslashit( get_blogaddress_by_id( $blog_id ) ) . 'wp-content/uploads/', '', $url );
$query = array(
'post_type' => 'attachment',
'post_status' => 'any',
'meta_query' => array(
array(
'key' => '_wp_attached_file',
'value' => $path,
'compare' => '=',
),
),
);
$result = new WP_Query( $query );
D.h. ich ermittle die URL manuell durch eine direkte Datenbankabfrage.
In einem anderen Fall wollte ich mit wp_get_attachment_url() einfach nur die URL eines Attachments ermitteln. Meine Lösung hier:
$url = str_replace( ABSPATH, get_blogaddress_by_id( $blog_id ), (string) get_attached_file( $post->ID ) );
Und ja, get_attached_file() liefert interessanterweise trotz des Bugs das richtige Ergebnis.
Fazit
Ja, es gibt Bugs in WordPress. Und ja, es wird an diesen gearbeitet. Manchmal sind sie aber überaus komplex, was eine Lösung erschwert. Dank der Struktur von WordPress gibt es aber für vieles auch alternative Wege die man gehen kann.
