আমি কাস্টম রাইট প্যানেলে সরাসরি কোনও চিত্র আপলোড ক্ষেত্র যুক্ত করতে পারি?


62

আমি ওয়ার্ডপ্রেস অ্যাডমিনে "পৃষ্ঠাগুলি" এর অধীনে একটি নতুন পৃষ্ঠা যুক্ত করেছি এবং বেশ কয়েকটি কাস্টম ক্ষেত্র যুক্ত করেছি। আমি পৃষ্ঠা সম্পাদকে কোনও আপলোড চিত্র ফিল্ড যুক্ত করতে সক্ষম হতে চাই - কাস্টম-ফিল্ডগুলির মাধ্যমে এটি করার কোনও উপায় আছে কি?

অথবা আমার যদি এই দক্ষতার প্রয়োজন হয় তবে আমার অন্য কোনও দিকনির্দেশনার প্রয়োজন?


টিডো-ফর্ম প্লাগইন পরীক্ষা করুন, সম্ভবত এটিই সহজ সমাধান
বেল্টেজ করুন

এই প্রশ্নের সম্ভবত সম্পর্কযুক্ত: wordpress.stackexchange.com/questions/4291/...
hakre

উত্তর:


108

যে কেউ ফাইল আপলোড সম্পর্কে আরও জানতে চান, এখানে প্রধান বিষয় এবং ব্যথার বিষয়গুলি সম্পর্কে একটি দ্রুত প্রাইমার রয়েছে। এটি লিনাক্স বাক্সটি মনে রেখে ওয়ার্ডপ্রেস with.০ সহ লেখা হয়েছে এবং কোডটি ধারণাগুলি শেখানোর জন্য কেবল একটি প্রাথমিক ধারণা রয়েছে view আমি নিশ্চিত যে এখানে কিছু লোক বাস্তবায়নের উন্নতির জন্য পরামর্শ দিতে পারে।

আপনার বেসিক পদ্ধতির রূপরেখা দিন

পোস্টগুলির সাথে চিত্রগুলি যুক্ত করার জন্য কমপক্ষে তিনটি উপায় রয়েছে: চিত্রের পাথ সংরক্ষণ করার জন্য একটি পোস্ট_মেটা ক্ষেত্র ব্যবহার করে, চিত্রের মিডিয়া লাইব্রেরি আইডি (পরে আরও) সংরক্ষণ করার জন্য একটি পোস্ট_মেটা ক্ষেত্র ব্যবহার করে, বা কোনও সংযুক্তি হিসাবে পোস্টটিতে চিত্রটি বরাদ্দ করা হয় । এই উদাহরণটি চিত্রের মিডিয়া লাইব্রেরি আইডি সঞ্চয় করতে একটি পোস্ট_মেটা ক্ষেত্র ব্যবহার করবে। YMMV।

মাল্টিপার্ট এনকোডিং

ডিফল্টরূপে, ওয়ার্ডপ্রেস তৈরি এবং সম্পাদনা ফর্মগুলির কোনও এনটাইপ নেই। আপনি যদি কোনও ফাইল আপলোড করতে চান তবে আপনাকে ফর্ম ট্যাগটিতে একটি "এনকাইটাইপ = 'মাল্টিপার্ট / ফর্ম-ডেটা" যুক্ত করতে হবে - অন্যথায় $ _ ফাইলগুলি সংগ্রহ একেবারেই ধাক্কা দেবে না। ওয়ার্ডপ্রেস 3.0.০ এ, এর জন্য একটি হুক রয়েছে। কিছু পূর্ববর্তী সংস্করণে (নির্দিষ্টকরণগুলির বিষয়ে নিশ্চিত নয়) আপনাকে ফর্ম ট্যাগটি প্রতিস্থাপন করতে হবে।

function xxxx_add_edit_form_multipart_encoding() {

    echo ' enctype="multipart/form-data"';

}
add_action('post_edit_form_tag', 'xxxx_add_edit_form_multipart_encoding');

মেটা বক্স এবং আপলোড ফিল্ড তৈরি করুন

