2013-04-10 90 views
5

我有一個WordPress安裝和一些插件安裝和激活。但是我丟失了原來的插件.zip文件。我想將一些插件安裝到新的WordPress中。是否可以從安裝的插件創建WordPress插件zip文件?

不要想要遷移/移動/備份 - 恢復整個當前WP安裝。我只想爲已安裝的一些插件重新創建原始插件.zip文件。我可以訪問整個文件樹以及數據庫。有沒有辦法做到這一點?

回答

0

有趣的是,從現有的插件創建一個zip文件實際上是微不足道的。

只需創建一個包含插件文件夾的zip文件。在Unix命令這樣做是:

$ cd wp-content/plugins 
$ zip -r my-plugin.zip my-plugin 

然後,您可以下載,然後可以在WordPress插件來通過上傳新的網站(安裝所產生的my-plugin.zip文件即:WP管理 - >插件 - >添加新的 - >上傳)。

很顯然,zip文件不會包含任何數據庫表/ mods,但大多數插件都會在安裝時測試這一點,並在安裝時執行任何所需的數據庫升級。不幸的是,沒有測試或檢查插件源代碼或兩者都不知道這是否會成爲問題。

6

是,先添加一個下載鏈接插件操作鏈接:

/** 
* Add action links to each plugin 
* @author brasofilo 
*/ 
add_filter('plugin_action_links', function ($plugin_meta, $plugin_file, $plugin_data, $status) 
{ 
    $plugin_dir = dirname($plugin_file); 
    if(!empty($plugin_dir) && '.' !== $plugin_dir) 
     $plugin_meta[] = sprintf( 
      "<a href='#' class='down-zip down-icon' data-file='%s' title='%s'></a>", 
      $plugin_dir, 
      'Download zip file for ' . $plugin_data['Name'] 
     ); 
    else 
     $plugin_meta[] = "Root plugin, cannot zip"; 

    return $plugin_meta; 
}, 10, 4); 

然後風格,重視JS行動:

/** 
* Style and actions for wp-admin/plugins.php 
* @author brasofilo 
*/ 
add_action('admin_footer-plugins.php', function() { 
    ?> 
    <style> 
    .down-icon:before { /* http://melchoyce.github.io/dashicons/ */ 
     content: "\f316"; 
     display: inline-block; 
     -webkit-font-smoothing: antialiased; 
     font: normal 20px/1 'dashicons'; 
     vertical-align: top; 
    } 
    </style> 
    <script> 
    root_wp = '<?php echo WP_PLUGIN_DIR; ?>' + '/'; 

    /** 
    * Virtual $_POST 
    * creates form, appends and submits 
    * 
    * @author https://stackoverflow.com/a/9815335/1287812 
    */ 
    function b5f_submit_form_post(path, params, method) 
    { 
     $ = jQuery; 
     method = method || "post"; // Set method to post by default, if not specified. 

     var form = $(document.createElement("form")) 
      .attr({"method": method, "action": path}); 

     $.each(params, function(key,value) 
     { 
      $.each(value instanceof Array? value : [value], function(i,val) 
      { 
       $(document.createElement("input")) 
        .attr({ "type": "hidden", "name": key, "value": val }) 
        .appendTo(form); 
      }); 
     }); 

     form.appendTo(document.body).submit(); 
    } 

    jQuery(document).ready(function($) 
    { 
     /** 
     * Fire a plugin download 
     */ 
     $("a.down-zip").click(function() 
     { 
      event.preventDefault(); 

      b5f_submit_form_post('', { 
       action: 'zip_a_plugin', 
       plugin_to_zip: root_wp + $(this).data('file'), 
       plugin_name: $(this).data('file') 
      }); 
     }); 
    });    
    </script> 
    <?php 
}); 

捕獲自定義$_POST版數據和將插件目錄處理爲zip:

/** 
* Dispatch $_POST['action']=>'zip_a_plugin' custom action 
* @author brasofilo https://stackoverflow.com/a/23546276/1287812 
*/ 
add_action('admin_action_zip_a_plugin', function() 
{ 
    if(empty($_REQUEST['plugin_to_zip'])) 
     return; 

    zipFile($_REQUEST['plugin_to_zip'], $_REQUEST['plugin_name'], false); 
}); 

,最後使用的堆棧一個zipping function found here

/** 
* Makes zip from folder 
* @author https://stackoverflow.com/a/17585672/1287812 
*/ 
function zipFile($source, $destination, $flag = '') 
{ 
    if (!extension_loaded('zip')) { 
     return false; 
    } 

    $zip = new ZipArchive(); 
    $tmp_file = tempnam(WP_CONTENT_DIR,''); 
    if (!$zip->open($tmp_file, ZIPARCHIVE::CREATE)) { 
     return false; 
    } 

    $source = str_replace('\\', '/', realpath($source)); 
    if($flag) 
    { 
     $flag = basename($source) . '/'; 
     //$zip->addEmptyDir(basename($source) . '/'); 
    } 

    if (is_dir($source) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 
     foreach ($files as $file) 
     { 
      $file = str_replace('\\', '/', realpath($file)); 

      if (is_dir($file) === true) 
      { 
       $src = str_replace($source . '/', '', $flag.$file . '/'); 
       if(WP_PLUGIN_DIR.'/' !== $src) # Workaround, as it was creating a strange empty folder like /www_dev/dev.plugins/wp-content/plugins/ 
        $zip->addEmptyDir($src); 
      } 
      else if (is_file($file) === true) 
      { 
       $src = str_replace($source . '/', '', $flag.$file); 
       $zip->addFromString($src, file_get_contents($file)); 
      } 
     } 
    } 
    else if (is_file($source) === true) 
    { 
     $zip->addFromString($flag.basename($source), file_get_contents($source)); 
    } 

    $tt = $zip->close(); 
    if(file_exists($tmp_file)) 
    { 
     // push to download the zip 
     header('Content-type: application/zip'); 
     header('Content-Disposition: attachment; filename="'.$destination.'"'); 
     readfile($tmp_file); 
     // remove zip file is exists in temp path 
     exit(); 
    } 
    else { 
     echo $tt; 
     die(); 
    } 
}