Intereting Posts
Сортировка массивов по пользовательской полевой дате Загрузите изображение с веб-страницы в папку загрузок по умолчанию Необходимо уточнить, как правильно вызвать wp_mail () Могу ли я изменить header.php текущей темы через функцию плагина? single.php – как пометить текущую страницу в цикле Получать сообщение по ID user-new.php менее подробный после WP3.1; как вернуться? Странная проблема с полем ввода HIdden и WPAlchemy Выполняет ли вызов AJAX на стороне администратора автоматическое включение пользовательских данных / возможностей? Проверьте, может ли пользователь удалить сообщение Как изменить значение кнопки отправки в комментарии от «Отчета» до «Отправить», Выполнять действия по публикации или обновлению? Можете ли вы добавить визуальный редактор в поле описания для пользовательских таксономий? Неверная ошибка типа сообщения при попытке фильтрации и массового редактирования сообщений Получать индексированный указатель столбца в разбивке по страницам

Загружать изображения с одного сайта на другой в Multisite

В моей многоуровневой настройке есть один сайт типа администратора, где пользователи могут вставлять / редактировать сообщения и указывать, на каком сайте они хотят опубликовать их. Это требование контракта и не может быть изменено.

EDIT: Проверьте принятый ответ на гораздо более простой подход к этому.

Основные шаги по вставке содержимого выполняются и работают с полной мощностью switch_to_blog() но мы испытываем небольшой дискомфорт при switch_to_blog() файлов. Мы решили использовать загрузчик WP и как таковой, сделать медиа-библиотеку администратора простой песочницей для загружаемых файлов.

Таким образом, процесс выглядит следующим образом:

  1. Клиент вставляет новую запись и изображения в форму.

  2. WP Uploader обрабатывает загрузки, хруст и временно помещает файлы в медиа-библиотеку сайта администратора с пользовательскими значениями, представляющими его идентификатор пользователя и идентификатор сеанса (в настоящее время у нас пока нет идентификатора сообщения).

  3. Пользователь нажимает, чтобы сохранить сообщение.

  4. Система запускает wp_insert_post() на правильном сайте и получает возвращенный идентификатор сообщения и:

     <?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'; } } } ?> с <?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 с add_attachment .

Я подозреваю, что это связано с тем, что эти действия уволены с сайта admin.php и не могут получить доступ к функциям другого сайта.

Итак, есть ли более умный способ перемещения этих изображений, как если бы они были родными для целевого сайта?

Кто сказал бы, что решение будет таким простым …

После дней, сражавшихся с этим, меня как-то поразило: «а что, если мы switch_to_blog() внутри медиафайла iframe?» Что делать, если мы хотим, чтобы пользователь сохранил сообщение перед загрузкой каких-либо изображений?

Оказывается, у меня не было ответа на вопрос, почему мы не делали этого на первом месте, поэтому, потребовав, чтобы пользователь сохранил сообщение перед загрузкой любых изображений, решение получилось коротким и сладким:

1) Добавьте site_id в переменные GET, передаваемые медиа-загрузчику:

 <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+'&amp;post_id='+post_id+'&amp;type=image&amp;TB_iframe=true&amp;'); return false; }); // More code here }); </script> 

2) И получить его изнутри iframe, сразу после подключения скриптов и стилей:

 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 . Нет необходимости копировать файлы и повторно генерировать метаданные, много кода прямо на мусорную корзину, yay! 🙂

Кроме того, поскольку мы находимся в iframe, и единственный способ выйти из него – закрыть окно, а не вызвать restore_current_blog() не вызывает никаких побочных эффектов.