মিডিয়া_সিডেলোড_আইমেজে () আপলোড করার পরে _ চিত্র_ইড পান


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, তবে এইচটিএমএল চিত্রটি উপস্থাপন করছে। আমি কীভাবে এটি পেতে পারি 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
যদি এটি আপনার প্রশ্নের উত্তর দেয় আপনি কি এটি সঠিক হিসাবে চিহ্নিত করতে পারেন?
টম জে নোয়েল

আমি আপনার ইংরেজি পড়তে পারি না। কেউ এই পোস্টটি সম্পাদনা করতে পারে?
হাইডডি 3 এন

2
@ হাইডিডি 3 এন আমি কয়েকটি ইংরাজী ব্যবহার করা সহজ করেছি, এর কম পড়া বয়সের সাথে আরও সাধারণ শব্দ থাকতে হবে
টম জে নওয়েল

6

আমি ইউআরএল দ্বারা অনুসন্ধান করে ডিবি থেকে আইডি পেতে একটি ফাংশন তৈরি করেছি।

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

আপনি কোডেক্সে সেট করা চতুর্থ প্যারামেন্টার সহ ইউআরএল (এইচটিএমএল কোডের অন্তর্নিহিত) পেতে পারেন 'src' : মিডিয়া_সিডেলোএড_আইমেজ ()

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

5

পুরানো সমাধানগুলির আর দরকার নেই।

আপনি চতুর্থ প্যারামেন্টার সহ আইডি পেতে পারেন ($ প্রত্যাবর্তন) 'আইডি' এ সেট

<?php media_sideload_image($file, $post_id, $desc, $return); ?> 

https://codex.wordpress.org/Function_Reference/media_sideload_image


4

@ টম জে নওলের উত্তর স্পট রয়েছে। আমি এখানে অন্য একটি বিকল্প (বিভিন্ন ফাংশন ব্যবহার করে) ব্যাখ্যা করেছেন তবে আমি এটি আরও পছন্দ করি like

আমার ক্ষেত্রে আমার যে পোস্টটি সন্নিবেশ করতে চাইছে তার সাথে আমার একটি পোস্টের অ্যারে রয়েছে এবং মিডিয়াটির সাথে একটি পৃথক $ মিডিয়া (একই as এনআইডি কীগুলি $ পোস্টের মতো একই)। আমার কোডটি টমের মতো একই সমাধান তবে একটি বেনামি ফাংশনটি ব্যবহার করতে পুনরায় ব্যবহার করা হয়েছে:

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] এর পোস্টের বৈশিষ্ট্যযুক্ত চিত্র হতে হবে।

ওয়ার্ডপ্রেস শোল্ড অবশ্যই মিডিয়া_সিডেলোড_আইমেজ () পরিবর্তন করে যাতে এটি আইডি ফিরিয়ে দেয়। আসলে ফাংশনটি হাতে রয়েছে, উত্সটি এখানে দেখুন । আসলে এটির জন্য একটি ট্র্যাকের টিকিট রয়েছে এবং আপনি চাইলে মাঝামাঝি সময়ে এটি আপনার কোরটিতে প্রয়োগ করার জন্য তাদের কাছে প্যাচও রয়েছে।


দেখে মনে হচ্ছে এটি 4.8 তে প্যাচ করতে চলেছে
টম

3

আমি একটি সমাধান খুঁজছিলাম এবং media_sideload_image()খুব সোজা ছিল যার কোডটি দেখার সিদ্ধান্ত নিয়েছিলাম । এটি media_handle_sideload()আমাদের সংযুক্তি দেয় যা ব্যবহার করে id

আমি idচিত্রটির এইচটিএমএল উত্সের পরিবর্তে সংযুক্তিটি ফিরিয়ে দিতে এটিকে সংশোধন করেছি এবং এটি নতুন ফাইলের নাম প্রেরণের জন্য একটি উপায়ও যুক্ত করেছি।

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.