প্রোগ্রামযুক্তভাবে বাইরে থেকে কাস্টম পোস্টে বৈশিষ্ট্যযুক্ত চিত্রটি কীভাবে সেট করবেন


13

আমি পিএইচপি এর মাধ্যমে কাস্টম পোস্টে ওয়ার্ডপ্রেস পরিবেশের বাইরে চিত্রগুলি আনার এবং সন্নিবেশ করার চেষ্টা করছি।

ওয়ার্ডপ্রেসের মতো সেই চিত্রটি কীভাবে ওয়ার্ডপ্রেস আপলোড ডিরেক্টরি বছরের তারিখের ফোল্ডার ফর্ম্যাটে স্থানান্তরিত / আপলোড করবেন এবং সেই চিত্রটি কাস্টম পোস্টের বিপরীতে বৈশিষ্ট্যযুক্ত চিত্রটিতে সেট করবেন?

এছাড়াও কাস্টম পোস্ট গ্যালারীতে ছবি আপলোড করবেন?

নীচে আমার কোড দেওয়া আছে

$filename = $image['name'];
$target_path = "../wp-content/uploads/";
$target_path = $target_path . $filename;
$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
    'guid' => $wp_upload_dir['baseurl'] . '/' . basename( $filename ),
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
    'post_content' => '',
    'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $attachment, $target_path, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
set_post_thumbnail( $post_id, $attach_id );

আমি আমার আপলোড ডিরেক্টরিতে ছবিটি আপলোড করতে পরিচালিত করেছি তবে বছর এবং তারিখ ফোল্ডারটি তৈরি করতে পারিনি। এটি এখানে কোন WP ফাংশন ??

উত্তর:


27

মিডিয়া_সিডেলোড_আইমেজ () দিয়ে কেবল এটি করা যায় না ?

বেশ সহজ মনে হচ্ছে। কেবল ক্যাচ হ'ল যদি আপনি অ্যাডমিন অঞ্চলে না থাকেন তবে আপনাকে অবশ্যই ওয়ার্ডপ্রেসের মধ্যে থাকা কয়েকটি লাইব্রেরি অন্তর্ভুক্ত করতে হবে:

// only need these if performing outside of admin environment
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

// example image
$image = 'http://example.com/logo.png';

// magic sideload image returns an HTML image, not an ID
$media = media_sideload_image($image, $post_id);

// therefore we must find it so we can set it as featured ID
if(!empty($media) && !is_wp_error($media)){
    $args = array(
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'post_status' => 'any',
        'post_parent' => $post_id
    );

    // reference new image to set as featured
    $attachments = get_posts($args);

    if(isset($attachments) && is_array($attachments)){
        foreach($attachments as $attachment){
            // grab source of full size images (so no 300x150 nonsense in path)
            $image = wp_get_attachment_image_src($attachment->ID, 'full');
            // determine if in the $media image we created, the string of the URL exists
            if(strpos($media, $image[0]) !== false){
                // if so, we found our image. set it as thumbnail
                set_post_thumbnail($post_id, $attachment->ID);
                // only want one image
                break;
            }
        }
    }
}

1
এই সমাধানটি কবজ (y) এর মতো কাজ করে
ওমর তারিক

আমি এই কোডটি কোথায় যুক্ত করতে পারি?
er.irfankhan11

1
ওয়ার্ডপ্রেস 4.8 এর হিসাবে আপনি চতুর্থ প্যারামিটার সেট করতে পারেন media_sideload_imageথেকে 'id'এবং এটি নতুন সংযুক্তি আইডি ফিরে আসবেন। যেমন:$new_att_id = media_sideload_image($image, $post_id, "image description...", 'id'); if(!is_wp_error($new_att_id)) { set_post_thumbnail($post_id, $new_att_id); }
ডন উইলসন

1

কোনও পাথ এবং পোস্ট আইডি ব্যবহার করে আপলোড করার এই ব্যাখ্যাটি ব্যবহার করে দেখুন