আমি মেটা বাক্সগুলি তৈরি করতে বেশি দূরে যাব না আপনারা সম্ভবত বেশিরভাগ ইতিমধ্যে এটি কীভাবে করবেন তা জানেন তবে আমি কেবল এটিই বলব যে এটিতে একটি ফাইল ক্ষেত্র সহ আপনার কেবল একটি সাধারণ মেটা বক্স দরকার need নীচের উদাহরণে আমি বিদ্যমান চিত্রটি সন্ধান করার জন্য কিছু কোড অন্তর্ভুক্ত করেছি এবং যদি এটি বিদ্যমান থাকে তবে তা প্রদর্শন করব। আমি কিছু সাধারণ ত্রুটি / প্রতিক্রিয়া কার্যকারিতাও অন্তর্ভুক্ত করেছি যা পোস্ট_মেটা ক্ষেত্রটি ব্যবহার করে ত্রুটিগুলি পাস করে। আপনি WP_Error ক্লাসটি ব্যবহার করতে এটি পরিবর্তন করতে চান ... এটি কেবল প্রদর্শনের জন্য।

function xxxx_render_image_attachment_box($post) {

    // See if there's an existing image. (We're associating images with posts by saving the image's 'attachment id' as a post meta value)
    // Incidentally, this is also how you'd find any uploaded files for display on the frontend.
    $existing_image_id = get_post_meta($post->ID,'_xxxx_attached_image', true);
    if(is_numeric($existing_image_id)) {

        echo '<div>';
            $arr_existing_image = wp_get_attachment_image_src($existing_image_id, 'large');
            $existing_image_url = $arr_existing_image[0];
            echo '<img src="' . $existing_image_url . '" />';
        echo '</div>';

    }

    // If there is an existing image, show it
    if($existing_image_id) {

        echo '<div>Attached Image ID: ' . $existing_image_id . '</div>';

    } 

    echo 'Upload an image: <input type="file" name="xxxx_image" id="xxxx_image" />';

    // See if there's a status message to display (we're using this to show errors during the upload process, though we should probably be using the WP_error class)
    $status_message = get_post_meta($post->ID,'_xxxx_attached_image_upload_feedback', true);

    // Show an error message if there is one
    if($status_message) {

        echo '<div class="upload_status_message">';
            echo $status_message;
        echo '</div>';

    }

    // Put in a hidden flag. This helps differentiate between manual saves and auto-saves (in auto-saves, the file wouldn't be passed).
    echo '<input type="hidden" name="xxxx_manual_save_flag" value="true" />';

}



function xxxx_setup_meta_boxes() {

    // Add the box to a particular custom content type page
    add_meta_box('xxxx_image_box', 'Upload Image', 'xxxx_render_image_attachment_box', 'post', 'normal', 'high');

}
add_action('admin_init','xxxx_setup_meta_boxes');

ফাইল আপলোড পরিচালনা করছে

এটি সবচেয়ে বড় - বাস্তবে save_post ক্রিয়াকে হুক করে ফাইল আপলোড পরিচালনা করে। আমি নীচে একটি ভারী-মন্তব্যযুক্ত ফাংশন অন্তর্ভুক্ত করেছি, তবে আমি এটি ব্যবহার করে দুটি মূল ওয়ার্ডপ্রেস ফাংশন নোট করতে চাই:

ডাব্লুপি_হ্যান্ডল_আপলোড () আপলোডটি পরিচালনা করে, এর সমস্ত যাদু করে। আপনি কেবলমাত্র এটি আপনার ক্ষেত্রের রেফারেন্সটি $ _ ফাইলস অ্যারেতে এবং বিকল্পগুলির একটি অ্যারে দিয়ে গেছেন (এগুলি সম্পর্কে খুব বেশি চিন্তা করবেন না - আপনার গুরুত্বপূর্ণ একমাত্র গুরুত্বপূর্ণটি হল টেস্ট_ফর্ম = মিথ্যা = বিশ্বাস করুন)। এই ফাংশনটি আপলোড করা ফাইলটি মিডিয়া লাইব্রেরিতে যুক্ত করে না। এটি কেবল আপলোড করে এবং নতুন ফাইলের পাথ ফেরত দেয় (এবং, সহজেই, পুরো URL টিও)। যদি কোনও সমস্যা হয় তবে এটি একটি ত্রুটি ফিরিয়ে দেয়।

