Cách đặt hình ảnh nổi bật cho bài đăng tùy chỉnh từ bên ngoài theo chương trình


13

Tôi đang cố gắng tìm nạp và chèn hình ảnh bên ngoài môi trường wordpress vào một bài đăng tùy chỉnh thông qua PHP.

Làm cách nào để di chuyển / tải hình ảnh đó lên wordpress định dạng thư mục năm của thư mục giống như wordpress làm và đặt hình ảnh đó thành hình ảnh nổi bật so với bài đăng tùy chỉnh?

Ngoài ra để tải hình ảnh lên thư viện bài tùy chỉnh?

Dưới đây là mã của tôi

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

tôi đã quản lý để tải hình ảnh lên thư mục tải lên của mình nhưng không thể tạo thư mục năm và ngày. cái này có chức năng wp nào cho nó không ??

Câu trả lời:


27

Điều này có thể được thực hiện đơn giản với media_sideload_image () không?

Có vẻ khá đơn giản. Chỉ nắm bắt là nếu bạn không ở trong khu vực quản trị, bạn phải bao gồm một số thư viện trong WordPress bao gồm:

// 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
Giải pháp này hoạt động như một bùa mê (y)
Omar Tariq

Tôi có thể thêm mã này vào đâu?
er.irfankhan11

1
Tính đến WordPress 4.8, bạn có thể thiết lập các tham số thứ tư trong media_sideload_imageđể 'id'và nó sẽ trả lại id tập tin đính kèm mới. Ví dụ:$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

Hãy thử giải thích về việc tải lên bằng cách sử dụng một đường dẫn và đăng ID .

Đây là mã (cho di sản):

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

Vui lòng tham khảo mã sau đây thiết lập hình ảnh đặc trưng theo chương trình. 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

Có lẽ tôi đang hiểu lầm, nhưng tại sao bạn lại muốn làm điều đó ngoài môi trường WordPress? Nhân rộng chức năng này sẽ rất nhiều công việc! WordPress không chỉ đơn thuần là tải lên tệp và đặt nó vào một thư mục cụ thể, ví dụ như kiểm soát người dùng nào được phép tải tệp lên, thêm bản ghi cơ sở dữ liệu để tải lên và thiết lập mối quan hệ hình ảnh nổi bật, thực thi hành động và bộ lọc cho các plugin bên ngoài phụ thuộc vào tải lên tệp - tất cả trong khi tuân thủ các cài đặt trang web (liên quan đến quy ước đặt tên, vị trí tải lên phương tiện, v.v.).

Nếu bạn chỉ đơn giản tìm cách tải lên các tệp mà không cần đăng nhập vào phần quản trị viên WordPress, ví dụ để tải tệp lên từ một trang bên ngoài, bạn có thể muốn xem API XML-RPC và cụ thể là uploadFilephương pháp.

Một lựa chọn khác có thể là tự viết một API nhỏ. Về cơ bản những gì bạn muốn làm là đây:

  1. Nhận tệp trên máy chủ thông qua tải lên (hoặc nhận máy chủ để tải xuống từ một URL được chỉ định).
  2. Sử dụng wp_upload_dir()để có được đường dẫn thư mục tải lên và sanitize_file_name()để xây dựng đường dẫn và ghi tệp vào vị trí kết quả.
  3. Sử dụng wp_insert_attachment()để lưu trữ tệp đính kèm trong cơ sở dữ liệu ( wp_check_filetype()sẽ hữu ích cho cài đặt post_mime_type). Tùy chọn cũng đặt post_parent_thumbnail_idkhóa meta nếu bạn muốn.
  4. Đưa API của bạn cho người dùng bên ngoài hoặc yêu cầu đăng nhập nếu cần. Nếu bạn sử dụng một biểu mẫu công khai ít nhất là sử dụng wp_create_nonce()wp_verify_nonce()để làm cho biểu mẫu an toàn hơn một chút.

tôi đang viết một dịch vụ web cho một ứng dụng. Ứng dụng gửi cho tôi một mảng FILE thông qua đó tôi muốn chèn dữ liệu bài đăng và hình ảnh tôi đã chèn chi tiết bài đăng vào cơ sở dữ liệu nhưng bị kẹt vào phần hình ảnh.
Faisal Shehzad

Kiểm tra tài liệu cho wp_insert_attachment(), nó sẽ làm nhiều những gì bạn cần tôi nghĩ. Tôi rất không khuyến khích sửa đổi cơ sở dữ liệu bên ngoài WordPress nếu đó là những gì bạn đang làm. Thay vào đó, chỉ cần nhìn vào nguồn WordPress và cố gắng xác định các phần chịu trách nhiệm thêm dữ liệu bài đăng, xử lý tải lên tệp và chèn tệp đính kèm. Nói cách khác, khá nhiều những gì tôi đã nêu trong câu trả lời của tôi ở trên.
Simon

@Simon tôi có cùng một vấn đề. Một lý do khác mà bạn có thể muốn tải lên là khi bạn có một loạt các hình ảnh bạn muốn đính kèm vào các bài đăng khác nhau và không thực hiện thủ công.
hitautodesturation

1
@hitautodesturation: Hoàn toàn, tôi thường làm điều đó khi di chuyển dữ liệu từ các trang web hiện có, hệ thống kế thừa, xuất cơ sở dữ liệu, ... Quan điểm của tôi là bạn nên luôn cố gắng tận dụng chức năng cốt lõi của WordPress để thực hiện việc này, thay vì chỉ viết một tập lệnh của bạn sở hữu đặt các hình ảnh ở vị trí chính xác (đó là một số mở rộng những gì tôi cảm nhận được câu hỏi về).
Simon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.