我已经研究了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
#2 楼
我想通过利用WP核心功能download_url
和media_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将处理媒体并将其上传,然后将其设置为缩略图。
评论
感谢你付出的努力!但是,这仅在使用$ 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