wp_insert_attachment () মিডিয়া লাইব্রেরিতে চিত্রটি যুক্ত করে এবং উপযুক্ত সমস্ত থাম্বনেইল তৈরি করে। আপনি কেবলমাত্র এটিকে আপলোড করেছেন এমন ফাইলের একটি শিরোনাম (শিরোনাম, পোস্টের স্থিতি ইত্যাদি), এবং স্থানীয় পথ (ইউআরএল নয়) দিয়ে দিন। আপনার চিত্রগুলি মিডিয়া লাইব্রেরিতে রাখার দুর্দান্ত বিষয়টি হ'ল আপনি সহজেই ডাব্লুপি_ডিলেট_ট্যাচমেন্ট কল করে আইটেমের মিডিয়া লাইব্রেরি আইডি (যা নীচের ফাংশনে করছি) এর মাধ্যমে সমস্ত ফাইল মুছতে পারবেন। এই ফাংশনটির সাথে, আপনাকে wp_generate_attachment_metadata () এবং wp_update_attachment_metadata () ব্যবহার করতে হবে, যা তারা আশা করেন ঠিক তাই করেন - মিডিয়া আইটেমটির জন্য মেটাডেটা তৈরি করে।

function xxxx_update_post($post_id, $post) {

    // Get the post type. Since this function will run for ALL post saves (no matter what post type), we need to know this.
    // It's also important to note that the save_post action can runs multiple times on every post save, so you need to check and make sure the
    // post type in the passed object isn't "revision"
    $post_type = $post->post_type;

    // Make sure our flag is in there, otherwise it's an autosave and we should bail.
    if($post_id && isset($_POST['xxxx_manual_save_flag'])) { 

        // Logic to handle specific post types
        switch($post_type) {

            // If this is a post. You can change this case to reflect your custom post slug
            case 'post':

                // HANDLE THE FILE UPLOAD

                // If the upload field has a file in it
                if(isset($_FILES['xxxx_image']) && ($_FILES['xxxx_image']['size'] > 0)) {

                    // Get the type of the uploaded file. This is returned as "type/extension"
                    $arr_file_type = wp_check_filetype(basename($_FILES['xxxx_image']['name']));
                    $uploaded_file_type = $arr_file_type['type'];

                    // Set an array containing a list of acceptable formats
                    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

                    // If the uploaded file is the right format
                    if(in_array($uploaded_file_type, $allowed_file_types)) {

                        // Options array for the wp_handle_upload function. 'test_upload' => false
                        $upload_overrides = array( 'test_form' => false ); 

                        // Handle the upload using WP's wp_handle_upload function. Takes the posted file and an options array
                        $uploaded_file = wp_handle_upload($_FILES['xxxx_image'], $upload_overrides);

                        // If the wp_handle_upload call returned a local path for the image
                        if(isset($uploaded_file['file'])) {

                            // The wp_insert_attachment function needs the literal system path, which was passed back from wp_handle_upload
                            $file_name_and_location = $uploaded_file['file'];

                            // Generate a title for the image that'll be used in the media library
                            $file_title_for_media_library = 'your title here';

                            // Set up options array to add this file as an attachment
                            $attachment = array(
                                'post_mime_type' => $uploaded_file_type,
                                'post_title' => 'Uploaded image ' . addslashes($file_title_for_media_library),
                                'post_content' => '',
                                'post_status' => 'inherit'
                            );

                            // Run the wp_insert_attachment function. This adds the file to the media library and generates the thumbnails. If you wanted to attch this image to a post, you could pass the post id as a third param and it'd magically happen.
                            $attach_id = wp_insert_attachment( $attachment, $file_name_and_location );
                            require_once(ABSPATH . "wp-admin" . '/includes/image.php');
                            $attach_data = wp_generate_attachment_metadata( $attach_id, $file_name_and_location );
                            wp_update_attachment_metadata($attach_id,  $attach_data);

                            // Before we update the post meta, trash any previously uploaded image for this post.
                            // You might not want this behavior, depending on how you're using the uploaded images.
                            $existing_uploaded_image = (int) get_post_meta($post_id,'_xxxx_attached_image', true);
                            if(is_numeric($existing_uploaded_image)) {
                                wp_delete_attachment($existing_uploaded_image);
                            }

                            // Now, update the post meta to associate the new image with the post
                            update_post_meta($post_id,'_xxxx_attached_image',$attach_id);

                            // Set the feedback flag to false, since the upload was successful
                            $upload_feedback = false;


                        } else { // wp_handle_upload returned some kind of error. the return does contain error details, so you can use it here if you want.

                            $upload_feedback = 'There was a problem with your upload.';
                            update_post_meta($post_id,'_xxxx_attached_image',$attach_id);

                        }

                    } else { // wrong file type

                        $upload_feedback = 'Please upload only image files (jpg, gif or png).';
                        update_post_meta($post_id,'_xxxx_attached_image',$attach_id);

                    }

                } else { // No file was passed

                    $upload_feedback = false;

                }

                // Update the post meta with any feedback
                update_post_meta($post_id,'_xxxx_attached_image_upload_feedback',$upload_feedback);

            break;

            default:

        } // End switch

    return;

} // End if manual save flag

    return;

}
add_action('save_post','xxxx_update_post',1,2);

