問題描述

我將要寫一個指令碼來全新安裝 WordPress 3.0.1 和 add-in 所有網站的初始功能。這是一個安裝了很多類似網站的公司,他們需要一個標準的配置和資料起點。

  • 我想知道其他人是否已經這樣做,如果可以分享他們的程式碼呢?

我想我們會在每次建立一個新的網站時調整這個指令碼,所以 hard-coding 很好,儘管最終 (經過足夠的經驗) 我想轉換成一個外掛。

以下是我認為我們需要的基本任務列表 (這些假定我已經安裝了 WordPress 3.0.1,並將自定義外掛和自定義主題複製到相應的目錄中):

// Create users for the current site
// Delete Hello Dolly Plugin
// Download, Install and Activate repository plugins
// Activate Custom Plugins (assume the plugins are already there)
// Activate Custom Theme
// Delete Hello Post
// Delete Comment on Hello Post
// Create Pages with Starter Content
// Create Initial Custom Post Types with Starter Content
// Create Multiple Menus 
// Create Menu Items for those Menus linking to Pages and wp-login.php
// Create Initial Taxonomy Terms
// Set Desired Permalinks Setting
// Set Static Front Page Setting

就是這樣 (儘管我可以識別出更多的東西)

再次,我正在尋找我可以複製和修改的程式碼,所以我沒有必要自己找出所有這些細節 (這不是很難,只是乏味和耗時) 。

哦,還有一件事,我現在要開始,所以越早越好! 🙂

最佳解決方案

正如我所說,我將立即著手開展這一需求,以便我取得進展。鑑於我正在敲這些下來,我認為最好開始釋出它們。不過,如果其他人能夠/將釋出 (一些) 我沒有做的部分,我會很高興讓你複製我沒有做的任何事情,並選擇你的答案作為最好的答案。在此之前,我將開始釋出程式碼。

第一件事:包括 wp-load.php

由於我們在網站根目錄下建立一個獨立的檔案,只能執行初始化,只能用於”bootstrap” 的一個站點 (我稱之為/my-init.php),我們從/wp-load.php 開始載入 WordPress API 函式:

<?php
include "wp-load.php";

為網站建立使用者

我們將使用/wp-includes/registration.php 中的 wp_insert_user()功能來建立我們的使用者。預設情況下,此檔案未載入,因此我們必須透過呼叫 require_once()來載入該檔案。

我們還將使用 get_user_by()函式來首先檢視使用者是否已經建立; 如果沒有,則不需要執行程式碼兩次。注意:這是一個模式將遵循; 例如如果多次呼叫,我們的指令碼不應該重複或覆蓋任何東西,特別是在使用者新增或更改了我們計劃初始化的任何專案的資料之後。

require_once( ABSPATH . WPINC . '/registration.php');     
$user = get_user_by('slug','johnsmith');
if (!is_object($user)) {
  wp_insert_user(array(
    'user_login'        => 'johnsmith',
    'role'              => 'administrator',
    'user_email'        => 'johnsmith@example.com',
    'user_url'          => 'http://example.com',
    'first_name'        => 'John',
    'last_name'         => 'Smith',
    'comment_shortcuts' => '',
    'use_ssl'           => '0',
    'user_pass'         => '12345',
  ));
}

刪除”Hello Dolly” 外掛

要刪除”Hello Dolly” 外掛 (sorry Matt),我們將使用 delete_plugins()功能。 delete_plugins()需要一組相對於/wp-content/includes/目錄的檔案路徑。對於 Hello Dolly 外掛,檔案路徑只是 hello.php,因為 Hello Dolly 外掛不儲存在自己的目錄中,但對於大多數外掛,它將以 {$subdir}{$filename}.php 的形式儲存; 即 Akismet 的檔案路徑是 akismet/akismet.php

