我将不得不编写一个脚本来重新安装WordPress 3.0.1,并为网站添加所有初始功能。这适用于安装了许多类似网站的公司,并且它们需要在配置和数据方面有一个标准的起点。


我想知道是否有人已经这样做了,如果可以,是否他们可以共享他们的代码? 。

这是我认为我们需要的基本任务列表(这些假定我已经安装了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


就是这样(尽管我可能会在进入时找到更多。)只需复制和修改,这样我就不必自己弄清楚所有这些细节(这并不困难,既乏味又耗时)。

我还有另一件事从现在开始,越早越好! :-)

评论

您能澄清一下“为自定义页面创建菜单”吗?您是指某些页面上的各个菜单区域还是什么?

嗨,@ Rarst:我需要创建三个菜单,每个菜单项都带有要链接到要添加的“自定义页面”的菜单项(我对“自定义”的使用可能会造成混淆,我会丢掉这个词,只说“页面”。)我需要为每个菜单项之一(其中一个菜单项需要链接到登录页面)添加三个菜单和菜单项。

为什么要删除“ Hello Dolly”插件?我的意思是,我了解您为什么不希望它在那里,但是它的存在并不影响站点的运行,如果您使用自动升级功能,则每次发布新版本时,它都会被还原。 />
嗨@Doug:为什么删除Hello Dolly?简单的答案:客户在那儿不想要它。 :)

#1 楼

正如我提到的那样,我将立即着手解决这一需求,因此我正在取得进展。考虑到我要把它们拆下来,我认为最好开始发布它们。不过,如果其他人可以/愿意张贴(某些)我尚未完成的部分,我将很乐意让您复制未完成的所有内容,然后选择答案作为最佳答案。在此之前,我将开始发布代码。

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

因为我们正在网站的根目录中创建一个独立文件来运行初始化将仅用于“引导”网站(我称我为/my-init.php),我们首先包括/wp-load.php来加载WordPress API函数:
网站

我们将使用位于wp_insert_user()中的/wp-includes/registration.php函数来创建我们的用户。此文件默认情况下未加载,因此我们必须通过调用require_once()来自己加载该文件。

我们还将使用get_user_by()函数首先查看用户是否已经创建;如果没有,则无需运行两次代码。注意:这将是一种模式;例如如果多次调用,我们的脚本不应重复或覆盖任何内容,尤其是在用户添加或更改了我们计划初始化的任何项目的数据之后。

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


“ Hello Dolly”插件

要删除“ Hello Dolly”插件(对不起,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 . 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',
  ));
}


请注意,有时delete_plugins()会由于文件权限而失败,或者可能是当前已激活插件的事实,或者您出于某些其他原因而失败首先需要解决,但对于我们的用例,Hello Dolly会毫发无损。

下载,安装和激活存储库插件

我实际上不需要现在从存储库中下载插件(我当时认为这太好了),我们将让这一要求滑过,稍后再重新访问。

激活插件

下一步是激活我们自己的自定义插件。我们假设我们已经将它们上传到了插件目录,并且我们需要做的所有事情都可以激活它们以支持WordPress。 (注意:此技术也可用于激活存储库插件,只是不会先下载并安装它们。)

我们将使用activate_plugin()函数,就像delete_plugins()一样需要包含/wp-admin/includes/plugin.php,但确实如果只需要自动激活而不是删除,则不需要/wp-admin/includes/file.php

我们将再次测试是否存在(是否不需要激活,是吗?),并且还将使用is_plugin_active()函数验证该插件尚未被激活。注意,这次我使用了一些变量($plugin_filepath$plugin_dir)来避免多次重复插件标识符。

下面的示例将激活位于my-custom-plugin.php子目录中的插件my-custom-plugin

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'));


激活您的首选主题

相对而言,激活主题比删除或激活插件要容易一些;一个函数调用就足够了:switch_theme()switch_theme()函数接受两(2)个参数:模板和样式表。好吧,至少这就是参数的名称。您可能更熟悉术语“父主题”和“子主题”。

假设您已经创建了一个带有默认TwentyTen主题的子主题,WordPress将该主题作为父主题,您将其称为“我的自定义”主题”并将其放置在/wp-content/themes/my-custom-theme目录中,您可以通过以下调用激活您的主题:这很简单,只需将目录slug /主题标识符(即包含主题的/wp-content/themes子目录的名称)作为两个参数传递。假设您要激活Ian D Stewart的主题主题,您可以这样称呼switch_theme()

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


我个人认为必须跟踪这两个细节都在这里,所以我编写了一个名为activate_my_theme()的函数,该函数首先检查以确保get_current_theme()函数,如果没有激活,请先激活它。您只需要告诉它子主题(又称“样式表”),并通过从get_theme()函数中获取细节即可为您找出父主题(又称“模板”)。

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


要注意的一个关键点; get_theme()函数希望传递子主题的名称,而不是目录子目录/主题标识符。 (名称来自主题的style.css文件标题中的“主题名称:”部分。幸运的是,get_current_theme()函数也返回了该名称。)

检查WordPress默认设置的style.css文件中的标题主题二十,我们看到它的名字实际上是'Twenty Ten'

switch_theme('thematic', 'thematic');


删除“ Hello World”帖子

接下来,我们要删除“ Hello World”帖子。您可能已经看到@Rarst向我们展示了如何使用wp_delete_post()函数,这正是我们所需要的。正如他解释的那样,第二个参数将完全删除帖子,而不是将其移到垃圾箱,第一个参数是$post->ID