অনুমতি, মালিকানা এবং সুরক্ষা

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

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

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

<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
</Files>

আপনাকে অনেক ধন্যবাদ ম্যাথসম্যাথ! ঠিক যেটা আমার দরকার ছিল. আমি এই উত্তরটি আরও উঁচু কুডো দিতে পারতাম!
মিশেল মাউ

দুর্দান্ত ব্যাখ্যা! কেবলমাত্র যেটি আমি আপনাকে প্রসারিত করার জন্য প্রশংসা করব তা হ'ল কীভাবে নির্দিষ্ট আপলোড করা ফাইলগুলি জনসাধারণের থেকে অ্যাক্সেসযোগ্য make অন্য কথায়, আপনি যদি সুনির্দিষ্ট পোস্ট-টাইপ তৈরি করতে চান যেখানে আপলোড করা সমস্ত ফাইল কেবল নির্দিষ্ট সক্ষমতা সহ ব্যবহারকারীদের দ্বারা অ্যাক্সেসযোগ্য। আপনি কি এই সম্পর্কে বিস্তারিত বলতে পারেন?
নেটকন্সট্রাক্টর.কম

3
ফ্রন্টএন্ডে ফাইল আপলোড করার জন্য যে কেউ, wp_handle_upload () ফাংশনটিতে অ্যাক্সেস পেতে আপনার নীচের কোডটি অন্তর্ভুক্ত করতে হবে:if ( ! function_exists( 'wp_handle_upload' ) ) require_once( ABSPATH . 'wp-admin/includes/file.php' );
নিক

@ নেটকন্সট্রাক্টর.কম আমি আপনাকে একটি প্রশ্ন তৈরির পরামর্শ দিচ্ছি কারণ এটি উত্তরের ক্ষেত্রের বাইরে নয়।
হাইটাটোডস্ট্রাক্ট

0

@ ম্যাথসম্যাট যে কোডটি দিয়েছে তা সঠিক। তবে আপনি যদি অনেকগুলি আপলোড ক্ষেত্র পরিচালনা করেন বা একাধিক ফাইল আপলোড করতে চান তবে আপনাকে এটিকে অনেক পরিবর্তন করতে হবে।

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

আমি আপনাকে মেটা বক্সের মতো প্লাগইনটি একবার দেখে নেওয়ার পরামর্শ দেব । প্লাগইন ফাইল আপলোড করার উভয় উপায়ে সমর্থন করে:

কোডটি লেখার এবং রক্ষণাবেক্ষণের প্রচেষ্টা কমাতে এটি আপনাকে সহায়তা করতে পারে, বিশেষত যখন আপনি একাধিক আপলোড তৈরি করতে চান।

দাবি অস্বীকার: আমি মেটা বক্সের লেখক।

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