然而,delete_plugins()在我們已經包括/wp-admin/includes/plugin.php 並且還與 wp-admin/includes/file.php 有關係的情況下是不可用的,所以我們 require_once()之前我們稱之為 delete_plugins()。最後,我們使用 WP_PLUGIN_DIR 常數與 file_exists()結合來檢視主外掛檔案是否存在,然後再嘗試刪除它 (如果我們嘗試刪除一個缺少的檔案,那麼這樣做會很重要) 知道如何由於其他原因):

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
if (file_exists(WP_PLUGIN_DIR . '/hello.php'))
  delete_plugins(array('hello.php'));

請注意,有時 delete_plugins()將失敗,因為檔案許可權或者也許事實上一個外掛當前被啟用或其他一些原因,你會首先需要解決,但是我們的 use-case 你好 Dolly 消失,沒有戰鬥。

下載,安裝和啟用儲存庫外掛

我現在實際上並不需要從儲存庫中下載外掛 (我認為這只是一個很好的),我們將要讓這個要求滑動並稍後重新訪問。

啟用你的外掛

接下來是啟用我們自己的定製外掛。我們假設我們已經將它們上傳到外掛目錄,我們需要做的只是為 WordPress 啟用它們。 (注意:這種技術也可以用於啟用儲存庫外掛,它不會首先下載和安裝。)

我們將使用像 delete_plugins()這樣的 activate_plugin()功能,需要包含/wp-admin/includes/plugin.php,但不需要/wp-admin/includes/file.php,只需要自動啟用而不是刪除。

我們將再次測試存在 (不需要啟用,如果不在那裡,嗯?),我們還將使用 is_plugin_active()功能驗證外掛尚未被啟用。注意我這次使用了幾個變數 ($plugin_filepath$plugin_dir) 來防止多次重複外掛識別符號。

以下我們的例子啟用位於 my-custom-plugin 子目錄中的外掛 my-custom-plugin.php

require_once(ABSPATH . 'wp-admin/includes/plugin.php');
$plugin_filepath = 'my-custom-plugin/my-custom-plugin.php';
$plugin_dir = WP_PLUGIN_DIR . "/{$plugin_filepath}";
if (file_exists($plugin_dir) && !is_plugin_active($plugin_filepath))
  activate_plugin($plugin_filepath);

啟用您的首選主題

相對而言,啟用主題比刪除或啟用外掛要容易一些; 一個函式呼叫是所需要的:switch_theme()switch_theme()函式接受兩個引數:模板和樣式表。那麼至少這就是引數的名字。您可能會更熟悉 「主題和兒童主題」 這一術語。

假設您建立了一個兒童主題,預設的 TwentyTen 主題隨附 WordPress 為父主題,並將其稱為 「我的自定義主題」,並將其放入/wp-content/themes/my-custom-theme 目錄中,您可以使用此呼叫啟用您的主題:

switch_theme('twentyten', 'my-custom-theme');

但是如果不是一個孩子主題呢?這很簡單,只需傳遞目錄 slug /主題識別符號 (即包含您的主題的/wp-content/themes 的子目錄的名稱) 作為兩個引數。假設您要啟用 Ian D Stewart 的 Thematic 主題,您可以這樣呼叫 switch_theme()

switch_theme('thematic', 'thematic');

就個人而言,我想在這裡跟蹤這兩個細節是有點麻煩的,所以我寫了一個名為 activate_my_theme()的函式,它首先檢查以確保 get_current_theme()功能,如果沒有啟用它。您只需要告訴孩子主題 (又名”stylesheet”),並透過抓取 get_theme()功能的詳細資訊,為您 (即”template”) 確定了父主題。

activate_my_theme('My Current Theme');
function activate_my_theme($theme_name) {
  if ($theme_name!=get_current_theme()) {
    $theme = get_theme($theme_name);
    switch_theme(
      $theme['Template'],
      $theme['Stylesheet']
    );
  }
}

