Wp_insert_post () का उपयोग करते समय मैं छवि URL द्वारा एक चित्रित छवि (थंबनेल) कैसे सेट करूं?


61

Wp_insert_post () के लिए फंक्शन रेफरेंस एंट्री के माध्यम से देखते हुए , मैंने देखा कि सरणी में ऐसा कोई पैरामीटर नहीं है, जिसके लिए मुझे किसी पोस्ट के लिए 'फीचर्ड इमेज' सेट करने की अनुमति होगी, जो पोस्ट के रूप में मेरी थीम में प्रदर्शित हो ।

मैंने श्री_ बेनेट द्वारा सुझाए गए set_post_thumbnail () जैसे फ़ंक्शंस में देखा है , लेकिन यह वर्डप्रेस और वर्डप्रेस कोडेक्स के लिए अपेक्षाकृत नया जोड़ प्रतीत होता है। जैसे, कोई भी स्रोत नहीं है जो मुझे मिल सके जो समझाते हैं कि $ थंबनेल_आईडी पैरामीटर को कैसे अधिग्रहित और आपूर्ति किया जाना चाहिए। यदि यह वास्तव में उपयोग करने का कार्य है, तो मैं इसे एक मान्य $ थंबनेल_id पैरामीटर के साथ कैसे प्रदान कर सकता हूं जब मेरे पास एक छवि URL है?

अग्रिम में धन्यवाद!

जवाबों:


107

जब आप अपने मीडिया लाइब्रेरी में होते हैं तो आप पोस्ट थंबनेल के रूप में एक छवि सेट कर सकते हैं। अपने मीडिया लाइब्रेरी में एक छवि जोड़ने के लिए आपको इसे अपने सर्वर पर अपलोड करने की आवश्यकता है। वर्डप्रेस में पहले से ही आपके मीडिया लाइब्रेरी में चित्र डालने का एक फ़ंक्शन है, आपको केवल एक स्क्रिप्ट की आवश्यकता है जो आपकी फ़ाइल अपलोड करती है।

उपयोग:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

समारोह:

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
      $file = $upload_dir['path'] . '/' . $filename;
    else
      $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


संपादित करें: पथ निर्माण जोड़ा गया

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


आपके प्रयासों के लिए धन्यवाद! यह केवल $ upload_dir ['basedir'] (पथ के बजाय) का उपयोग करते हुए काम करता है, क्योंकि जब मैं पोस्ट एडिट इंटरफ़ेस के माध्यम से अनुलग्नक का निरीक्षण करता हूं तो इसे ... / अपलोड / FILENAME.EXT के रूप में $ upload_dir 'पथ' के रूप में संदर्भित किया जाता है। ] इसे कुछ इस तरह संग्रहित करेगा ... / अपलोड / 2012/02 / FILENAME.EXT। यह किसी भी तरह से बदलने के लिए बेहतर हो सकता है कि फ़ाइल को कैसे संदर्भित किया जाता है, लेकिन मुझे नहीं पता होगा कि कैसे।
क्रिस

1
मेरे जवाब में पथ निर्माण जोड़ा गया।
रोब वर्मियर

अपनी त्वरित प्रतिक्रिया की सराहना करें :)। हालाँकि मुझे अभी भी वही परिणाम मिलता है, यहाँ एक स्क्रीनशॉट मेरी समस्या प्रदर्शित कर रहा है: i.imgur.com/iKTNs.png । ऊपरी खंड आपके सशर्त में प्रतिध्वनित होने का परिणाम है, बस यह देखने के लिए कि क्या चल रहा है।
क्रिस

इसे फिर से बदला, wp_insert_attachment और wp_generate_attachment_metadata के लिए पूरा रास्ता नहीं दिया। आशा है कि यह समस्या को हल करेगा।
राब वर्मियर

1
चेतावनी: यह उत्तर फ़ाइल को फिर से लिखता है यदि उसका समान नाम है, तो सावधान रहें। इसे $ post_id या कम से कम uniqid () का उपयोग करके नाम उत्पन्न करना चाहिए
इवान कास्टेलानोस

10

प्रयोग करके देखें set_post_thumbnail()

ओटो द्वारा संपादित करें: आपने अपना प्रश्न स्पष्ट किया है, इसलिए मैं दी गई प्रतिक्रिया को स्पष्ट कर दूंगा।

