問題描述
我將要寫一個腳本來全新安裝 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();
}
?>
第三種解決方案
刪除你好的帖子 (附評論)
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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。