要注意的一個關鍵點 get_theme()函式希望透過 Child Theme 的名稱,而不是目錄 slug /主題識別符號。 (該名稱來自主題 style.css 檔案標題中的 「主題名稱」 部分,幸運的是,get_current_theme()函式也返回名稱)

檢查 WordPress 預設主題的 style.css 檔案中的標題二十十我們看到它的名字其實是'Twenty Ten'

/*
Theme Name: Twenty Ten
Theme URI: http://wordpress.org/
Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar.
Author: the WordPress team
Version: 1.1
Tags: black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style
*/

刪除”Hello World” 帖子

接下來我們要刪除”Hello World” 的帖子。您可能已經看到 @Rarst 向我們展示瞭如何使用我們所需要的 wp_delete_post()功能。正如他解釋的第二個引數將完全刪除帖子,而不是將其移動到垃圾箱,第一個引數是 $post->ID

當然,能夠指定插頭而不是 $post->ID 是很好的,所以我決定找到一種方法來做到這一點。經過一番刺激,我發現 WordPress 有一個不幸的命名函式 get_page_by_path()實際上允許我們查詢任何 post 型別的 slug(不幸的命名,因為你可能會忽略它,當試圖找到一些與'page'以外的其他型別的工作。)

由於我們透過了 get_page_by_path()的 WordPress-defined 常數 OBJECT 它會以 post 物件的形式返回給我們一個帖子。對於第三個引數,我們透過了'post'來表示我們希望查詢'post'的帖子型別。由於 get_page_by_path()將返回 Post 物件,我們需要或返回 null,如果沒有帖子匹配的 slug 我們可以檢查存在,並在同一時間進行查詢:

$post = get_page_by_path('hello-world',OBJECT,'post');
if ($post)
  wp_delete_post($post->ID,true);

注意:我們可以執行程式碼來刪除資料庫中的每個帖子,但是如果我們新增了我們想要保留的帖子,那麼我們將無法再次執行此程式碼,這是我們的設計約束之一。

下一個…

我會繼續新增,因為我弄清楚,直到完成或直到有人幫助。

次佳解決方案

設定所需的固定連結

我本週遇到的一個重點是 HTML5 /CSS3 功能的新的 (令人敬畏的) 主題專案,它擁有自己的’bootstrap’ 指令碼,可以建立一些樣板內容,包含永久連結設定,設定站點安裝的相對根等。呼籲主題啟用。該專案稱為 Roots,程式碼可以下載 here; 我沒有信用這個程式碼。也就是說,這裡是 auto-set /年/postname 作為永久連結結構的程式碼 (並且全域性 $ pagenow 的下面的啟用鉤子在這裡解釋:http://foolswisdom.com/wp-activate-theme-actio/) 。

<?php

    global $pagenow;
    if (is_admin() && 'themes.php' === $pagenow && isset( $_GET['activated'])) {


        // set the permalink structure
        if (get_option('permalink_structure') != '/%year%/%postname%/') { 
            update_option('permalink_structure', '/%year%/%postname%/');
      }

        $wp_rewrite->init();
        $wp_rewrite->flush_rules(); 


    }

?&GT;

第三種解決方案

刪除你好的帖子 (附評論)

wp_delete_post( 1, true );

直接從 wp_delete_post()檔案。第二個引數是徹底的,而不是移動到垃圾。

建立選單

這將建立新選單,並將所有現有頁面新增為專案。我不知道這是完全正確的,我無法獲得選單項,以顯示 Page 標籤等。無論如何,我的大腦正在融化,所以我正在休息。也許有人可以將其升級到更可靠的地方。

$menu = wp_create_nav_menu( 'Pages' );
$menu = wp_get_nav_menu_object( 'Pages' );
$pages = get_pages();

foreach( $pages as $page ) {

$item = array(
'menu-item-db-id' => 0,
'menu-item-object-id' => $page->ID,
'menu-item-type' => 'post_type',
'menu-item-status' => 'publish'
);

wp_update_nav_menu_item( $menu->term_id, 0, $item );
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。