2012-04-27 44 views
3

我的夢想是在主題中包含一個php文件,該主題檢查是否安裝了一組插件,並安裝那些不是的插件。有點像主題的一組依賴關係,但也只是封裝主題開發的好方法,以包含一組優秀的插件。是否有可能以編程方式安裝來自wordpress主題的插件

我的問題......

  1. 是否有這樣的事情存在?
  2. 是否可以通過主題文件夾中的單個php文件實現?
  3. 這種方法有沒有明顯的凹陷或問題?
  4. 我該如何去實現這一目標?
    • 是否可以從主題文件夾中枚舉已安裝的插件?
    • 是否可以下載插件文件並將其放置在插件文件夾中?
    • 是否可以從主題目錄內激活插件?
+1

你問的大部分內容都是Wordpress能夠做的事情,這意味着你可以看看他們是如何做到的。例如,wordpress可以讓你安裝插件,激活插件等。看看他們是如何做到的。 – 2012-04-27 15:56:34

回答

14

我建議不要以編程方式檢查一些插件的存在,下載,安裝,並從任何主題文件中激活它們。您必須考慮到每次加載給定頁面時都會運行檢查,並可能導致大量多餘的代碼和不必要的活動。

相反,我的建議是將你的主題所依賴的任何插件作爲主題本身的一部分進行打包,而不是作爲插件。插件應該由用戶自行決定安裝。如果一個主題取決於一個插件的正確或有效運作,那麼它確實應該與主題一起打包和下載。

但直接回答你的問題:

  1. 可能。這當然是可以做到的。
  2. 是的。
  3. 看上面。您可能會遇到更多問題,通過不斷檢查插件並根據這些條件運行一系列操作,而不是僅僅包含所需的所有內容。
  4. Plenty of research

    • 大概

我不能強調不夠,但是,一個插件的目的是給用戶的選項擴展給定主題的功能。如果你的主題的功能取決於現有的插件,那麼當有人下載​​你的主題時,你真的應該包括所有的文件。

雖然如果您覺得您的方法以我可能會丟失的方式來使您的主題受益,請隨時按照您的喜好寫下它。

完整答案:我決定幫助爲您創建一個概念驗證,因爲我感到無聊和好奇。這很大程度上應該是自我解釋。添加這些功能:

function mm_get_plugins($plugins) 
{ 
    $args = array(
      'path' => ABSPATH.'wp-content/plugins/', 
      'preserve_zip' => false 
    ); 

    foreach($plugins as $plugin) 
    { 
      mm_plugin_download($plugin['path'], $args['path'].$plugin['name'].'.zip'); 
      mm_plugin_unpack($args, $args['path'].$plugin['name'].'.zip'); 
      mm_plugin_activate($plugin['install']); 
    } 
} 
function mm_plugin_download($url, $path) 
{ 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = curl_exec($ch); 
    curl_close($ch); 
    if(file_put_contents($path, $data)) 
      return true; 
    else 
      return false; 
} 
function mm_plugin_unpack($args, $target) 
{ 
    if($zip = zip_open($target)) 
    { 
      while($entry = zip_read($zip)) 
      { 
        $is_file = substr(zip_entry_name($entry), -1) == '/' ? false : true; 
        $file_path = $args['path'].zip_entry_name($entry); 
        if($is_file) 
        { 
          if(zip_entry_open($zip,$entry,"r")) 
          { 
            $fstream = zip_entry_read($entry, zip_entry_filesize($entry)); 
            file_put_contents($file_path, $fstream); 
            chmod($file_path, 0777); 
            //echo "save: ".$file_path."<br />"; 
          } 
          zip_entry_close($entry); 
        } 
        else 
        { 
          if(zip_entry_name($entry)) 
          { 
            mkdir($file_path); 
            chmod($file_path, 0777); 
            //echo "create: ".$file_path."<br />"; 
          } 
        } 
      } 
      zip_close($zip); 
    } 
    if($args['preserve_zip'] === false) 
    { 
      unlink($target); 
    } 
} 
function mm_plugin_activate($installer) 
{ 
    $current = get_option('active_plugins'); 
    $plugin = plugin_basename(trim($installer)); 

    if(!in_array($plugin, $current)) 
    { 
      $current[] = $plugin; 
      sort($current); 
      do_action('activate_plugin', trim($plugin)); 
      update_option('active_plugins', $current); 
      do_action('activate_'.trim($plugin)); 
      do_action('activated_plugin', trim($plugin)); 
      return true; 
    } 
    else 
      return false; 
} 

...,然後執行,像這樣:

$plugins = array(
    array('name' => 'jetpack', 'path' => 'http://downloads.wordpress.org/plugin/jetpack.1.3.zip', 'install' => 'jetpack/jetpack.php'), 
    array('name' => 'buddypress', 'path' => 'http://downloads.wordpress.org/plugin/buddypress.1.5.5.zip', 'install' => 'buddypress/bp-loader.php'), 
    array('name' => 'tumblr-importer', 'path' => 'http://downloads.wordpress.org/plugin/tumblr-importer.0.5.zip', 'install' => 'tumblr-importer/tumblr-importer.php') 
); 
mm_get_plugins($plugins); 

「名」可以是任何東西,因爲它提供更加臨時值的。 'path'正是它的外觀,並且是Wordpress服務器上zip文件的直接URL。 'install'值只是包含所有插件信息的主PHP腳本的路徑。您必須知道該特定插件目錄的佈局才能填寫此信息,因爲這也是激活黑客工作所必需的。

激活功能發現這裏(信貸sorich87):https://wordpress.stackexchange.com/questions/4041/how-to-activate-plugins-via-code

警告:這絕不是一個非常安全的方式來做事。我實際上認爲這很容易被濫用,所以我們最好的選擇是以此作爲我們的基準,並從那裏嘗試和改進。

如果你應該決定使用這種方法,我所要求的是我的初始整體腳本以及他的激活過程中的sorich87。

+0

感謝您徹底,周到的答覆。我想我正試圖解決兩個問題。一個是所有的主題依賴符合,你正確地宣佈應該沒有插件。其次,要以簡單的方式安裝我最終爲客戶端安裝的所有常規良好插件。我希望客戶能夠安裝主題,然後自動安裝所有插件,但不會失去將來刪除或修改它們的能力,如果他們願意的話。 – 2012-04-27 16:37:34

+0

爲什麼我要這樣做的一個例子是,我可以添加一個插件來修改html編輯器,以便爲主題使用的某個類定義div。它是主題功能的重要組成部分,可以輕鬆編輯帖子並將部分標記爲特定類別。然而,我不想限制客戶進一步修改,或者如果他們覺得他們有更好的方法來做這件事,那麼可以改變後端系統。關於這一點你有什麼想法嗎? – 2012-04-27 16:40:07

+0

在這種情況下,如果您包含一系列插件作爲建議的工具欄,那麼我可以看到您的方法比最初的想法更有幫助並且不那麼突兀。我個人採取的方法而不是自動化整個事情將是在一些主題文檔中包含一系列建議插件鏈接(也許在您的主題選項中)。但它真的歸結爲個人偏好。現在你已經澄清了你的方法,我可以說你的想法在提高可用性方面沒有任何內在的錯誤。 – maiorano84 2012-04-27 16:47:48

0

the comment from Jamie Dixon的啓發我檢查了Wordpress的工作原理。

該過程可以在/wp-admin/update.php from line 93中看到。短版可以作出這樣的:

include_once(ABSPATH . 'wp-admin/includes/plugin-install.php'); //for plugins_api.. 

$plugin = 'plugin-name'; 

$api = plugins_api('plugin_information', array(
    'slug' => $plugin, 
    'fields' => array(
     'short_description' => false, 
     'sections' => false, 
     'requires' => false, 
     'rating' => false, 
     'ratings' => false, 
     'downloaded' => false, 
     'last_updated' => false, 
     'added' => false, 
     'tags' => false, 
     'compatibility' => false, 
     'homepage' => false, 
     'donate_link' => false, 
    ), 
)); 

//includes necessary for Plugin_Upgrader and Plugin_Installer_Skin 
include_once(ABSPATH . 'wp-admin/includes/file.php'); 
include_once(ABSPATH . 'wp-admin/includes/misc.php'); 
include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'); 

$upgrader = new Plugin_Upgrader(new Plugin_Installer_Skin(compact('title', 'url', 'nonce', 'plugin', 'api'))); 
$upgrader->install($api->download_link); 

如果你不想反饋顯示你應該創建一個自定義外觀類也。例如:

$upgrader = new \Plugin_Upgrader(new Quiet_Skin()); 

class Quiet_Skin extends \WP_Upgrader_Skin { 
    public function feedback($string) 
    { 
     // just keep it quiet 
    } 
} 
+0

@thomas:我對PHP和WordPress很陌生,但我正在製作一個插件來練習我的技能。我的插件應該檢查​​是否安裝了其他插件(這有效),如果沒有,它應該安裝它們(這還沒有工作)。我想使用你的方法,因爲它使用了Wordpress的功能。但我不知道如何使用,你能舉個例子嗎?我試圖安裝的第一個插件是Yoast SEO。感謝您的幫助 – switch87 2017-01-06 14:30:50

相關問題