我终于有了!!这个东西我试了12次,用了12种不同的方法,但最终还是成功了,。。。差不多吧。
我制作了一个自定义元盒,用于上传图像并将其附加到帖子中,它不需要您使用WP中内置的可怕的thickbox媒体上传器。我讨厌那东西。不,我所做的只是一组输入(标题、描述、文件),您也可以复制这些输入,以便在需要时添加其他附件。因此,您可以填写字段,选择要上载的图像,保存草稿或发布帖子。将附件添加到帖子后,元数据库将显示输入字段,以及添加的每个附件的附加图像的预览图像。title和description字段用于生成文件元数据,据我所知,没有任何内容保存为post\\u meta。这就是我目前为止所做的全部工作。
我需要这样做,当你保存/发布一篇文章,插入上传/创建附件文件时,它会像默认的wp上传程序一样创建三个图像大小,缩略图、中、大,并保留完整大小的图像。如果有可能的话。如果没有,我想使用其他方式add_image_size()
创建/定义新的自定义尺寸,并在上载时以这种方式生成它们。
我不确定在这种情况下哪个函数是最理想的,也许image_make_intermediate_size()
功能会更好,或者wp_create_thumbnail()
或wp_crop_image()
... 谁知道呢!!
如果我需要运行wp_handle_upload()
函数,或者可能涉及wp_generate_attachment_metadata()
作用这让我很困惑,因为这3个图像大小是作为同一附件的变体关联的,以及如何进行关联。
我浏览了网页,阅读了每一个wp媒体/上传/图像相关文件的来源,并使用了几乎所有的媒体上传功能,但找不到wp是如何在任何地方创建3种图像大小的,也找不到自己是如何做到的。
wp中包括/介质。phpimage_resize()
函数看起来是最好的,因为它正是它应该是的。我真的搞不清楚我到底错过了什么,或者我试过做什么,但做了错误的图像缩略图。
这是我的工作函数wp_handle_upload()
东西,但它还需要创建100px的缩略图,并将图像的最大宽度调整为500px,并保存为上传图像的新文件。
function update_attachment(){
global $post;
wp_update_attachment_metadata( $post->ID, $_POST[\'a_image\'] );
if( !empty( $_FILES[\'a_image\'][\'name\'] )) { //New upload
require_once( ABSPATH . \'wp-admin/includes/file.php\' );
$override[\'action\'] = \'editpost\';
$url = wp_handle_upload( $_FILES[\'a_image\'], $override );
// $medium = image_make_intermediate_size( $uploaded_file[\'url\'], 500, 400, true );
// $thumb = = image_make_intermediate_size( $uploaded_file[\'url\'], 100, 100, true );
if ( isset( $file[\'error\'] )) {
return new WP_Error( \'upload_error\', $file[\'error\'] );
}
$array_type = wp_check_filetype
$allowed_file_types = array(\'image/jpg\',\'image/jpeg\',\'image/gif\',\'image/png\');
$name_parts = pathinfo( $name );
$name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts[\'extension\'] )) ));
$type = $file[\'type\'];
$file = $file[\'file\'];
$title = $_POST[\'a_title\'] ? $_POST[\'a_title\'] : $name;
$content = $_POST[\'a_desc\']
$post_id = $post->ID;
$attachment = array(
\'post_title\' => $title,
\'post_type\' => \'attachment\',
\'post_content\' => $content,
\'post_parent\' => $post_id,
\'post_mime_type\' => $type,
\'guid\' => $url[\'url\']
);
// Save the data
$id = wp_insert_attachment( $attachment, $_FILES[\'a_image\'][ \'file\' ]/*, $post_id - for post_thumbnails*/);
if ( !is_wp_error( $id )) {
$attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file[\'url\'] );
wp_update_attachment_metadata( $attach_id, $attach_meta );
}
update_post_meta( $post->ID, \'a_image\', $uploaded_file[\'url\'] );
}
}
任何能够帮助我最终解决这个问题,使其正常工作的人都会受到爱戴。我花了这么多荒谬的无数个小时,无数次尝试开发这个东西,而文档很糟糕,而且没有任何关于如何做的好帖子。
谢谢
最合适的回答,由SO网友:MikeSchinkel 整理而成
你好@jaredwilli:
伙计!勇敢的努力,出色的工作。总而言之,这可能是WordPress的一个很好的补充。
你很接近,但你有5到10个小的失败的假设或代码,看起来像是你开始的,但没有回到它,因为它不起作用。我只根据需要修改了你的函数。解决方案如下,我将与您或其他人进行并列比较
function update_attachment() {
global $post;
wp_update_attachment_metadata( $post->ID, $_POST[\'a_image\'] );
if( !empty( $_FILES[\'a_image\'][\'name\'] )) { //New upload
require_once( ABSPATH . \'wp-admin/includes/file.php\' );
$override[\'action\'] = \'editpost\';
$file = wp_handle_upload( $_FILES[\'a_image\'], $override );
if ( isset( $file[\'error\'] )) {
return new WP_Error( \'upload_error\', $file[\'error\'] );
}
$file_type = wp_check_filetype($_FILES[\'a_image\'][\'name\'], array(
\'jpg|jpeg\' => \'image/jpeg\',
\'gif\' => \'image/gif\',
\'png\' => \'image/png\',
));
if ($file_type[\'type\']) {
$name_parts = pathinfo( $file[\'file\'] );
$name = $file[\'filename\'];
$type = $file[\'type\'];
$title = $_POST[\'a_title\'] ? $_POST[\'a_title\'] : $name;
$content = $_POST[\'a_desc\'];
$post_id = $post->ID;
$attachment = array(
\'post_title\' => $title,
\'post_type\' => \'attachment\',
\'post_content\' => $content,
\'post_parent\' => $post_id,
\'post_mime_type\' => $type,
\'guid\' => $file[\'url\'],
);
foreach( get_intermediate_image_sizes() as $s ) {
$sizes[$s] = array( \'width\' => \'\', \'height\' => \'\', \'crop\' => true );
$sizes[$s][\'width\'] = get_option( "{$s}_size_w" ); // For default sizes set in options
$sizes[$s][\'height\'] = get_option( "{$s}_size_h" ); // For default sizes set in options
$sizes[$s][\'crop\'] = get_option( "{$s}_crop" ); // For default sizes set in options
}
$sizes = apply_filters( \'intermediate_image_sizes_advanced\', $sizes );
foreach( $sizes as $size => $size_data ) {
$resized = image_make_intermediate_size( $file[\'file\'], $size_data[\'width\'], $size_data[\'height\'], $size_data[\'crop\'] );
if ( $resized )
$metadata[\'sizes\'][$size] = $resized;
}
$attach_id = wp_insert_attachment( $attachment, $file[\'file\'] /*, $post_id - for post_thumbnails*/);
if ( !is_wp_error( $id )) {
$attach_meta = wp_generate_attachment_metadata( $attach_id, $file[\'file\'] );
wp_update_attachment_metadata( $attach_id, $attach_meta );
}
update_post_meta( $post->ID, \'a_image\', $file[\'url\'] );
}
}
}
嘿,为什么不挥霍一下,给自己买一份
PhpStorm? 如果你能像我现在这样跟踪代码,你可以很容易地自己解决这个问题,你已经很接近了。如果你这样做了,不要把时间浪费在马车上
XDEBUG 而是下载
Zend Debugger.
P、 这是我以前的回答。在我意识到Jared的确切要求之前,我发布了这篇文章。这是正确的,但与他的问题无关。:)
我想你要找的是add_image_size()
:
add_image_size( $size_id, $width, $height, $crop );
例如:
add_image_size(\'headshot\', 130, 150);
add_image_size(\'large-headshot\', 260, 300);
通过设置此选项,WordPress将自动创建这些尺寸。你需要什么?