URL को अटैचमेंट / पोस्ट आईडी में बदल दें


32

क्या कोई तरीका है जो मैं किसी छवि का URL ले सकता हूं और डेटाबेस में उस छवि का अनुलग्नक या पोस्ट आईडी ढूंढ सकता हूं?

यहाँ स्थिति है:

मैं उन सभी 'img' टैग्स पर जा रहा हूं जो मेरी पोस्ट सामग्री में 'a' टैग से घिरे हैं। यदि 'img' टैग की src विशेषता बाहरी 'a' टैग के href विशेषता से मेल नहीं खाती है, तो मैं 'img' टैग को बदलना चाहता हूं। ऐसा करने के लिए, यदि हटाए जाने वाले 'img' को गैलरी में रखा गया है, तो मैं उस पोस्ट को हटाना चाहता हूं, और फिर उसके स्थान पर अपना प्रतिस्थापन 'img' रख दूंगा। मैंने इस तरह एक समारोह का उपयोग करने की कोशिश की:

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

यह स्पष्ट रूप से सही नहीं है क्योंकि गाइड विडंबना है कि विश्व स्तर पर अद्वितीय नहीं है। मेरे पास (उसी स्क्रिप्ट में पहले) एक ही नाम के साथ एक फ़ाइल अपलोड की गई थी (क्यों? क्योंकि यह उच्च रिज़ॉल्यूशन था और मैं एक ही छवि के कम रिज़ॉल्यूशन संस्करणों को बदलने की कोशिश कर रहा हूं) और हालांकि वर्डप्रेस एक अलग नाम के साथ छवि को बचाएगा। निर्देशिका, गाइड के समान होने के लिए निर्धारित किया गया था। (संभवतः एक बग)।

क्या कोई अन्य तकनीक है जिसका मैं उपयोग कर सकता हूं?


आप अपने URL के अनुसार अनुरोध चर चर सकते हैं, WP_Query को तुरंत कर सकते हैं और इससे जानकारी प्राप्त कर सकते हैं।
हकरे

यदि आप अपने प्रश्न को अपडेट कर सकते हैं और अपने HTML के कुछ उदाहरणों को पोस्ट कर सकते हैं तो उन URL को शामिल करें, जिन्हें आप बदलना चाहते हैं ताकि हम उन पर चर्चा कर सकें।
माइकस्किंकेल

माइक वहीं है। क्या आपके द्वारा बाहरी साइटों पर लिंक की जा रही बड़ी छवियां हैं? यदि नहीं, तो आपको केवल अपनी पोस्ट में छवि जोड़ने पर पूर्ण आकार चुनने की आवश्यकता है और आपके पास इसे कहीं भी लिंक न करने का विकल्प है यदि यह अब तक समझ में नहीं आता है।
sanchothefat

जवाबों:


30

छवियों पर भारी प्लगइन के लिए बड़े पैमाने पर सुधार समारोह विकसित:

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
क्या आप समझा सकते हैं कि आपने दोनों को क्वेरी क्यों _wp_attached_fileऔर _wp_attachment_metadata?
स्टीफन हैरिस

3
@StephenHarris क्योंकि URL किसी भी छवि के आकार को इंगित कर सकता है, जिसमें सभी के अलग-अलग फ़ाइल नाम हैं
Rarst

1
यह बहुत अच्छा काम करता है, लेकिन यहां यह ध्यान देने योग्य है कि, वर्डप्रेस 4 के बाद से, एक अन्य जवाब में गेब्रियल द्वारा वर्णित के रूप में इसे करने के लिए बनाया गया फ़ंक्शन है। यह ठीक उसी तरह से काम करता है जैसे यह करता है।
क्रिस राए

2
@ChrisRae यदि आप स्रोत को देखते हैं तो मुख्य फ़ंक्शन केवल मुख्य छवि पर छवि आकारों पर काम नहीं करेगा।
रारस्ट

मुझे लगता है कि वर्डप्रेस फ़ंक्शन में निर्मित बेहतर काम करता है। यह मेरे उत्पादन में काम नहीं आया लेकिन स्टेजिंग (जिसमें एसएसएल प्रमाणपत्र नहीं है) पर काम किया। बिल्ट इन फंक्शन (जैसा कि नीचे ईगो इप्स द्वारा बताया गया है) दोनों वातावरणों में काम करता है।
सैयद प्रॉम

15

उन सभी जटिल कार्यों को एक साधारण कार्य में घटाया जा सकता है:

attachment_url_to_postid ()

अनुलग्नक ID प्राप्त करने के लिए आपको केवल छवि URL पार्स करने की आवश्यकता है:

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

बस इतना ही चाहिए।


6
विशेष रूप से यह छवि आकारों पर काम नहीं करेगा, मुख्य संस्करण केवल "मुख्य" संलग्न फ़ाइल खोजता है।
रारस्ट

3

मैंने Rarst का कोड संशोधित किया ताकि आप पूर्ण पथ के बजाय केवल फ़ाइल नाम से मिलान कर सकें। यह मददगार है अगर आप इमेज को साइडलोड करने के बारे में हैं अगर यह मौजूद नहीं है। वर्तमान में यह केवल तभी काम करता है यदि फ़ाइल नाम अद्वितीय हैं, लेकिन मैं बाद में एक हैश चेक जोड़ूंगा जिसमें उन चित्रों के साथ मदद मिलेगी जिनके पास एक ही फ़ाइल नाम है।

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

ठीक है, मुझे जवाब मिला कि नेट पर कोई भी नहीं है जो मैं अब दिनों की तलाश में हूं। मेरा रखें कि यह तभी काम करता है अपने विषय या प्लगइन का उपयोग कर रहा WP_Customize_Image_Control()है, तो आप उपयोग कर रहे हैं और आईडी वापस आ जाएगी नहीं यूआरएल।WP_Customize_Media_Control()get_theme_mod()

मेरे समाधान के लिए मैं नए संस्करण का उपयोग कर रहा था WP_Customize_Image_Control()

मंचों पर बहुत सारे पोस्ट हैं get_attachment_id()जो अब काम नहीं करते हैं। मैंनें इस्तेमाल कियाattachment_url_to_postid()

यहाँ है कि मैं इसे कैसे कर पा रहा था। उम्मीद है कि इससे वहां किसी को मदद मिलेगी

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

मार्कअप

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

0

यहाँ एक वैकल्पिक समाधान है:

$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 के बाद से उन्होंने एक फंक्शन पेश किया जो attachment_url_to_postid()आपके लिए समान व्यवहार करता हैfind_image_post_id()

कृपया अपने संदर्भ के लिए इस url की जाँच करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.