web-dev-qa-db-ja.com

Multisiteでサイト間で画像をアップロードする

私のマルチサイト設定には、ユーザーが投稿を挿入/編集したり、公開したいサイトを指定したりできる一種の管理サイトがあります。これは契約上の要件であり、変更することはできません。

編集:これに対するもっと簡単なアプローチについては、受け入れられた答えをチェックしてください。

コンテンツを挿入するための基本的な手順は完了しており、switch_to_blog()の全機能を使用して適切に機能していますが、ファイルのアップロードには少し不快感があります。 WPアップローダを使用することにしました。そのため、アドミンメディアライブラリをアップロードするファイルの単なるサンドボックスにします。

プロセスは次のようになります。

  1. クライアントが新しい投稿と画像をフォームに挿入します。

  2. WPアップローダーは、アップロード、処理、およびユーザーIDとセッションIDを表すカスタム値を使用して一時的に管理サイトのメディアライブラリにファイルを配置します(現時点ではまだ投稿IDはありません)。

  3. ユーザーがクリックして投稿を保存します。

  4. システムは正しいサイトでwp_insert_post()を起動し、返された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';
            }
        }
    }
    ?>
    

ファイルが正しいパスにコピーされ、添付ファイルが適切に管理された後、メインファイルが存在し、正しい投稿に添付されていますが、switch_to_blog()内でwp_generate_attachment_metadataおよびwp_update_attachment_metadataを呼び出しています。生成されていないので、関数はadd_attachmentにフックされていません。

これは、管理サイトのfunctions.phpから起動され、他のサイトの機能にアクセスできないというアクションに関係しているのではないかと思います。

それで、あたかもそれらがターゲットサイトにネイティブであるかのようにこの画像を動かすより賢い方法はありますか?

1
moraleida

誰がその解決策はこれだけ簡単になると言うだろう...

これと戦って何日かした後、どういうわけかそれは私を襲った: "メディアアップロードiframeの中のswitch_to_blog()の場合どうなる?"ユーザーが投稿を保存する必要がある場合、の前に画像をアップロードするとどうなりますか?

そもそもなぜ私たちがこれをやらなかったのか、私は答えがないのですが、画像をアップロードする前にユーザーが投稿を保存することを要求したので、解決策は短くて甘いものでした。

1)メディアアップローダに渡されるGET変数にsite_idを追加してください:

<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がすでにある限り、この簡単なトリックを使用して、ネットワーク内の任意のサイトから他の任意のサイトにメディアをアップロードできます。ファイルを手作業でコピーしてメタデータを再生成する必要はありません。大量のコードを直接ゴミ箱に入れる必要はありません。 :)

また、iframe内にいてウィンドウを閉じることが唯一の方法なので、restore_current_blog()を呼び出さなくても悪影響はありません。

2
moraleida