Verwandle eine URL in eine Anhang / Post-ID

Gibt es eine Möglichkeit, eine URL eines Bildes zu nehmen und den Anhang oder die Beitrags-ID dieses Bildes in der database zu finden?

Hier ist die Situation:

Ich gehe in einer Schleife über alle ‘img’-Tags, die von’ a’-Tags in meinem Post-Inhalt umgeben sind. Wenn das Attribut src des Tags ‘img’ nicht mit dem Attribut href des äußeren Tags ‘a’ übereinstimmt, möchte ich das Tag ‘img’ ersetzen. Wenn das “img”, das entfernt werden soll, in der Galerie ist, möchte ich diesen Beitrag löschen und dann meinen Ersatz ‘img’ an seine Stelle setzen. Ich habe versucht, eine function wie folgt zu verwenden:

function find_image_post_id($url) { global $wpdb; $postid = $wpdb->get_var($wpdb->prepare("SELECT DISTINCT ID FROM $wpdb->posts WHERE guid='$url'")); if ($postid) { return $postid; } return false; } 

Dies ist offensichtlich nicht richtig, weil die Guid ironischerweise nicht global einzigartig ist. Ich hatte (früher im gleichen Skript) eine Datei mit dem gleichen Namen hochgeladen (warum? Weil es eine höhere Auflösung war und ich versuche, niedrig aufgetriggerse Versionen desselben Bildes zu ersetzen) und obwohl WordPress das Bild unter einem anderen Namen speichert Das Verzeichnis, die GUIDs, waren gleich. (möglicherweise ein Fehler).

Gibt es eine andere Technik, die ich benutzen kann?

Solutions Collecting From Web of "Verwandle eine URL in eine Anhang / Post-ID"

Eine stark verbesserte function, die für plug-schweres Bild entwickelt wurde:

 if ( ! function_exists( 'get_attachment_id' ) ) { /** * Get the Attachment ID for a given image URL. * * @link http://wordpress.stackexchange.com/a/7094 * * @param string $url * * @return boolean|integer */ function get_attachment_id( $url ) { $dir = wp_upload_dir(); // baseurl never has a trailing slash if ( false === strpos( $url, $dir['baseurl'] . '/' ) ) { // URL points to a place outside of upload directory return false; } $file = basename( $url ); $query = array( 'post_type' => 'attachment', 'fields' => 'ids', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $file, 'compare' => 'LIKE', ), ) ); // query attachments $ids = get_posts( $query ); if ( ! empty( $ids ) ) { foreach ( $ids as $id ) { // first entry of returned array is the URL if ( $url === array_shift( wp_get_attachment_image_src( $id, 'full' ) ) ) return $id; } } $query['meta_query'][0]['key'] = '_wp_attachment_metadata'; // query attachments again $ids = get_posts( $query ); if ( empty( $ids) ) return false; foreach ( $ids as $id ) { $meta = wp_get_attachment_metadata( $id ); foreach ( $meta['sizes'] as $size => $values ) { if ( $values['file'] === $file && $url === array_shift( wp_get_attachment_image_src( $id, $size ) ) ) return $id; } } return false; } } 

All diese komplexen functionen können auf eine einfache function reduziert werden:

attachment_url_to_postid ()

Sie müssen nur die Bild-URL analysieren, um die Anhangs-ID abzurufen:

 $attachment_id = attachment_url_to_postid( $image_url ); echo $attachment_id; 

Das ist alles was du brauchst.

Ich habe den Code von Rarst geändert, damit Sie nur den Dateinamen anstelle des vollständigen Pfads angeben können. Dies ist hilfreich, wenn Sie das Bild seitlich laden möchten, wenn es nicht existiert. Derzeit funktioniert das nur, wenn Dateinamen eindeutig sind, aber ich werde später einen Hash-Check hinzufügen, um mit Bildern zu helfen, die denselben Dateinamen haben.

 function get_attachment_id( $url, $ignore_path = false ) { if ( ! $ignore_path ) { $dir = wp_upload_dir(); $dir = trailingslashit($dir['baseurl']); if( false === strpos( $url, $dir ) ) return false; } $file = basename($url); $query = array( 'post_type' => 'attachment', 'fields' => 'ids', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $file, 'compare' => 'LIKE', ) ) ); $ids = get_posts( $query ); foreach( $ids as $id ) { $match = array_shift( wp_get_attachment_image_src($id, 'full') ); if( $url == $match || ( $ignore_path && strstr( $match, $file ) ) ) return $id; } $query['meta_query'][0]['key'] = '_wp_attachment_metadata'; $ids = get_posts( $query ); foreach( $ids as $id ) { $meta = wp_get_attachment_metadata($id); foreach( $meta['sizes'] as $size => $values ) { if( $values['file'] == $file && ( $ignore_path || $url == array_shift( wp_get_attachment_image_src($id, $size) ) ) ) return $id; } } return false; } 

Ok, ich habe die Antwort gefunden, die niemand im Netz hat, nach der ich seit Tagen gesucht habe. In meinem WP_Customize_Image_Control() funktioniert das nur, wenn Ihr Theme oder Plugin das WP_Customize_Image_Control() wenn Sie WP_Customize_Media_Control() das get_theme_mod() die ID und nicht die URL get_theme_mod() .

Für meine Lösung habe ich die neuere Version WP_Customize_Image_Control()

Viele Beiträge in den Foren haben get_attachment_id() was nicht mehr funktioniert. Ich habe attachment_url_to_postid()

Hier ist, wie ich es geschafft habe. Hoffe, das hilft jemandem da draußen

 // This is getting the image / url $feature1 = get_theme_mod('feature_image_1'); // This is getting the post id $feature1_id = attachment_url_to_postid($feature1); // This is getting the alt text from the image that is set in the media area $image1_alt = get_post_meta( $feature1_id, '_wp_attachment_image_alt', true ); 

Markierung

 < ?php echo $image1_alt; ?>