मूल रूप से, आपको पोस्ट के लिए 'अटैचमेंट' भी बनाना होगा। जब एक छवि को वर्डप्रेस मीडिया लाइब्रेरी में अपलोड किया जाता है, तो एक विशेष प्रकार का पोस्ट प्रविष्टि इसके लिए पोस्ट प्रकार के अनुलग्नक के साथ किया जाता है। यह अनुलग्नक post_parent पहचानकर्ता के माध्यम से कुछ विशिष्ट पोस्ट से जुड़ा हुआ है।

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

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

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

Wp_insert_attachment का उपयोग करने के तरीके के बारे में अधिक जानकारी कोडेक्स (ऊपर लिंक) में पाई जा सकती है।


आपके जवाब के लिए धन्यवाद! हालांकि, मैं थंबनेल आईडी कैसे प्राप्त करूंगा? मैं एक छवि URL के साथ शुरुआत कर रहा हूं, इसलिए मुझे लगता है कि मुझे किसी अन्य फ़ंक्शन का उपयोग करके किसी छवि को वर्डप्रेस लाइब्रेरी में जोड़ना चाहिए?
क्रिस

जैसा कि आप पहले से ही एक पोस्ट डाल रहे हैं , मैंने मान लिया था कि आप जिस पोस्ट को डाल रहे हैं , उसमें पहले से ही इमेज अटैच कर रहे थे । क्या यह मान्य धारणा नहीं है?
चिप बेनेट

क्षमा करें, लेकिन मुझे अभी तक यह पता नहीं चला है कि URL द्वारा पोस्ट में वास्तव में चित्र कैसे संलग्न करें। इसके अलावा, मैं नहीं चाहूंगा कि छवि वास्तव में पोस्ट में ही प्रदर्शित हो। मैं वर्तमान में उस फ़ंक्शन की तलाश कर रहा हूं, जो $ थंबनेल_id को लौटा देगा, और उसने सोचा कि शायद wp_insert_attachment () काम करेगा, जब तक कि मैंने यह नहीं देखा कि पहले से ही अपलोड डायरेक्टरी में अटैचमेंट की आवश्यकता है। मुझे नहीं पता कि इसके URL द्वारा वहां एक छवि फ़ाइल कैसे प्राप्त की जाए, और मुझे यकीन नहीं है कि यह वह फ़ंक्शन है जिसे मैं पहली बार देख रहा हूं। आपके सहयोग के लिए धन्यवाद!
क्रिस

क्या आप इस जानकारी के साथ अपने प्रश्न को फिर से लिख सकते हैं , बेहतर ढंग से वर्णन करने के लिए कि आप क्या करने की कोशिश कर रहे हैं? (या, इसे एक के रूप में छोड़ दें, और एक नया प्रश्न शुरू करें, यह पूछने के लिए कि पोस्ट डालते समय अटैचमेंट आईडी कैसे प्राप्त करें?)
चिप बेनेट

मूल प्रश्न को संपादित किया गया है और आंशिक रूप से रीफ़्रेश किया गया है, कृपया वापस देखें :)।
क्रिस

9

मैं WP कोर फ़ंक्शंस का उपयोग करके Robs उत्तर में सुधार करना चाहता हूं download_urlऔरmedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $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 set_post_thumbnail( $post_id, $id );

}

1
वर्डप्रेस देशी कार्यों का उपयोग करना सबसे अच्छा अभ्यास है, धन्यवाद।
मुस्तफा सूफी

किसी कारण से, इस संस्करण ने मुझे यह कहते हुए त्रुटियाँ दीं कि "एक मान्य URL प्रदान नहीं किया गया था।" , जबकि रोब वर्मर के उत्तर ने काम किया।
17

3

set_post_thumbnail() इस आवश्यकता के लिए सबसे अच्छा कार्य है।

मुझे लगता है, आप के माध्यम से एक लगाव ID का पता लगा get_children()या get_posts()। परिणाम में एक सरणी है और इस सरणी के अंदर आईडी है। परीक्षण के लिए निम्न उदाहरण; मैं आशा करता हूँ यह काम करेगा; केवल खरोंच पर परीक्षण के बिना लिखें।

आपकी आवश्यकता के लिए यह महत्वपूर्ण है, कि आप get_the_ID()अपने साथ बदलें post-ID; अटैचमेंट की आईडी लौटाएं और आप फ़ॉथ का उपयोग कर सकते हैं set_post_thumbnail()

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}

3

बस यह पाया और इसे बहुत सरल बना दिया, काम करता है लेकिन मैं कोई सुरक्षा रंडी नहीं हूँ

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

सरल या क्या? सही फाइलें मिलने के बाद, वर्डप्रेस मीडिया को हैंडल करेगा और अपलोड करेगा, फिर उसे थंबनेल के रूप में सेट करें।

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