วิธีตั้งค่ารูปภาพเด่นเป็นโพสต์ที่กำหนดเองจากภายนอกโดยทางโปรแกรม


13

ฉันพยายามดึงและแทรกภาพนอกสภาพแวดล้อมของ wordpress ไปยังโพสต์ที่กำหนดเองผ่าน PHP

วิธีการย้าย / อัปโหลดภาพไปยังรูปแบบโฟลเดอร์อัปโหลดวันที่ไดเรกทอรีปี wordpress เช่นเดียวกับ wordpress ทำและการตั้งค่าภาพที่เป็นภาพที่โดดเด่นกับโพสต์ที่กำหนดเอง?

นอกจากนี้ในการอัปโหลดภาพไปยังแกลเลอรี่โพสต์ที่กำหนดเอง?

ด้านล่างเป็นรหัสของฉัน

$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

ไม่สามารถทำได้ด้วยmedia_sideload_image ()ใช่ไหม

ดูเหมือนง่ายสวย catch เท่านั้นคือถ้าคุณไม่ได้อยู่ในพื้นที่ admin คุณต้องรวมไลบรารีบางส่วนจากภายใน WordPress รวมถึง:

// 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)
Omar Tariq

ฉันจะเพิ่มรหัสนี้ได้ที่ไหน
er.irfankhan11

1
ในฐานะของ WordPress 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); }
Don Wilson

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

บางทีฉันอาจเข้าใจผิด แต่ทำไมคุณต้องทำสิ่งนั้นนอกสภาพแวดล้อม WordPress การจำลองฟังก์ชั่นนี้จะใช้งานได้มาก! WordPress ทำมากกว่าการอัปโหลดไฟล์และวางไว้ในไดเรกทอรีเฉพาะเช่นการควบคุมผู้ใช้ที่ได้รับอนุญาตให้อัปโหลดไฟล์เพิ่มบันทึกฐานข้อมูลสำหรับการอัปโหลดและการตั้งค่าความสัมพันธ์ภาพเด่นการดำเนินการและตัวกรองสำหรับปลั๊กอินภายนอกขึ้นอยู่กับ การอัปโหลดไฟล์ - ทั้งหมดในขณะที่ปฏิบัติตามการตั้งค่าไซต์ (ในส่วนที่เกี่ยวกับการตั้งชื่อสถานที่อัพโหลดสื่อ ฯลฯ )

หากคุณเพียงแค่ต้องการอัปโหลดไฟล์โดยไม่ต้องลงชื่อเข้าใช้ในส่วนผู้ดูแลระบบ WordPress เช่นการอัปโหลดไฟล์จากไซต์ภายนอกคุณอาจต้องการดูXML-RPC APIและuploadFileวิธีการเฉพาะ

ตัวเลือกอื่นอาจเป็นการเขียน mini API ด้วยตัวคุณเอง โดยทั่วไปสิ่งที่คุณต้องการทำคือ:

  1. รับไฟล์บนเซิร์ฟเวอร์ผ่านการอัปโหลด (หรือรับเซิร์ฟเวอร์เพื่อดาวน์โหลดจาก URL ที่ระบุ)
  2. ใช้wp_upload_dir()เพื่อรับพา ธ ไดเร็กทอรีอัพโหลดและsanitize_file_name()สร้างพา ธ และเขียนไฟล์ไปยังตำแหน่งที่เป็นผลลัพธ์
  3. ใช้wp_insert_attachment()สำหรับเก็บไฟล์แนบในฐานข้อมูล ( wp_check_filetype()จะเป็นประโยชน์สำหรับการตั้งค่าpost_mime_type) ตั้งค่าอีกทางเลือกหนึ่งpost_parentและ_thumbnail_idปุ่มเมตาถ้าคุณต้องการ
  4. เปิดเผย API ของคุณกับผู้ใช้ภายนอกหรือต้องการเข้าสู่ระบบตามต้องการ หากคุณใช้รูปแบบสาธารณะอย่างน้อยที่สุดก็ใช้wp_create_nonce()และwp_verify_nonce()ทำให้รูปแบบมีความปลอดภัยมากขึ้น

ฉันกำลังเขียนบริการเว็บสำหรับแอปพลิเคชัน แอปพลิเคชันส่งอาร์เรย์ FILE ให้ฉันซึ่งฉันต้องการแทรกข้อมูลการโพสต์และรูปภาพฉันได้แทรกรายละเอียดการโพสต์ในฐานข้อมูล แต่ติดอยู่ในส่วนของภาพ
Faisal Shehzad

ตรวจสอบเอกสารwp_insert_attachment()ว่าควรทำอะไรที่คุณต้องการ ฉันขอแนะนำให้คุณแก้ไขฐานข้อมูลนอก WordPress ด้วยตนเองถ้านั่นคือสิ่งที่คุณกำลังทำ ให้มองไปที่แหล่ง WordPress และพยายามระบุส่วนที่รับผิดชอบในการเพิ่มข้อมูลโพสต์จัดการไฟล์ที่อัพโหลดและแทรกสิ่งที่แนบมา พูดอีกอย่างคือสิ่งที่ฉันได้อธิบายไว้ในคำตอบข้างต้น
Simon

@ Simon ฉันมีปัญหาเดียวกัน อีกเหตุผลที่คุณอาจต้องการอัปโหลดคือเมื่อคุณมีงานแบ็ตช์รูปภาพที่คุณต้องการแนบไปกับโพสต์ต่าง ๆ และไม่ต้องทำด้วยตนเอง
hitastodestruct

1
@ hitautodestruct: แน่นอนฉันมักจะทำเช่นนั้นเมื่อทำการโยกย้ายข้อมูลจากเว็บไซต์ที่มีอยู่ระบบเดิมการส่งออกฐานข้อมูล ฯลฯ จุดของฉันคือคุณควรพยายามใช้ประโยชน์จากฟังก์ชั่นหลักของ WordPress เพื่อให้บรรลุเป้าหมายมากกว่าแค่เขียนสคริปต์ของคุณ เป็นของตัวเองที่วางภาพในตำแหน่งที่ถูกต้อง (ซึ่งก็เพื่อขยายสิ่งที่ฉันรับรู้คำถามเกี่ยวกับ)
Simon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.