Cara mengatur gambar unggulan ke pos kustom dari luar secara terprogram


13

Saya mencoba untuk mengambil dan menyisipkan gambar di luar lingkungan wordpress ke pos kustom melalui PHP.

Bagaimana cara memindahkan / mengunggah gambar itu ke direktori upload tahun lalu format direktori wordpress seperti halnya wordpress dan mengatur gambar itu untuk menampilkan gambar terhadap posting kustom?

Juga untuk mengunggah gambar ke galeri posting khusus?

Di bawah ini adalah kode saya

$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 );

saya telah berhasil mengunggah gambar ke direktori unggahan saya tetapi tidak dapat membuat folder tahun dan tanggal. ini ada fungsi wp untuk itu ??

Jawaban:


27

Tidak bisakah ini dilakukan dengan media_sideload_image () ?

Sepertinya cukup sederhana. Hanya menangkapnya adalah jika Anda tidak berada di area admin, Anda harus memasukkan beberapa perpustakaan dari dalam WordPress termasuk:

// 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
Solusi ini bekerja seperti pesona (y)
Omar Tariq

Di mana saya dapat menambahkan kode ini?
er.irfankhan11

1
Sebagai WordPress 4.8 Anda dapat mengatur parameter keempat media_sideload_imageuntuk 'id'dan akan kembali lampiran id baru. Misalnya:$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); }
Don Wilson

1

Cobalah penjelasan mengunggah ini menggunakan jalur dan poskan ID .

Berikut kodenya (untuk warisan):

/* 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

Silakan merujuk kode berikut yang mengatur gambar unggulan secara terprogram. 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

Mungkin saya salah paham, tetapi mengapa Anda ingin melakukan itu di luar lingkungan WordPress? Mereplikasi fungsi ini akan banyak pekerjaan! WordPress melakukan lebih dari sekadar mengunggah file dan menempatkannya di direktori tertentu, misalnya mengendalikan pengguna mana yang diizinkan untuk mengunggah file, menambahkan catatan basis data untuk diunggah dan mengatur hubungan gambar unggulan, menjalankan tindakan dan filter untuk plugin eksternal tergantung pada unggah file - semuanya sambil mematuhi pengaturan situs (terkait dengan konvensi penamaan, lokasi unggah media, dll).

Jika Anda hanya ingin mengunggah file tanpa masuk ke bagian admin WordPress, misalnya untuk mengunggah file dari situs eksternal, Anda mungkin ingin melihat-lihat API XML-RPC dan khususnyauploadFile metodenya.

Pilihan lain adalah menulis sendiri API mini. Pada dasarnya yang ingin Anda lakukan adalah ini:

  1. Dapatkan file di server melalui unggah (atau minta server untuk mengunduhnya dari URL yang ditentukan).
  2. Gunakan wp_upload_dir()untuk mendapatkan jalur direktori unggah dan sanitize_file_name()untuk membangun jalur dan menulis file ke lokasi yang dihasilkan.
  3. Gunakan wp_insert_attachment()untuk menyimpan lampiran dalam basis data ( wp_check_filetype()akan sangat membantu untuk pengaturan post_mime_type). Opsional juga mengatur post_parentdan _thumbnail_idkunci meta jika Anda suka.
  4. Paparkan API Anda ke pengguna eksternal, atau minta login, sesuai kebutuhan. Jika Anda menggunakan formulir publik setidaknya gunakan wp_create_nonce()dan wp_verify_nonce()untuk membuat formulir sedikit lebih aman.

saya menulis layanan web untuk aplikasi. Aplikasi mengirimkan saya array FILE di mana saya ingin memasukkan data dan gambar posting saya telah memasukkan rincian posting dalam database tetapi terjebak ke dalam bagian gambar.
Faisal Shehzad

Periksa dokumentasi untuk wp_insert_attachment(), itu harus melakukan apa yang Anda butuhkan saya pikir. Saya akan sangat menyarankan memodifikasi secara manual database di luar WordPress jika itu yang Anda lakukan. Sebaliknya, lihat saja sumber WordPress dan cobalah untuk mengidentifikasi bagian-bagian yang bertanggung jawab untuk menambahkan data posting, menangani unggahan file dan memasukkan lampiran. Dengan kata lain, cukup banyak apa yang saya uraikan dalam jawaban saya di atas.
Simon

@Simon Saya memiliki masalah yang sama. Alasan lain yang mungkin ingin Anda unggah adalah ketika Anda memiliki pekerjaan batch gambar yang ingin Anda lampirkan ke posting yang berbeda dan tidak melakukannya secara manual.
hitautodestruct

1
@hitautodestruct: Tentu saja, saya sering melakukan itu ketika memigrasikan data dari situs yang sudah ada, sistem warisan, ekspor basis data dll. Maksud saya adalah Anda harus selalu berusaha untuk mengambil keuntungan dari fungsionalitas inti WordPress untuk mencapai hal ini, daripada hanya menulis skrip Anda sendiri yang menempatkan gambar di lokasi yang benar (yang untuk beberapa memperluas apa yang saya anggap pertanyaan tentang).
Simon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.