কোডটি এখানে (উত্তরাধিকারের জন্য):

/* Import media from url
 *
 * @param string $file_url URL of the existing file from the original site
 * @param int $post_id The post ID of the post to which the imported media is to be     attached
 *
 * @return boolean True on success, false on failure
 */

function fetch_media($file_url, $post_id) {
require_once(ABSPATH . 'wp-load.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
global $wpdb;

if(!$post_id) {
    return false;
}

//directory to import to    
$artDir = 'wp-content/uploads/2013/06';

//if the directory doesn't exist, create it 
if(!file_exists(ABSPATH.$artDir)) {
    mkdir(ABSPATH.$artDir);
}

//rename the file
$ext = array_pop(explode("/", $file_url));
$new_filename = 'blogmedia-'.$ext;

if (@fclose(@fopen($file_url, "r"))) { //make sure the file actually exists
    copy($file_url, ABSPATH.$artDir.$new_filename);


    $siteurl = get_option('siteurl');
    $file_info = getimagesize(ABSPATH.$artDir.$new_filename);

    //create an array of attachment data to insert into wp_posts table
    $artdata = array();
    $artdata = array(
        'post_author' => 1, 
        'post_date' => current_time('mysql'),
        'post_date_gmt' => current_time('mysql'),
        'post_title' => $new_filename, 
        'post_status' => 'inherit',
        'comment_status' => 'closed',
        'ping_status' => 'closed',
        'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)),                                            'post_modified' => current_time('mysql'),
        'post_modified_gmt' => current_time('mysql'),
        'post_parent' => $post_id,
        'post_type' => 'attachment',
        'guid' => $siteurl.'/'.$artDir.$new_filename,
        'post_mime_type' => $file_info['mime'],
        'post_excerpt' => '',
        'post_content' => ''
    );

    $uploads = wp_upload_dir();
            $save_path = $uploads['basedir'].'/2013/06/'.$new_filename;

    //insert the database record
    $attach_id = wp_insert_attachment( $artdata, $save_path, $post_id );

    //generate metadata and thumbnails
    if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) {
        wp_update_attachment_metadata($attach_id, $attach_data);
    }

    //optional make it the featured image of the post it's attached to
    $rows_affected = $wpdb->insert($wpdb->prefix.'postmeta', array('post_id' => $post_id, 'meta_key' => '_thumbnail_id', 'meta_value' => $attach_id));
}
else {
    return false;
}

return true;
}

1

দয়া করে নিম্নলিখিত কোডটি উল্লেখ করুন যা বৈশিষ্ট্যযুক্ত চিত্রটি প্রোগ্রামগতভাবে সেট করে। http://www.pearlbells.co.uk/code-snippets/set-featured-image-wordpress-programmatically/

function setFeaturedImages() {

$base = dirname(__FILE__);
$imgfile= $base.DS.'images'.DS.'14'.DS.'Ascot_Anthracite-Grey-1.jpg';
$filename = basename($imgfile);
$upload_file = wp_upload_bits($filename, null, file_get_contents($imgfile));
if (!$upload_file['error']) {
    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_parent' => 0,
        'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], 209 );

if (!is_wp_error($attachment_id)) {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    $attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
    wp_update_attachment_metadata( $attachment_id,  $attachment_data );
}

set_post_thumbnail( 209, $attachment_id );

}
}

0

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

আপনি যদি কেবল ওয়ার্ডপ্রেস অ্যাডমিন বিভাগে লগইন না করে ফাইলগুলি আপলোড করার চেষ্টা করেন, উদাহরণস্বরূপ কোনও বাহ্যিক সাইট থেকে ফাইলগুলি আপলোড করার জন্য আপনি এক্সএমএল-আরপিসি এপিআই এবং বিশেষত uploadFileপদ্ধতিটি দেখতে চান।

