प्रोग्राम के बाहर से कस्टम पोस्ट में चित्रित छवि कैसे सेट करें


13

मैं WordPress वातावरण के बाहर छवियों को लाने और PHP के माध्यम से एक कस्टम पोस्ट करने की कोशिश कर रहा हूं।

उस छवि को वर्डप्रेस अपलोड डायरेक्टरी वर्ष तिथि फ़ोल्डर प्रारूप में कैसे स्थानांतरित / अपलोड करें जैसे कि वर्डप्रेस कस्टम पोस्ट के खिलाफ विशेष रुप से प्रदर्शित छवि को सेट करता है?

कस्टम पोस्ट गैलरी में छवि अपलोड करने के लिए भी?

नीचे मेरा कोड है

$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

शायद मुझे गलतफहमी हो रही है, लेकिन आप वर्डप्रेस वातावरण के बाहर ऐसा क्यों करना चाहेंगे? इस कार्यक्षमता को दोहराने से बहुत काम होगा! वर्डप्रेस केवल फ़ाइल को अपलोड करने और एक विशिष्ट निर्देशिका में रखने से बहुत अधिक है, उदाहरण के लिए नियंत्रित करना कि उपयोगकर्ताओं को कौन सी फाइलें अपलोड करने की अनुमति है, अपलोड के लिए डेटाबेस रिकॉर्ड जोड़ना और चुनिंदा छवि संबंध स्थापित करना, बाहरी प्लग-इन के लिए क्रियाओं और फ़िल्टर को निर्भर करना। फ़ाइल अपलोड - साइट सेटिंग्स (नामकरण परंपराओं, मीडिया अपलोड स्थान, आदि के संबंध में) का पालन करते हुए सभी।

यदि आप बस वर्डप्रेस एडमिन सेक्शन में लॉग-इन किए बिना फाइल अपलोड करना चाहते हैं, उदाहरण के लिए किसी बाहरी साइट से फाइल अपलोड करने के लिए, जिसे आप XML-RPC API और विशेष रूप से uploadFileविधि पर देख सकते हैं।

एक और विकल्प खुद एक मिनी एपीआई लिखना हो सकता है। मूल रूप से आप यह करना चाहते हैं:

  1. अपलोड के माध्यम से सर्वर पर फ़ाइल प्राप्त करें (या एक निर्दिष्ट URL से इसे डाउनलोड करने के लिए सर्वर प्राप्त कर रहा है)।
  2. wp_upload_dir()अपलोड निर्देशिका पथ प्राप्त करने और पथ sanitize_file_name()का निर्माण करने के लिए उपयोग करें और परिणामी स्थान पर फ़ाइल लिखें।
  3. wp_insert_attachment()डेटाबेस में अनुलग्नक को संग्रहीत करने के लिए उपयोग करें ( wp_check_filetype()सेटिंग के लिए सहायक होगा post_mime_type)। यदि आप चाहें तो वैकल्पिक रूप से सेट post_parentऔर _thumbnail_idमेटा कुंजी भी ।
  4. बाहरी उपयोगकर्ताओं के लिए अपने एपीआई को उजागर करें, या आवश्यकतानुसार लॉगिन की आवश्यकता है। यदि आप सार्वजनिक रूप का उपयोग बहुत कम से कम उपयोग करते हैं wp_create_nonce()और wp_verify_nonce()प्रपत्र को थोड़ा अधिक सुरक्षित बनाने के लिए करते हैं।

मैं एक आवेदन के लिए एक वेब सेवा लिख ​​रहा हूँ। आवेदन मुझे एक फ़ाइल सरणी भेजते हैं जिसके माध्यम से मैं पोस्ट डेटा और छवि सम्मिलित करना चाहता हूं मैंने डेटाबेस में पोस्ट विवरण डाला है लेकिन छवि भाग में अटक गया है।
फ़ैज़ल शहज़ाद

के लिए दस्तावेज़ीकरण की जाँच करें wp_insert_attachment(), इसे बहुत कुछ करना चाहिए जो आपको लगता है कि मुझे चाहिए। यदि आप ऐसा कर रहे हैं तो मैं वर्डप्रेस के बाहर डेटाबेस को मैन्युअल रूप से संशोधित करने पर बहुत हतोत्साहित करूंगा। इसके बजाय, बस वर्डप्रेस स्रोत को देखें और पोस्ट डेटा को जोड़ने, फ़ाइल अपलोड को संभालने और अटैचमेंट सम्मिलित करने के लिए जिम्मेदार भागों की पहचान करने का प्रयास करें। दूसरे शब्दों में, बहुत ज्यादा मैं अपने जवाब में ऊपर उल्लिखित है।
साइमन

@ साइमन मेरे पास एक ही मुद्दा है। एक और कारण जिसे आप अपलोड करना चाहते हैं, वह यह है कि जब आपके पास छवियों का एक बैच काम होता है जिसे आप विभिन्न पदों से जोड़ना चाहते हैं और इसे मैन्युअल रूप से नहीं करते हैं।
हितुटोडेस्ट्रक्ट

1
@hitautodestruct: बिल्कुल, मैं अक्सर ऐसा करता हूं कि जब डेटा फ़ॉर्म मौजूदा साइटों, विरासत प्रणालियों, डेटाबेस निर्यात आदि को माइग्रेट करता है, तो मेरा कहना है कि आपको इसे पूरा करने के लिए हमेशा वर्डप्रेस कोर कार्यक्षमता का लाभ लेने के लिए प्रयास करना चाहिए, न कि केवल अपनी स्क्रिप्ट लिखने के बजाय अपने आप सही स्थान पर छवियों को रखता है (जो कि कुछ का विस्तार था जो मुझे लगता है कि प्रश्न के बारे में था)।
साइमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.