我的多站点设置有一种管理站点,用户可以在其中插入/编辑帖子,并指定要在哪个站点上发布帖子。这是合同要求,不能更改。
EDIT: Check the accepted answer for a much simpler approach to this.
插入内容的基本步骤已经完成,并且可以使用switch_to_blog()
但我们在上传文件时遇到了一些不适。我们决定使用WP上传器,因此,将管理媒体库作为上传文件的沙盒。所以过程是这样的:
客户端在表单上插入新帖子和图像。
WP Uploader处理上传、处理,并将文件临时放置在管理站点媒体库中,自定义值表示其用户ID和会话ID(目前我们还没有帖子ID)。
用户单击保存帖子。
系统火灾wp_insert_post()
并获取返回的帖子ID和:
<?php
// functions.php inside the function triggered upon post save
foreach ($files as $f) {
restore_current_blog();
/*
* 5. System copies the files from the Admin Site Uploads Dir to the Selected Site Uploads Dir.
*/
$filename = get_attached_file($f);
$arq = get_post($f, ARRAY_A);
$filedest = str_replace(\'blogs.dir/22/\', \'blogs.dir/\' . $marca . \'/\', $filename);
if (copy($filename, $filedest)) {
switch_to_blog($marca);
unset($arq[\'ID\']);
/*
* 6. System fires `wp_insert_attachment()`, `wp_generate_attachment_metadata()`
* and `wp_update_attachment_metadata()` associating the newly moved files to the
* returned Post ID from step 4.
*
*/
$att = wp_insert_attachment($arq, $filedest, $err);
if ($att) {
$attach_data = wp_generate_attachment_metadata( $att, $filedest );
wp_update_attachment_metadata( $att, $attach_data );
if ($f == $destaque) {
update_post_meta($err, \'_thumbnail_id\', $att);
}
restore_current_blog();
/*
* 7. System deletes the old images from the Admin Media Library aka Sandbox.
*/
$del = wp_delete_attachment( $f, true );
$msg = \'8. User is (should be) happy his files are properly put in place and goes on with his life.\';
} else {
echo \'erro\';
}
}
}
?>
将文件复制到正确的路径并正确管理附件后,我们发现尽管主文件已存在并已附加到正确的帖子,但我们正在调用
wp_generate_attachment_metadata
和
wp_update_attachment_metadata
在…内
switch_to_blog()
没有生成在目标站点上定义的中间大小,因此没有连接到的函数
add_attachment
. 罢工>
我怀疑这与管理站点功能触发的操作有关。无法访问其他网站的功能。
那么,有没有更聪明的方法来移动这些图像,就像它们是目标站点的本地图像一样?
最合适的回答,由SO网友:moraleida 整理而成
谁会说解决方案会这么简单。。。
经过几天的斗争,我突然想到:“如果我们switch_to_blog()
在媒体上载iframe内?“如果我们要求用户保存帖子怎么办before 上载任何图像
事实证明,我没有回答为什么我们一开始不这么做,因此,在要求用户在上传任何图像之前保存帖子之后,解决方案变得简短而甜蜜:
1) Add site_id
to the GET variables being passed to media-uploader:
<script type="text/javascript">
jQuery(function(){
var site_id = <?php echo json_encode($siteid); ?>;
var post_id = <?php echo json_encode($conteudo->ID); ?>;
jQuery(\'.btn_incluir_imagem\').click(function() {
formfield = jQuery(\'#upload_image\').attr(\'name\');
tb_show(\'\', uploader+\'media-upload.php?sid=\'+site_id+\'&post_id=\'+post_id+\'&type=image&TB_iframe=true&\');
return false;
});
// More code here
});
</script>
2) And retrieve it from inside the iframe, right after hooking the scripts and styles:
function admin_styles_scripts_media_upload(){
// Registers and enqueues
if($_GET[\'sid\']) {
switch_to_blog($_GET[\'sid\']);
}
// Any images uploaded here will be directed straight to the post_id inside site_id
}
add_action(\'admin_print_scripts-media-upload-popup\',\'admin_styles_scripts_media_upload\');
这个简单的技巧允许您将媒体从任何站点上载到网络中的任何其他站点,只要您已经拥有目标站点的
site_id
和
post_id
. 无需手动复制文件和重新生成元数据,大量代码直接进入垃圾桶,耶!)
此外,由于我们处于iframe中,唯一的方法是关闭窗口,而不是调用restore_current_blog()
不会造成任何不良影响。