当然,能够指定弹头而不是$post->ID会很好,因此,我决定找到一种方法来做到这一点。经过一番摸索后,我发现WordPress有一个不幸的名为get_page_by_path()的函数,它实际上允许我们按其子标题查找任何帖子类型(不幸的是,它的名字是因为当您尝试查找与'page'以外的帖子类型兼容的东西时,您可能会忽略它。)

由于我们通过get_page_by_path()传递了WordPress定义的常量OBJECT,它将以post对象的形式返回给我们。对于第三个参数,我们传递了'post'来指示我们希望它查找'post'的帖子类型。由于get_page_by_path()将返回我们需要的post对象,或者如果没有帖子与子弹匹配,则返回null我们可以检查是否存在并同时进行查找:

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']
    );
  }
}


注意:我们可以运行代码来删除数据库中的每个帖子,但是如果添加了我们想要保留的帖子,我们将无法再次运行此代码,这是我们的设计约束之一。

下一个...

我会不断添加,直到我完成为止或直到其他人帮助为止。

评论


这真的很有帮助,是否有可能在此处包含其余功能?

– jjeaton
2010-10-9 2:31

@jjeaton-简短的回答:是的,但是....更长的答案:如果不是几周,那将是几天。自从我上次在这里写信以来,我已经在这个问题上做了大量工作,但是我的客户正在努力完成一个项目,而我落后了,所以...如果您可以稍等一下,我会尽快将其发布获得空闲时间来编写它。顺便说一句,您最感兴趣的方面是什么?

– MikeSchinkel
2010-10-9 4:05



当然,一点都不着急。我认为这个问题非常有价值,因此想查看整个解决方案。我经营着多个WordPress网站,而且我一直在寻找使我必须对其进行重复维护(插件更新,升级等)自动化的方法,因此其中一些确实很有价值。

– jjeaton
2010-10-15在16:20

#2 楼

设置所需的永久链接

我在本周遇到的一个新的(很棒的)主题项目主要关注HTML5 / CSS3功能,它具有自己的“ bootstrap”脚本来创建一些样板内容,合并永久链接设置,站点安装的相对根目录等。这些功能在主题激活时被调用。这个项目叫做Roots,代码可以在这里下载;我不相信这个代码。就是说,这里是将/ year / 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(); 


    }


?>

评论


哦,有计划继续解决这个问题……但是还有其他许多计划正在搁置中。 :)我想指出,最好链接到非教育性的广泛第三方代码段,而不是在此处发布主题。该站点将用户贡献置于cc-wiki许可之下,因此在应用于代码时情况变得晦暗而混乱。

–稀有
2011-4-7 18:40



当然可以尽管如此,这里还是取得了惊人的进展。这对您的建议是一个很好的呼吁,我曾经在Stack Exchange上待过一两次,但从未考虑过许可问题。我编辑了我的代码,其余代码可以从我提供的链接中轻松获得。谢谢你的提示:)

–user4443
2011年4月7日在19:05

#3 楼

wp_delete_post( 1, true );文档中直接删除Hello Hello(带有评论)

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


评论


嗨,@ Rarst:感谢您的评论。啊,你选了一个简单的书... ;-)我只是回来写那个书。

– MikeSchinkel
2010-09-13在7:36



@MikeSchinkel您现在没有在写什么吗?深入菜单代码(很可怕)以得到结果并发现它已经完成是浪费。 :)

–稀有
2010-09-13在7:44

嗨,@ Rarst!从列表的末尾开始? (提前致谢。)

– MikeSchinkel
2010-09-13在7:54



好的,我会尝试处理菜单,但没有任何承诺。该代码内部很复杂(价格合理且实用),因此我不确定自己的技能是否达到要求。

–稀有
2010年9月13日在8:00

嘿@Rarst-我几乎可以完成所有工作,但可能要等24小时左右才能完成答案。只是想让您知道,所以您并没有为了使它正常工作而自杀。感谢您的努力。

– MikeSchinkel
2010-09-13在11:00

#4 楼

如果我理解得很好,那么您就需要它进行初始安装-那么我深信您的方法是完全错误的。

更好,更轻松,更标准化的方法是创建install.php并将其放在wp-content文件夹中-它会在安装过程中自动加载。自己的wp_install函数(如wordpress自己的函数使用if(!function_exist)),因此您可以轻松设置选项,激活插件,填写初始帖子,类别,标签,用户...

第二个选项可能适用于您要清除所有现成的wp的情况(例如,对于使用cron每30分钟设置的演示版本)-您可以a)截断数据库并使用上面的过程,或创建执行相同操作的插件。

评论


@Thomas Kapler-感谢您的回答,但我希望与众不同;我的做法并非“完全错误”。首先,我讨论的是您将在install.php中使用的相同代码,其次,还有其他一些用例,其中install.php不适用。是的,install.php有它的用途,但是它不会处理任何细节,也不会暗示您要使用的灵丹妙药。

– MikeSchinkel
2011-2-18在4:25



#5 楼

看一下这个安装脚本。 https://github.com/Pravdomil/WP-Quick-Install

我接受您的想法和一些代码,并创建您可能要搜索的内容。

功能已设置数据库,不同的语言,创建用户,设置基本站点设置,删除默认的插件和模板,下载安装并激活插件和主题,默认的头像,永久链接,静态首页。

随意贡献。