2013-04-10 33 views
5

Tôi có cài đặt WordPress và một số plugin được cài đặt và kích hoạt. Nhưng tôi đã mất các tệp gốc .zip. Tôi muốn cài đặt một số plugin vào một WordPress mới.Có thể tạo tệp zip plugin WordPress từ một plugin đã cài đặt không?

I không muốn di chuyển/di chuyển/sao lưu - khôi phục toàn bộ cài đặt WP hiện tại. Tôi chỉ muốn tạo lại các plugin gốc .zip cho một số plugin được cài đặt. Tôi có quyền truy cập vào toàn bộ cây tập tin cũng như cơ sở dữ liệu. Có phương pháp nào để làm điều đó không?

Trả lời

0

Funnily đủ, nó thực sự tầm thường để tạo tệp zip từ plugin hiện có.

Chỉ cần tạo tệp zip chứa thư mục plugin. Các unix lệnh để làm điều đó là:

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

Sau đó bạn có thể tải về các tập tin kết quả my-plugin.zip mà sau đó có thể được sử dụng trong WordPress Plugin cài đặt qua tải lên trên các trang web mới (ví dụ: WP Admin -> Plugins - > Thêm mới -> Tải lên).

Rõ ràng tệp zip sẽ không chứa bất kỳ bảng/mod cơ sở dữ liệu nào, nhưng hầu hết các kiểm tra plugin cho việc cài đặt này và thực hiện bất kỳ nâng cấp cơ sở dữ liệu cần thiết nào lúc cài đặt. Thật không may là không có cách nào để biết liệu đây có phải là vấn đề không cần kiểm tra hay kiểm tra mã nguồn của plugin hay cả hai.

6

Vâng, đầu tiên thêm một liên kết tải về các liên kết hành động plugin:

/** 
* 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); 

Sau đó, phong cách và đính kèm những hành động 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 
}); 

Capture tục $_POST dữ liệu ed và xử lý thư mục plugin để nén:

/** 
* 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); 
}); 

Và cuối cùng, sử dụng một số zipping function found here trên Stack

/** 
* 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(); 
    } 
} 
Các vấn đề liên quan