2017-12-11 11 views
1

私はフロントエンドから製品をアップロードするためにベンダーに提供したいWoocommerceサイトを作成しています。しかし、私はwoocommerceのダウンロード可能な製品を追加しようとしているところに固執しています。Woocommerceにダウンロード可能な製品にプログラムでダウンロードを追加する

は、ここに私の現在のコードです:

//Let's upload the download file Zip 
    $zipattachment_id = upload_music_files($music_ID, $musicZip); //This is my custom function which returns attachment id after file upload 

    $download_file_name = $musicZip['name']; 
    $download_file_url = wp_get_attachment_url($zipattachment_id); 
    $md5_download_num = md5($download_file_url); 

    //creating array of download product 
    $downloadable_file[$md5_download_num] = array(
     'id' => $md5_download_num, 
     'name' => $download_file_name, 
     'file' => $download_file_url, 
     'previous_hash' => '' 
    ); 
    $downloadMusic = serialize($downloadable_file); 

    // adding downloadble file with the new array 
    add_post_meta($music_ID, '_downloadable_files', $downloadMusic); 

しかし、私は、バックエンドから何のダウンロード可能なファイルの終了を製品の編集を開いていないとき。ここで

がseriallized配列の例リターンです:

a:1:{s:32:"22618d7f028803f57f98ab6b21277387";a:4:{s:2:"id";s:32:"22618d7f028803f57f98ab6b21277387";s:4:"name";s:5:"1.zip";s:4:"file";s:71:"http://mydomain/wp-content/uploads/2017/12/5a2e22cecaca6_1.zip";s:13:"previous_hash";s:0:"";}} 

私は、woocommerceの最新バージョンで働いている誰もが私が間違っているのものを私に提案することができ、何が正しい方法することができますか?

答えて

0

WC_ProductWC_Product_Downloadの方法を使用することをお勧めします。私は、あなたのコードの名前を少し変えて名前を変更/再表示しました。

コード:

//This is my custom function which returns attachment id after file upload 
$zip_attachment_id = upload_music_files($music_id, $music_zip); 

$file_name = $music_zip['name']; 
$file_url = wp_get_attachment_url($zip_attachment_id); 
$download_id = md5($file_url); 

// Creating an empty instance of a WC_Product_Download object 
$pd_object = new WC_Product_Download(); 

// Set the data in the WC_Product_Download object 
$pd_object->set_id($download_id); 
$pd_object->set_name($file_name); 
$pd_object->set_file($file_url); 

// Get an instance of the WC_Product object (from a defined product ID) 
$product = wc_get_product($music_id); // <=== Be sure it's the product ID 

// Get existing downloads (if they exist) 
$downloads = $product->get_downloads(); 

// Add the new WC_Product_Download object to the array 
$downloads[$download_id] = $pd_object; 

// Set the complete downloads array in the product 
$product->set_downloads($downloads); 
$product->save(); // Save the data in database 

は、テストの結果、

は今、あなたはあなたの$music_id変数がでプロダクトIDであることを確認する必要が動作します。

$product = wc_get_product($music_id); 

もしあなたが得るべきでないならあなたの応答のための

global $post; 
$product = wc_get_product($post->ID); 
+0

ありがとう:コード内のいくつかの変更を行うプロダクトID global $product;

ORからglobal $post;$product_id = $post->ID;から直接WC_Productオブジェクト、。 –

関連する問題