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

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

,谢谢!

#1 楼

您可以将图像设置为媒体库中的帖子缩略图。要将图像添加到媒体库中,您需要将其上载到服务器。 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()


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之类的文件中。以某种方式更改文件引用的方式可能更好,但是我不知道如何。

–克里斯
2012年2月6日在18:02



在我的答案中添加了路径创建。

– Rob Vermeer
2012年2月6日在18:47

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

–克里斯
2012年2月6日在20:17



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

– Rob Vermeer
2012年2月6日在20:28

警告:如果文件名称相同,请注意此答案将重写文件。它应该使用$ post_id或至少uniqid()生成名称

–伊凡·卡斯特拉诺斯(Ivan Castellanos)
17年5月31日在21:59

#2 楼

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

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

}


评论


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

– Mostafa Soufi
18/09/15在15:39



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

– Flimm
19年8月28日在17:09

我可以确认修改后的代码不起作用,这很可惜,因为URL侧载会很棒!

– Zach Nicodemous
11月9日23:16

即使我对原始答案有疑问,此代码也对我来说是完美的。

– Jsilvermist
11月18日22:47

#3 楼

尝试使用set_post_thumbnail()

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

因此,如果您知道附件的ID,则调用带有帖子对象或ID的set_post_thumbnail,附件ID只会设置帖子缩略图标志。

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

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

有关如何使用wp_insert_attachment的更多信息,请参见法典(上面链接)。

评论


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

–克里斯
2012年1月27日17:44

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

–芯片Bennett
2012年1月27日18:15

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

–克里斯
2012年1月27日在20:59

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

–芯片Bennett
2012年1月27日在21:03

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

–克里斯
2012年1月27日21:38

#4 楼

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

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

对于您的要求,重要的是,用get_the_ID()更改post-ID;返回附件的ID,这样您就可以使用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);
}


#5 楼

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

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将处理媒体并将其上传,然后将其设置为缩略图。