Media_sideload_image () के साथ अपलोड करने के बाद $ image_id प्राप्त करें


10

मैं एक छवि अपलोड करना चाहता हूं और इसे एक पोस्ट में चित्रित छवि के रूप में सेट करना चाहता हूं। मैंने कोशिश की यह क्या था:

$image_id = media_sideload_image($image_url, $post_id, $post_id);
update_post_meta($post_id, '_thumbnail_id', $image_id);

लेकिन media_sideload_image()वापस नहीं आ रहा है image_id, लेकिन html इमेज रेंडर करता है। मैं कैसे प्राप्त कर सकता हूं image_id?

जवाबों:


28

इस क्रिया / हुक का उपयोग करके इस सीमा को कैसे बायपास किया जाए इसका एक उदाहरण है:

function new_attachment( $att_id ){
    // the post this was sideloaded into is the attachments parent!

    // fetch the attachment post
    $att = get_post( $att_id );

    // grab it's parent
    $post_id = $att->post_parent;

    // set the featured post
    set_post_thumbnail( $post_id, $att_id );
}

// add the function above to catch the attachments creation
add_action('add_attachment','new_attachment');

// load the attachment from the URL
media_sideload_image($image_url, $post_id, $post_id);

// we have the image now, and the function above will have fired too setting the thumbnail ID in the process, so lets remove the hook so we don't cause any more trouble 
remove_action('add_attachment','new_attachment');

विचार यह है कि जब media_sideload_imageदौड़ा जाए, तो:

  • छवि डाउनलोड करता है
  • इसे अनुलग्नक के रूप में जोड़ता है (प्रकार का एक पद attachment)
  • फिर उस अनुलग्नक को उस पद के साथ संलग्न करता है जिसकी आईडी आपने प्रदान की थी ($ post_id)

आपका मुद्दा यह है कि यह नए बनाए गए अनुलग्नक पोस्ट आईडी प्रदान नहीं करता है।

लेकिन , जब कोई अनुलग्नक बनाया जाता है, तो एक कार्रवाई को निकाल दिया जाता है जिसमें उसकी आईडी होती है। अटैचमेंट बनाने से पहले हम इसे हुक कर सकते हैं, और फीचर्ड थंबनेल को हमारे द्वारा दी गई पोस्ट आईडी के साथ सेव कर सकते हैं, फिर बाद में अनहुक कर सकते हैं।


1
प्रतिभाशाली! इससे बहुत मदद मिली।
एम-टोरिन

2
यदि यह आपके प्रश्न का उत्तर देता है तो क्या आप इसे सही मान सकते हैं?
टॉम जम्मू नॉवेल

मैं आपकी अंग्रेजी नहीं पढ़ सकता। किसी ने इस पोस्ट को संपादित किया?
HiDd3N

2
@ HiDd3N मैं अंग्रेज़ी का इस्तेमाल किया है, यह एक कम पढ़ने उम्र के साथ और अधिक सामान्य शब्द होना चाहिए के कुछ सरल बना दिया है
टॉम जम्मू नॉवेल

6

मैंने DB से आईडी प्राप्त करने के लिए एक फ़ंक्शन का निर्माण किया है, URL द्वारा खोज।

function get_attachment_id_from_src ($image_src) {
  global $wpdb;
  $query = "SELECT ID FROM {$wpdb->posts} WHERE guid='$image_src'";
  $id = $wpdb->get_var($query);
  return $id;
}

आप Codex: media_sideload_age () के लिए सेट किए गए चौथे पैरामेंटर के साथ URL (html कोड का 'src' इंस्टेंट) प्राप्त कर सकते हैं

$src = media_sideload_image($url, $item_id, $desc,'src');
get_attachment_id_from_src($src);


4

@ टॉम जे नोवेल का जवाब हाजिर है। मुझे एक और विकल्प मिला (विभिन्न कार्यों का उपयोग करके) यहाँ समझाया गया लेकिन मुझे यह एक और पसंद है।

मेरे मामले में मेरे पास सभी पोस्टों के साथ $ पोस्ट की एक सरणी है, जिसे मैं सम्मिलित करना चाहता हूं और मीडिया के साथ एक अलग $ मीडिया ($ पोस्ट के समान $ nid कुंजी)। मेरा कोड टॉम के समान ही समाधान है लेकिन एक अनाम फ़ंक्शन का उपयोग करने के लिए फिर से बनाया गया है:

foreach( $posts as $nid=>$post )
    $posts[$nid]['ID'] = wp_insert_post( $post );

foreach( $posts as $nid=>$post )
    foreach( $media[$nid] as $m=>$mitem ) {

        if( 0 == $m ) add_action( 'add_attachment',
            function( $att_id ) use ($posts, $nid, $mitem) {
                update_post_meta($posts[$nid]['ID'], '_thumbnail_id', $att_id);
                $posts[$nid]['media_urls'][] = $mitem['url'];
            }
        );
        media_sideload_image($mitem['url'], $post['ID']);
        remove_all_actions( 'add_attachment' );
    }

मेरे मामले में मैं प्रत्येक $ मीडिया [$ nid] में 1 आइटम को मानता हूं, जो कि उसके पोस्ट की चित्रित छवि है।

वर्डप्रेस shouold मीडिया_sideload_image () को निश्चित रूप से बदल देता है, इसलिए यह $ id लौटाता है। वास्तव में फ़ंक्शन में यह हाथ में है, यहां स्रोत देखें । वास्तव में इसके लिए एक ट्रैक टिकट है और यदि आप चाहते हैं तो इस समय के दौरान इसे अपने मूल पर लागू करने के लिए उनके पास पैच भी हैं।


ऐसा लगता है कि यह 4.8
टॉम ऑगर

3

मैं एक समाधान की तलाश कर रहा था और उस कोड को देखने का फैसला किया media_sideload_image()जिसके लिए बहुत सीधा था। यह उपयोग करता है media_handle_sideload()जो हमें लगाव देता है id

मैंने idछवि के HTML स्रोत के बजाय अनुलग्नक को वापस करने के लिए इसे संशोधित किया , और यहां तक ​​कि इसे नया फ़ाइल नाम भेजने का एक तरीका भी जोड़ा।

function media_sideload_image_custom($file, $post_id, $desc = null, $file_name = null)
{
    if ( ! empty($file) ) {
        // Download file to temp location
        $tmp = download_url( $file );

        // fix file filename for query strings
        if( empty($file_name) ) { 
            preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
            $file_array['name'] = basename($matches[0]);
        } else {
            $file_array['name'] = sanitize_file_name($file_name);
        }
        $file_array['tmp_name'] = $tmp;

        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
            @unlink($file_array['tmp_name']);
            $file_array['tmp_name'] = '';
        }

        // do the validation and storage stuff
        $id = media_handle_sideload( $file_array, $post_id, $desc );

        // If error storing permanently, unlink
        if ( is_wp_error($id) ) {
            @unlink($file_array['tmp_name']);
        }
        return $id;
    }
    return null;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.