使用wp_insert_post()时,如何通过图像URL设置特色图像(缩略图)?


61

浏览wp_insert_post()函数引用条目时,我注意到它需要的数组中没有参数,这将允许我设置帖子的“功能图像”,并在主题中显示为帖子缩略图

我已经研究了Bennett先生建议的set_post_thumbnail()之类的函数,但这似乎是WordPress本身和WordPress Codex的相对较新的功能。因此,没有任何资料可以解释如何获取和提供$ thumbnail_id参数。如果这确实是要使用的功能,当我只有图像URL时,可以通过什么方式为它提供有效的$ thumbnail_id参数?

提前致谢!

Answers:


107

您可以将图像设置为媒体库中的缩略图。要将图像添加到媒体库中,您需要将其上传到服务器。WordPress已经具有将图像放入媒体库的功能,您只需要一个上传文件的脚本。

用法:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

功能:

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
      $file = $upload_dir['path'] . '/' . $filename;
    else
      $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


编辑:添加了路径创建

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


感谢你付出的努力!不过,这仅在使用$ upload_dir ['basedir'](而不是路径)时有效,因为当我通过post edit界面检查附件时,它被引用为... / uploads / FILENAME.EXT而$ upload_dir ['path' ]会将其存储在... / uploads / 2012/02 / FILENAME.EXT之类的文件中。以某种方式更改文件引用的方式可能更好,但我不知道如何。
克里斯

1
在我的答案中添加了路径创建。
Rob Vermeer'2

感谢您的快速反应:)。但是,我仍然得到相同的结果,这是显示我的问题的屏幕截图:i.imgur.com/iKTNs.png。上半部分是在条件中放置回显的结果,目的只是为了查看发生了什么。
克里斯

再次对其进行了更改,未将完整路径传递给wp_insert_attachment和wp_generate_attachment_metadata。希望这能解决问题。
Rob Vermeer 2012年

1
警告:如果文件名称相同,请注意此答案将重写文件。它应该产生使用$ POST_ID或至少uniqid()的名字
伊万·卡斯特利亚诺斯

10

尝试使用set_post_thumbnail()

奥托编辑:您澄清了您的问题,所以我澄清了Chip给出的答复。

基本上,您还需要为帖子添加“附件”。将图片上传到WordPress媒体库时,会为其添加一个特殊的帖子条目,并带有附件的帖子类型。该附件通过post_parent标识符链接到某些特定的帖子。

因此,如果您知道附件的ID,则使用发布对象或ID和附件ID调用set_post_thumbnail只需设置发布缩略图标志。

如果尚未创建附件,则需要先执行该操作。最简单的方法是使用wp_insert_attachment()。此函数采用几个参数组成的数组,文件名(文件必须已经在正确的上载目录中)以及要将附件附加到的父帖子的帖子ID。

仅将文件上传并附加到帖子并不会自动执行任何操作。这只是一种分类机制。例如,画廊机制使用帖子的附加图像为该帖子建立[图库]。帖子的缩略图只是已设置为缩略图的附加图像之一。

有关如何使用wp_insert_attachment的更多信息,可以在代码库中找到(上面链接)。


谢谢您的回复!但是,我将如何检索缩略图ID?我从图像URL开始,所以我想我应该使用其他功能以某种方式将图像添加到wordpress库中吗?
克里斯

当您已经插入帖子时,我假设您已经将图像附加到要插入的帖子中。这不是一个有效的假设吗?
Chip Bennett 2012年

抱歉,但是我还没有找到如何通过URL将图像实际附加到帖子上。另外,我不希望图像实际显示在帖子本身中。我目前正在寻找将返回$ thumbnail_id的函数,并认为wp_insert_attachment()可能会起作用,直到我注意到它已经要求附件位于上传目录中为止。我不知道如何通过其URL获取图像文件,而且我不确定这是否就是我首先要查找的功能。谢谢您的帮助!
克里斯

您能否用此信息重写您的问题,以更好地描述您要完成的工作?(或者,保持原样,并提出一个新问题,询问在插入帖子时如何获取附件ID?)
Chip Bennett

原始问题已被编辑,部分重新措辞,请返回:)。
克里斯

9

我想通过利用WP核心功能来改善Robs答案download_urlmedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $file_array['tmp_name'];
    }

    // Do the validation and storage stuff.
    $id = media_handle_sideload( $file_array, $post_id, $desc );

    // If error storing permanently, unlink.
    if ( is_wp_error( $id ) ) {
        @unlink( $file_array['tmp_name'] );
        return $id;
    }
    return set_post_thumbnail( $post_id, $id );

}

1
最好使用WordPress本机函数,谢谢。
Mostafa Soufi

由于某种原因,此版本使我出现错误,提示“未提供有效的URL”。,而Rob Vermeer的答案行之有效。
Flimm

3

set_post_thumbnail() 是满足此要求的最佳功能。

我认为,您可以通过get_children()或找到附件的ID get_posts()。结果有一个数组,该数组内部是ID。以下示例进行测试;我希望它能起作用;无需测试即可写作,只能从头开始。

根据您的要求,重要的是您要get_the_ID()随自己的改变post-ID。返回附件的ID,您可以使用foth set_post_thumbnail()

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}

3

刚发现它并使它变得更简单,有效,但是我不是安全检查器

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

简单还是什么?获取正确的文件后,wordpress将处理媒体并上传,然后将其设置为缩略图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.