WordPress网站“标准”方面的初始化脚本?


23

我将不得不编写一个脚本来重新安装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

就是这样(尽管我可能会在其中找到更多信息。)

同样,我正在寻找可以复制和修改的代码,因此我不必自己弄清楚所有这些细节(这并不困难,既乏味又耗时)

哦,还有一两件事,我必须要在这开始现在这样越快越好!:-)


你能澄清一下Create Menus for Custom Pages吗?您是指某些页面上的单个菜单区域还是什么?
拉斯特

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

为什么要删除“ Hello Dolly”插件?我的意思是,我理解您为什么不希望它存在,但是它的存在并不影响站点的运行,并且,如果您使用自动升级功能,则每次发布新版本时,它都会被还原。
道格2010年

2
@Doug:为什么删除Hello Dolly?简单的答案:客户不希望在那里。:)
MikeSchinkel 2010年

Answers:


20

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

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

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

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

为站点创建用户

我们将使用中的wp_insert_user()功能/wp-includes/registration.php来创建用户。默认情况下不会加载此文件,因此我们必须通过调用自己加载该文件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”插件对不起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()由于文件权限或当前已激活插件的事实或您首先需要解决的某些其他原因而失败,但对于我们的用例,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');
$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()函数接受两(2)个参数:templatestylesheet。好吧,至少这就是参数的名称。您可能对术语父主题子主题更为熟悉。

假设您已经创建了一个带有默认TwentyTen主题的子主题,该主题带有WordPress作为父主题,并且将其称为“我的自定义主题”并将其放置到/wp-content/themes/my-custom-theme目录中,则可以使用以下调用激活您的主题:

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

但是,如果这不是儿童主题,该怎么办?这很简单,只需将目录slug / theme标识符 (即/wp-content/themes包含您主题的子目录的名称)作为两个参数传递。假设您要激活Ian D Stewart主题主题,您可以这样调用:switch_theme()

switch_theme('thematic', 'thematic');

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

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()函数希望传递子主题的名称,而不是目录slug / theme标识符。(名称来自主题style.css文件标题中的“主题名称:”部分。幸运的是,该get_current_theme()函数也返回了该名称。)

检查style.cssWordPress默认主题20的文件中的标头,我们看到它的名称实际上是'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(),它实际上使我们能够按其标头查找任何帖子类型(不幸的是,它的名字是因为您在尝试查找除以外的其他帖子类型时可能会忽略它'page')。

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

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

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

下一个...

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


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

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

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

4

设置所需的永久链接

我上周遇到的一个新的(很棒的)主题项目主要集中在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年

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

3

删除Hello Post(带评论)

wp_delete_post( 1, true );

直接来自wp_delete_post()文档。第二个参数完全替代它,而不是移到废纸trash。

创建菜单

这将创建新菜单,并将所有现有页面添加为菜单。我不确定它是否完全正确,我无法获得菜单项来显示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年

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

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

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

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

0

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

更好,更简便和标准化的方法是创建install.php并将其放在wp-content文件夹中-它会在安装过程中自动加载。

在那里,您可以放置​​自己的wp_install函数(因为wordpress自身的函数使用if(!function_exist)),因此您可以轻松地设置选项,激活插件,填写初始帖子,类别,标签,用户...

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


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

0

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

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

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

随意贡献。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.