问题描述
我终于得到这件事我已经尝试了 12 次制作和 12 种不同的方法,但终于得到它的工作,… 有一些。
我做了一个自定义的 metabox 上传和附加图像到帖子,它不需要你使用内置在 WP 中的可怕的 thickbox 媒体上传器。我讨厌那件事不,我所做的只是一组输入 (标题,描述,文件),您也可以复制这些输入,以便添加附加附件。所以你填写字段,选择要上传的图像,并保存草稿或发布帖子。一旦将附件添加到帖子中,metabox 将显示输入字段,以及您添加的每个附件的附件图像的预览图像。标题和描述字段用于生成文件元数据,没有什么可以保存为我知道的 post_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-includes /media.php 中,image_resize()
功能看起来像是最好的,因为它应该是最好的。我只是无法想出我的生活,我失踪了或曾经尝试做过,但做错图像的缩略图。
这是我的工作功能,wp_handle_upload()
的东西和东西,但它也需要创建 100px 的拇指,并使一个像 500 像素 max-width 的图像的大小版本,并保存为上传的新文件。
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'] );
}
}
任何人能够帮助我终于解决这个问题,所以它的工作正常将被爱。我花了这么多可笑的无数小时多次不同的时间试图开发这个东西,文件很烂,而且没有任何关于如何做的好帖子。
谢谢
最佳解决方案
你好 @jaredwilli:
好家伙!伟大的努力,和好的工作。 All-in-all 它可能是 WordPress 的一个很好的补充。
你是如此接近,但是你有 5 到 10 个小失败的假设或代码,看起来像你开始,但没有回到它,因为它不工作。我修改了你的功能,只要我需要纠正它。解决方案如下,我将把 side-by-side 与您或更少的 burned-out 进行比较。 🙂
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 。
附:这是我以前的答案。我发现这一点,我才意识到 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 将自动创建这些大小。你需要什么?
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。