একটি URL সংযুক্তি / পোস্ট আইডিতে রূপান্তর করুন


32

আমি কোনও চিত্রের একটি ইউআরএল গ্রহণ করতে এবং ডাটাবেসে সেই চিত্রটির সংযুক্তি বা পোস্ট আইডি খুঁজে পেতে পারি কি কোনও উপায় আছে?

পরিস্থিতি এখানে:

আমি আমার পোস্টের সামগ্রীতে 'এ' ট্যাগ দ্বারা ঘিরে থাকা সমস্ত 'আইএমজি' ট্যাগগুলি দেখতে পাচ্ছি। যদি 'img' ট্যাগের src বৈশিষ্ট্যটি বাইরের 'এ' ট্যাগের 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;
}

দৃশ্যত এটি সঠিক নয় কারণ গাইডটি বিশ্বব্যাপী অনন্য নয়। আমি (আগে একই স্ক্রিপ্টে) একই নামের সাথে একটি ফাইল আপলোড করেছি (কেন? কারণ এটি উচ্চতর রেজোলিউশন ছিল এবং আমি একই চিত্রের কম রেজোলিউশন সংস্করণ প্রতিস্থাপনের চেষ্টা করছি) এবং যদিও ওয়ার্ডপ্রেস চিত্রটি একটি আলাদা নামের সাথে সংরক্ষণ করবে ডিরেক্টরি, নির্দেশিকা একই হতে সেট করা হয়েছিল। (সম্ভবত একটি বাগ)

আমি ব্যবহার করতে পারেন অন্য কৌশল আছে?


আপনি আপনার ইউআরএল অনুসারে অনুরোধ ভেরিয়েবলগুলি স্থিরভাবে সেট করতে পারেন, WP_Query ইনস্ট্যান্টিয়েট করতে পারেন এবং এ থেকে তথ্যটি পেতে পারেন।
হ্যাক্রে

আপনি যদি আপনার প্রশ্ন আপডেট করতে এবং আপনার প্রতিস্থাপন করতে চান এমন URL গুলি অন্তর্ভুক্ত করে এমন আপনার HTML এর কয়েকটি উদাহরণ পোস্ট করতে পারেন তবে আমরা সেগুলি নিয়ে আলোচনা করতে পারি help
মাইকচিন্কেল

মাইক ঠিক আছে। আপনি যে বৃহত্তর চিত্রগুলি সংযোগ করছেন তা কি বাহ্যিক সাইটগুলিতে যুক্ত হচ্ছে? যদি তা না হয় তবে আপনি যখন নিজের পোস্টে ছবিটি যুক্ত করেন তখন কেবলমাত্র পুরো আকারটি চয়ন করতে হবে এবং এটির আর অর্থবোধ না করে যদি আপনার এটিকে কোথাও লিঙ্ক না করার বিকল্প থাকে।
সানচোথফাত

উত্তর:


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
@ স্টেফেনহরিস কারণ ইউআরএল চিত্রের যে কোনও আকারের দিকে ইঙ্গিত করতে পারে, যার সকলেরই আলাদা আলাদা ফাইলের নাম রয়েছে
রাস্ট

1
এটি দুর্দান্ত কাজ করে, তবে এখানে লক্ষ্য করার মতো বিষয় যে, ওয়ার্ডপ্রেস 4-এর পর থেকে এটির জন্য একটি বিল্ট ইন ফাংশন রয়েছে যা গ্যাব্রিয়েল অন্য উত্তরে উল্লিখিত হয়েছে। এটি ঠিক যেমনটি কাজ করে ঠিক তেমনভাবে।
ক্রিস রায়ে

2
@ ক্রিসআর যদি আপনি উত্সটি দেখেন তবে মূল ফাংশনটি কেবল চিত্রের আকারে চিত্রের আকারে কাজ করবে না।
রাস্ট

আমার মনে হয় বিল্ট ইন ওয়ার্ডপ্রেস ফাংশন আরও ভাল কাজ করে। এটি আমার প্রযোজনায় কাজ করেনি তবে স্টেজে কাজ করেছে (যার কোনও SSL শংসাপত্র নেই)। বিল্ট ইন ফাংশন (নীচে ইগো ইপস দ্বারা চিহ্নিত হিসাবে) উভয় পরিবেশে কাজ করে।
সৈয়দ প্রিয়ম

15

এই সমস্ত জটিল ফাংশনগুলি একটি সাধারণ কার্যক্রমে হ্রাস করা যেতে পারে:

attachment_url_to_postid ()

সংযুক্তি আইডিটি পুনরুদ্ধার করতে আপনাকে কেবল চিত্রের URL টি বিশ্লেষণ করতে হবে:

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

আপনার এটাই দরকার।


6
উল্লেখযোগ্যভাবে এটি চিত্রের আকারগুলিতে কাজ করবে না, মূল সংস্করণটি কেবল "মূল" সংযুক্ত ফাইল অনুসন্ধান করে।
রাস্ট

3

পুরো রাস্তার পরিবর্তে আপনাকে কেবল ফাইলের নামের সাথে মিলিয়ে দেওয়ার জন্য আমি রাস্টের কোডটি পরিবর্তন করেছি ified আপনি যদি ইমেজটির অস্তিত্ব না থেকে সাইডেলোড করতে চলেছেন তবে এটি সহায়ক। বর্তমানে এটি কেবলমাত্র যদি ফাইলের নামগুলি স্বতন্ত্র থাকে তবে কাজ করে তবে একই ফাইল নাম রয়েছে এমন চিত্রগুলির সাথে সহায়তা করতে আমি পরে একটি হ্যাশ চেক যুক্ত করব।

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()করে আইডি ফিরিয়ে দেবে যদি এটি ব্যবহার করে তবেই এটি কাজ করে রাখুন mine

আমার সমাধানের জন্য আমি আরও নতুন সংস্করণ ব্যবহার করছিলাম 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');

ডাব্লুপি ৪.০ এর পর থেকে তারা এমন একটি ফাংশন চালু করেছিল attachment_url_to_postid()যা আপনার মতো করেfind_image_post_id()

আপনার রেফারেন্সের জন্য দয়া করে এই url চেক করুন ।

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