पोस्ट सामग्री से पहली छवि प्राप्त करें (जैसे: hotlinked छवियां)


10

मैं सीधे कोडेक्स से इस कोड का उपयोग कर रहा हूं ।

function echo_first_image ($postID)
{                   
    $args = array(
    'numberposts' => 1,
    'order'=> 'ASC',
    'post_mime_type' => 'image',
    'post_parent' => $postID,
    'post_status' => null,
    'post_type' => 'attachment'
    );

    $attachments = get_children( $args );

    //print_r($attachments);

    if ($attachments) {
        foreach($attachments as $attachment) {
            $image_attributes = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' )  ? wp_get_attachment_image_src( $attachment->ID, 'thumbnail' ) : wp_get_attachment_image_src( $attachment->ID, 'full' );

            echo '<img src="'.wp_get_attachment_thumb_url( $attachment->ID ).'" class="current">';

        }
    }
}

मैं इसे इस तरह लूप के भीतर कहता हूं echo_first_image ($post->ID);

फ़ंक्शन कॉल करता है, लेकिन कुछ भी आउटपुट नहीं मिलता है ... जहां तक ​​मैं देख सकता हूं कि कुछ भी नहीं है $attachments

मैं जिस पोस्ट का उपयोग कर रहा हूं उसमें मेरी एक छवि है। यह केवल पोस्ट में चित्रित छवि या गैलरी नहीं है।

क्या मैं कुछ गलत कर रहा हूं, या क्या पहली बार में कोड में कुछ गड़बड़ है?

जवाबों:


22

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

में जोड़ने के functions.php :

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  $first_img = $matches [1] [0];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

फिर वह स्थान <?php echo catch_that_image() ?>जहां आप छवि प्रदर्शित करना चाहते हैं।

नोट: एक हॉटलिंक वाली छवि जिसे अभी आपकी सामग्री में रखा गया है, विशेष रुप से प्रदर्शित छवि के रूप में सेट नहीं की जा सकती है, एक bultin WordPress'feature।


हाँ, मैंने उस कोड को चारों ओर देखा है ... एक हैक की तरह लगता है, आपको लगता है कि वहाँ एक "वर्डप्रेस" तरीका होगा ... मुझे आश्चर्य है कि जब कोड आप कह सकते हैं कि मुझे preg_match का उपयोग करने की आवश्यकता क्यों है जैसा कि मैंने ऊपर पोस्ट किया है। यह मेरा सवाल वास्तव में ईमानदार होना है। क्या वह कोड जिसे मैंने गलत पोस्ट किया है? ... और-तो वास्तव में काम करने की कोशिश कर रहा है। लेकिन धन्यवाद मैं इस का उपयोग करने के लिए समाप्त हो सकता है। मुझे यह समझ में नहीं आया कि "आपकी सामग्री में रखी गई एक छवि को चुनिंदा छवि के रूप में सेट नहीं किया जा सकता है"। क्या यह किसी तरह से इस पर प्रभाव डालता है। मैं केवल पोस्ट से पहली छवि प्रदर्शित करने की कोशिश कर रहा हूं, न कि चित्रित छवि।
बायरानसगुर

आपकी पोस्ट / पृष्ठ सामग्री के अंदर एक छवि लिंक रखने और एक छवि संलग्न करने के बीच एक बड़ा अंतर है। आप किसी चित्र को प्रदर्शित किए बिना संलग्न कर सकते हैं। कोडेक्स उदाहरण आपके पोस्ट / पेज से जुड़ी एक फ़ाइल प्राप्त करने के बारे में है, जिससे लिंक करके अंदर रखी गई छवि प्राप्त करने का कोई तरीका नहीं है, हॉटलाइनिंग भी ऐसी सुविधा नहीं है, जिसमें WP PHP के साथ काम करेगा।
डायना

कोडेक्स संदर्भ के बारे में: जैसा कि आप देख सकते हैं कि डॉक को फ़ंक्शन नाम के बाद कहा जाता है get_childre, एक अनुलग्नक एक बच्चों की पोस्ट है इसलिए यह उदाहरण केवल संलग्न सामग्री के लिए काम कर सकता है।
डायना

हां मुझे पता है कि मैं किसी चित्र को सम्मिलित किए बिना संलग्न कर सकता हूं, वह बिट स्पष्ट है ... लेकिन मैं यह नहीं देखता कि आप इसे संलग्न किए बिना किसी छवि को कैसे सम्मिलित कर सकते हैं ... जब मैं अपलोड / सम्मिलित करता हूं, तो अपने कंप्यूटर से फ़ाइल अपलोड करें और पोस्ट में डालें और अपडेट करें फिर मीडिया लाइब्रेरी में जाएं यह मुझे बताता है कि मैंने जो छवि अपलोड की है वह पोस्ट से "संलग्न" है? ... या हम यहाँ शब्दार्थ की बात कर रहे हैं क्योंकि मैं समझता हूँ कि आप उस कोड के बारे में क्या कह रहे हैं जो केवल संलग्न चित्रों के लिए काम कर रहा है।
बायरानसगुर

1
आप कहीं भी एक इमेज फाइल को हॉटलिंक कर सकते हैं। इंसर्ट इमेज / मीडिया पर क्लिक करते समय, एक टैब "URL से" होता है, जहां आप एक छवि URL, यानी इमेजशेक सेवा को सूचित करते हैं। रेगेक्स इस छवि ("जैसा है") को प्राप्त करने में सक्षम होगा, लेकिन WP उदाहरण के लिए, इस छवि को फीचर्ड छवि के रूप में उपयोग करने में सक्षम नहीं होगा।
डायना

