Bir URL'yi Ek / Gönderi Kimliği'ne dönüştürün


32

Bir görüntünün URL'sini alıp veritabanında bu görüntünün ekini veya yayın kimliğini bulabilmemin bir yolu var mı?

İşte durum:

Gönderi içeriğindeki 'a' etiketleriyle çevrili tüm 'img' etiketlerinin üzerinden geçen bir döngü içindeyim. 'img' etiketinin src niteliği, dış 'a' etiketinin href niteliği ile eşleşmiyorsa, 'img' etiketini değiştirmek istiyorum. Bunu yaparken, kaldırılacak olan 'img' galerideyse, o yazıyı silmek istiyorum ve sonra yerine 'img' yerine yerleştirin. Böyle bir işlevi kullanmayı denedim:

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;
}

Bu görünüşte doğru değil çünkü kılavuz ironik bir şekilde küresel olarak benzersiz değil. (Aynı betiğin önceki bölümlerinde) aynı adı taşıyan bir dosya yükledim (neden? Çünkü daha yüksek çözünürlük ve aynı görüntünün düşük çözünürlüklü sürümlerini değiştirmeye çalışıyorum) ve wordpress görüntüyü farklı bir adla kaydederse de Rehber, rehberin aynı olması için ayarlandı. (muhtemelen bir böcek).

Kullanabileceğim başka bir teknik var mı?


İstek değişkenlerini URL'nize göre ayarlayabilir, WP_Query'yi örnekleyebilir ve ondan bilgi alabilirsiniz.
hakre

Sorunuzu güncelleyebilir ve değiştirmek istediğiniz URL’leri içeren HTML’nizin bazı örneklerini gönderebilirseniz bunları tartışabiliriz.
MikeSchinkel

Mike orada. Bağladığınız daha büyük resimler dış sitelerde mi? Değilse, resmi yazıya eklerken tam boyutu seçmeniz yeterlidir ve artık bir anlam ifade etmiyorsa, hiçbir yere bağlamak için bir seçeneğiniz yoktur.
sanchothefat

Yanıtlar:


30

Görüntülerde ağır eklenti için geliştirilmiş, geliştirilmiş fonksiyon:

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;
    }
}

1
Her iki sorgulamak neden açıklayabilir _wp_attached_fileve _wp_attachment_metadata?
Stephen Harris

3
@StephenHarris URL tüm farklı dosya isimleri var resmin boyutlarının tümünü işaret edebilir çünkü
Rarst

1
Bu harika çalışıyor, ancak burada WordPress 4'ten beri Gabriel tarafından başka bir cevapta belirtildiği gibi yapmak için yerleşik bir işlev olduğunu belirtmekte fayda var. Bu tam olarak aynı şekilde çalışır.
Chris Rae

2
@ChrisRae Kaynağa bakarsanız, çekirdek işlevi resim boyutları üzerinde çalışmayacak, sadece ana resim üzerinde çalışacaktır.
Rarst

WordPress yerleşik yerleşik işlevi daha iyi çalıştığını düşünüyorum. Bu benim prodüksiyonumda işe yaramadı ancak Staging (SSL sertifikası olmayan) üzerinde çalıştı. Yerleşik işlevi (aşağıda Ego Ipse tarafından belirtildiği gibi) her iki ortamda da çalışır.
Syed Priom

15

Tüm bu karmaşık fonksiyonlar tek bir basit fonksiyona indirgenebilir:

attachment_url_to_postid ()

Ek kimliğini almak için yalnızca resim URL’sini ayrıştırmanız gerekir:

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

Tek ihtiyacın olan bu.


6
Özellikle bu görüntü boyutları üzerinde çalışmayacak, çekirdek sürüm sadece "ana" ekli dosyayı arayacaktır.
Rarst

3

Rarst'ın kodunu tam yol yerine yalnızca dosya adıyla eşleştirmenize izin verdim. Bu, mevcut değilse, görüntüyü sideload yapmak üzereyseniz faydalıdır. Şu anda bu yalnızca dosya adları benzersizse çalışır, ancak daha sonra aynı dosya adına sahip resimlerle ilgili yardım almak için bir karma denetim ekleyeceğim.

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;
}

3

Tamam, günümüzde aradığım netlikte kimsenin olmadığı cevabını buldum. Temanızın veya eklenti kullanıyorsa bu sadece çalışır benimkinde tutun WP_Customize_Image_Control()kullandığınız takdirde url kimliği döndürür değil.WP_Customize_Media_Control()get_theme_mod()

Çözümüm için daha yeni sürümü kullanıyordum WP_Customize_Image_Control()

get_attachment_id()Artık çalışmayan forumlarda birçok yazı var . kullandımattachment_url_to_postid()

İşte bunu yapabildim. Umarım bu orada birine yardım eder

// 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 );

Biçimlendirme

<a href="<?php echo $feature1_url; ?>"><img class="img-responsive center-block" src="<?php echo $feature1; ?>" alt="<?php echo $image1_alt; ?>"></a>

0

İşte alternatif bir çözüm:

$image_url = get_field('main_image'); // in case of custom field usage
$image_id = attachment_url_to_postid($image_url);

// retrieve the thumbnail size of our image
$image_thumb = wp_get_attachment_image_src($image_id, 'thumbnail');

WP 4.0’dan bu yana attachment_url_to_postid(), sizinkilerinize benzer şekilde davranan bir işlevfind_image_post_id()

Lütfen referans için bu URL'yi kontrol edin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.