আরেকটি বিকল্প হতে পারে নিজে একটি মিনি এপিআই লিখতে। মূলত আপনি যা করতে চান তা হ'ল:

  1. আপলোডের মাধ্যমে সার্ভারে ফাইলটি পান (বা একটি নির্দিষ্ট ইউআরএল থেকে এটি ডাউনলোড করার জন্য সার্ভার পেয়ে যাচ্ছেন)।
  2. ব্যবহার করুন wp_upload_dir()আপলোড ডিরেক্টরির পাথ পেতে এবং sanitize_file_name()পাথ গঠন করা এবং তার ফলে অবস্থান ফাইলটি লিখতে।
  3. wp_insert_attachment()ডাটাবেসে সংযুক্তি সঞ্চয় করতে ব্যবহার করুন ( wp_check_filetype()সেটিংসের জন্য সহায়ক হবে post_mime_type)। আপনার পছন্দ মত ptionচ্ছিকভাবে সেটও করুন post_parentএবং _thumbnail_idমেটা কী।
  4. আপনার API বাহ্যিক ব্যবহারকারীদের কাছে প্রকাশ করুন, বা প্রয়োজন অনুসারে লগইন করুন। আপনি যদি সর্বজনীন ফর্মটি খুব কম ব্যবহার করেন wp_create_nonce()এবং wp_verify_nonce()ফর্মটিকে আরও কিছুটা সুরক্ষিত করতে ব্যবহার করেন ।

আমি একটি অ্যাপ্লিকেশন জন্য একটি ওয়েব পরিষেবা লিখছি। অ্যাপ্লিকেশন আমাকে একটি ফাইল অ্যারে প্রেরণ করবে যার মাধ্যমে আমি পোস্ট ডেটা এবং চিত্র সন্নিবেশ করতে চাই যা আমি ডাটাবেসে পোস্টের বিবরণ সন্নিবেশ করিয়েছি তবে চিত্রের অংশে আটকেছি।
ফয়সাল শেহজাদ

ডকুমেন্টেশনের জন্য যাচাই করুন wp_insert_attachment(), আপনার যা প্রয়োজন তা আমার মনে করা উচিত it আপনি যদি যা করছেন তবে আমি ম্যানুয়ালি ওয়ার্ডপ্রেসের বাইরে ডাটাবেসটি সংশোধন করতে নিরুৎসাহিত করব। পরিবর্তে, কেবল ওয়ার্ডপ্রেস উত্সটি দেখুন এবং পোস্ট ডেটা যুক্ত করার জন্য, ফাইল আপলোডগুলি পরিচালনা করতে এবং সংযুক্তিগুলি সন্নিবেশ করার জন্য দায়ী অংশগুলি সনাক্ত করার চেষ্টা করুন। অন্য কথায়, আমি আমার উত্তরটিতে যে রূপরেখা দেখিয়েছিলাম তা অনেকটাই।
সাইমন

@ সিমন আমারও একই সমস্যা আছে। আপনি আপলোড করতে চাইবার আরেকটি কারণ হ'ল যখন আপনি বিভিন্ন ব্যাচের সাথে সংযুক্ত করতে চান এমন চিত্রগুলির একটি ব্যাচ কাজ থাকে এবং ম্যানুয়ালি তা না করে।
হাইটাটোডস্ট্রাকচার

1
@ হাইটাডোডস্ট্রাক্ট: অবশ্যই, আমি প্রায়শই এমন করি যে ডেটা স্থানান্তরিত করার সময় বিদ্যমান সাইটগুলি, উত্তরাধিকার ব্যবস্থা, ডাটাবেস রফতানি ইত্যাদি গঠন করে আমার বক্তব্যটি হ'ল আপনার স্ক্রিপ্ট লেখার চেয়ে আপনি সবসময় ওয়ার্ডপ্রেস মূল কার্যকারিতাটি কাজে লাগাতে চেষ্টা করা উচিত your ছবিগুলি সঠিক অবস্থানে রাখে এমন মালিকানা (যা আমি বুঝতে পারি যে বিষয়টি সম্পর্কে কিছুটা প্রসারিত ছিল)।
সাইমন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.