0

私は PHP 初心者なので、Wordpress インストール内で使用するために作成した PHP 関数に関するアドバイスを探しています。

以下のコードからわかるように、管理者の 1 人が保留中の投稿で「公開」を押すと実行されます。

ユーザーが Gravity Forms 経由でアップロードした Zip ファイルを取得し、.mp3 拡張子のみを解凍します。すべてのファイルを再圧縮して、Amazon S3 ディレクトリの新しいフォルダーに移動します。

コードは、私の限られた知識と、ここでの質問に沿ったいくつかの助けからまとめられています。

だから、これが私が最終的に得たものです:

    add_action('pending_to_publish', 'unzip_to_s3');  
   function unzip_to_s3() { 
   global $post;
   global $wpdb;

   // Only run function if post is portfolio post type
    if ('portfolio' == $post->post_type) {

   // Set temp path
   $temp_path = '../wp-content/uploads/gravity_forms/1-9e5dc27086c8b2fd2e48678e1f54f98c/2013/02/tmp/';

   // Get filename from Zip file
   $file = get_post_meta($post->ID, 'file_url', true);
   $zip_file = basename($file);

   // Create full Zip file path
   $zip_file_path = $temp_path.$zip_file;

   // Generate unique name for temp sub_folder for unzipped files
   $temp_unzip_folder = uniqid('temp_TMS_', true);

   // Create full temp sub_folder path
   $temp_unzip_path = $temp_path.$temp_unzip_folder;

   // Make the new temp sub_folder for unzipped files
   if (!mkdir($temp_unzip_path, 0755, true)) {
    die('Error: Could not create path: '.$temp_unzip_path);
   }

   // Unzip files to temp unzip folder, ignoring anything that is not a .mp3 extension
   $zip = new ZipArchive();
   $filename = $zip_file_path;

   if ($zip->open($filename)!==TRUE) {
      exit("cannot open <$filename>\n");
   }

   for ($i=0; $i<$zip->numFiles;$i++) {
      $info = $zip->statIndex($i);
      $file = pathinfo($info['name']);
      if(strtolower($file['extension']) == "mp3") {
           file_put_contents($temp_unzip_path.'/'.basename($info['name']), $zip->getFromIndex($i));
      } else {
      $zip->deleteIndex($i);
      }
   }
   $zip->close();

   // Re-zip the unzipped mp3's and store new zip file in temp folder created earlier
   $temp_unzip_path = $temp_unzip_path.'/';
   $zip = new ZipArchive();
   $dirArray = array();
   $new_zip_file = $temp_unzip_path.$zip_file;

   $new = $zip->open($new_zip_file, ZIPARCHIVE::CREATE);
   if ($new === true) {
       $handle = opendir($temp_unzip_path);
       while (false !== ($entry = readdir($handle))) {
           if(!in_array($entry,array('.','..')))
           {
               $dirArray[] = $entry;
               $zip->addFile($temp_unzip_path.$entry,$entry);
           }
       }
       closedir($handle);
   } else {
       echo 'Failed to create Zip';
   }

   $zip->close();

   // Set Media bucket dir
   $bucket_path = '../wp-content/uploads/gravity_forms/1-9e5dc27086c8b2fd2e48678e1f54f98c/2013/02/mixtape2/';

   // Generate unique name for sub_bucket
   $sub_bucket = uniqid('TMS_', true);

   // Create full sub_bucket path
   $sub_bucket_path = $bucket_path.$sub_bucket;

   // Make the new sub_bucket
   if (!mkdir($sub_bucket_path, 0755, true)) {
    die('Error: Could not create path: '.$sub_bucket_path);
   }

   // Move mp3's to new sub_bucket 
   // Get array of all source files
   $files = scandir($temp_unzip_path);
   // Identify directories
   $source = $temp_unzip_path;
   $destination = $sub_bucket_path.'/';
   // Cycle through all source files
   foreach ($files as $file) {
    if (in_array($file, array(".",".."))) continue;
        // if move files is successful delete the original temp folder
        if (rename($source.$file, $destination.$file)) {
            rmdir($temp_unzip_path);
        }
    }

   // Delete original Zip file
   unlink($temp_path.$zip_file);

   // Update Custom field for new Zip file location
   update_post_meta($post->ID, 'file_url', 'http://themixtapesite.com/wp-content/uploads/gravity_forms/1-9e5dc27086c8b2fd2e48678e1f54f98c/2013/02/mixtape2/'.$sub_bucket.'/'.$zip_file);

   }
   }

この機能は機能しますが、大きなファイルを扱っているため、処理に時間がかかります...管理者が公開を押すと、この機能がトリガーされますが、ページはこの機能が終了するまでそこに留まります。その後継続します。この関数の実行には、最大で約 5 分かかる場合があります。

私はこの機能を(コードの観点から)最適化しようとしていますが、これをバックグラウンドで実行できる方法があるかどうかも確認して、管理者が他のことを続けることができ、そこに座って待つ必要がないようにします。

どんな助けでも感謝します。

4

1 に答える 1

0

WP cron を試して、その時点でタスクをスケジュールして、バックグラウンドで実行することをお勧めします。そのためのリソースを次に示します。基本的なコンセプトは次のようになります。

if ( ! wp_next_scheduled( 'pending_to_publish' ) ) {
  wp_schedule_single_event($timestamp,'pending_to_publish');
}

add_action('pending_to_publish', 'unzip_to_s3'); 

http://wpengineer.com/1908/use-wordpress-cron/

http://codex.wordpress.org/Category%3aWP-Cron_Functions

https://wordpress.stackexchange.com/questions/42694/run-a-cron-job-or-similar-in-the-background-of-wp-after-post-update-create

于 2013-03-22T14:12:44.363 に答える