问题描述

我将要写一个脚本来全新安装 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。