3

मैं दो तरीके सुझाता हूं:

एक प्लगइन का उपयोग करना

मैं गेट द इमेज प्लगइन का उपयोग करने पर विचार करूंगा , ताकि आप कुछ ऐसा कर सकें:

$args = array(
    'post_id' => <id>
    'image_scan' => true
);
get_the_image($args);

इस क्रम में उपरोक्त बातें करने की कोशिश करेंगे:

  1. थंबनेल के लिए पोस्ट देखें
  2. पहले संलग्न छवि के लिए देखें
  3. सम्मिलित छवि के लिए पोस्ट सामग्री को स्कैन करें।

अपनी थीम में बिल्डिंग सपोर्ट

हालाँकि, मैं एक प्लगइन में एक फ़ंक्शन का उपयोग कर रहा हूं जो ऊपर दी गई सूची के पहले दो आइटमों को लागू करता है।

function gpi_find_image_id($post_id) {
    if (!$img_id = get_post_thumbnail_id ($post_id)) {
        $attachments = get_children(array(
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'numberposts' => 1,
            'post_mime_type' => 'image'
        ));
        if (is_array($attachments)) foreach ($attachments as $a)
            $img_id = $a->ID;
    }
    if ($img_id)
        return $img_id;
    return false;
}

आप इसे डायना के स्निपेट के भीतर तीसरे आइटम से मिलान करने के लिए अनुकूलित कर सकते हैं:

function find_img_src($post) {
    if (!$img = gpi_find_image_id($post->ID))
        if ($img = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches))
            $img = $matches[1][0];
    if (is_int($img)) {
        $img = wp_get_attachment_image_src($img);
        $img = $img[0];
    }
    return $img;
}

बस इन दो कार्यों को अपनी functions.phpफ़ाइल में चिपकाएँ और उन्हें लूप में उपयोग करें:

<?php while (have_posts()) : the_post(); ?>
    <?php if ($img_src = find_img_src($post) : ?>
        <img src="<?php echo $img_src; ?>" />
    <?php endif; ?>
<?php endwhile; ?>

थीम व्यावसायिक रूप से बिक्री के लिए है इसलिए मैं अंत उपयोगकर्ता को यह नहीं बताना चाहता कि उन्हें एक प्लगइन स्थापित करना है, लेकिन धन्यवाद।
बायरनसगुर

@byronyasgur ने स्पष्ट करने के लिए उत्तर दिया कि मैंने आपको दो समाधान दिए हैं। दूसरे का अनुसरण करने के लिए आपको एक प्लगइन स्थापित करने की आवश्यकता नहीं है।
vmassuchetto

2

कोड पूरी तरह से सुरक्षित लगता है। जैसे आपने कहा, आपके पास पोस्ट से जुड़ी कोई छवि नहीं है ।

मीडिया व्यवस्थापक पैनल पर जाने पर विचार करें और उस पोस्ट पर एक छवि संलग्न करें।

वैकल्पिक रूप से, इसमें छवियों के लिए regex के साथ पोस्ट सामग्री को स्क्रैप करें।


क्या मुझे इस बात की गलतफहमी है कि "संलग्न" का क्या मतलब है? .... पोस्ट में मेरी एक छवि है ... जब आप 'ऐड टू पोस्ट' पर क्लिक करते हैं तो क्या यह संलग्न नहीं है?
बायरानसगुर

1
आपके प्रश्न से, ऐसा लगता था कि आपने HTML कोड को टाइप किया है, जो जरूरी नहीं कि wp द्वारा संलग्न की गई छवि से जुड़ा हो।
pcarvalho

1

मैं समझता हूं कि यह बहुत पुराना सवाल है, लेकिन मैं अपना जवाब यहां दे रहा हूं क्योंकि ज्यादातर मतदान का जवाब उन लोगों के लिए उपयुक्त नहीं है जो PHP में नए हैं।

preg_match PHP में HTML को पार्स करने के लिए एक अच्छा तरीका नहीं है क्योंकि preg_match नियमित अभिव्यक्ति के लिए है और HTML नियमित अभिव्यक्ति नहीं है।

हम इसके बजाय DOM का उपयोग कर सकते हैं।

function firstImg($html){
  $dom = new DOMDocument;
  $dom->loadHTML($html);
  $images = $dom->getElementsByTagName('img');
  foreach ($images as $image) {
    return $image->getAttribute('src');
  }
  return false;
}

DOM का उपयोग करना वास्तव में अच्छा है क्योंकि आप केवल पहली छवि प्राप्त करने के अलावा और भी बहुत कुछ कर सकते हैं और यह html को पार्स करने का सही तरीका है।

काश मैं पहली छवि प्राप्त करने के लिए वर्डप्रेस फ़ंक्शंस (CODEX और कोर से फ़ंक्शन) का उपयोग करने के लिए जवाब डाल सकता हूं, लेकिन यह भी समस्या है कि मैं किसके साथ काम कर रहा हूं।

यह हर मामले का जवाब नहीं है!

छवि आकार अनुकूलन के मामले पर विचार करें। उस स्थिति में, आप केवल इस कोड का उपयोग नहीं कर सकते क्योंकि पोस्ट में किसी भी आकार की छवि हो सकती है।


0

यह कोड मेरे लिए काम करता है:

function get_first_image( $post_id ) {
    $attach = get_children( array(
        'post_parent'    => $post_id,
        'post_type'      => 'attachment',
        'post_mime_type' => 'image',
        'order'          => 'DESC',
        'numberposts'    => 1
    ) );
    if( is_array( $attach ) && is_object( current( $attach ) ) ) {
        return current( $attach )->guid;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.