【问题标题】:Install WordPress using bash shell without visiting /wp-admin/install.php?在不访问 /wp-admin/install.php 的情况下使用 bash shell 安装 WordPress?
【发布时间】:2012-04-21 04:40:24
【问题描述】:

我编写了这个小 BASH 脚本,它创建一个文件夹、解压缩 Wordpress 并为网站创建一个数据库。

最后一步实际上是安装 Wordpress,这通常涉及将浏览器指向 install.php 并在 GUI 中填写表格。

我想从 BASH shell 中执行此操作,但不知道如何调用 wp_install() 并将所需的参数传递给它:

-admin_email
-admin_password
-weblog_title
-用户名

(install.php 中的第 85 行)

这是一个类似的问题,but in python

#!/bin/bash

#ask for the site name
echo "Site Name:"
read name
# make site directory under splogs
mkdir /var/www/splogs/$name
dirname="/var/www/splogs/$name"
#import wordpress from dropbox
cp -r  ~/Dropbox/Web/Resources/Wordpress/Core $dirname
cd $dirname
#unwrap the double wrap
mv Core/* ./ 
rm -r Core
mv wp-config-sample.php wp-config.php 
sed -i 's/database_name_here/'$name'/g' ./wp-config.php
sed -i 's/username_here/root/g' ./wp-config.php
sed -i 's/password_here/mypassword/g' ./wp-config.php
cp -r ~/Dropbox/Web/Resources/Wordpress/Themes/responsive $dirname/wp-content/t$
cd $dirname

CMD="create database $name"
mysql -uroot -pmypass -e "$CMD"

如何更改脚本以自动运行安装程序而无需打开浏览器?

【问题讨论】:

  • 您需要从命令行调用php 并运行install.php。如何通过命令行模拟表单post到页面,其实是php的问题,而不是bash的问题。
  • 假设你是对的——这更像是一个 php 的东西。不过,让所有东西都从 Bash 运行对我来说很重要。所以,你是说,我可以在脚本中发出: php ./install.php?step=2&weblog_title=[...] ?
  • 只需进行全新安装,将数据库转储到文件中,将其保存为模板文件,然后在每次新安装时使用它,只需简单地替换管理员邮件/管理员用户名/博客标题的字符串即可。这就是我很长时间以来的做法。无需通过 install.php。
  • 好点 strkol,我还没有想到复制/粘贴的方式。出于好奇,我仍然很想知道如何通过 shell 来做到这一点。但是,归根结底,任何允许自动化的方法都是关键——不要真正关心它是如何完成的。
  • Milk Miruku 关于使用 WPCLi 的建议很棒。一定要看看。

标签: wordpress bash installation automation


【解决方案1】:

查看 wp-cli,基于 Drupal 的 Drush

wp core install --url=url --title=site-title [--admin_name=username] --admin_email=email --admin_password=password

所有命令:

wp core [download|config|install|install_network|version|update|update_db]
wp db [create|drop|optimize|repair|connect|cli|query|export|import]
wp eval-file
wp eval
wp export [validate_arguments]
wp generate [posts|users]
wp home
wp option [add|update|delete|get]
wp plugin [activate|deactivate|toggle|path|update|uninstall|delete|status|install]
wp post-meta [get|delete|add|update]
wp post [create|update|delete]
wp theme [activate|path|delete|status|install|update]
wp transient [get|set|delete|type]
wp user-meta [get|delete|add|update]
wp user [list|delete|create|update]

【讨论】:

  • 嗨牛奶,这很棒。我已经使用 WPCLI 一段时间了,我不得不说,太棒了。我建议这个线程中的任何人从你的建议开始。好东西。
  • 干杯,很高兴我能帮助一些人。如果您想要进一步自动化,还有一个可与 WP-CLI 集成的 Puppet 模块 - github.com/rmccue/puppet-wp
  • 这很好,但 OP 要求提供 shell 解决方案,而不是其他依赖项。
【解决方案2】:

我遇到了和你一样的问题。我尝试了维克多的方法,但效果不佳。 我做了一些编辑,现在可以使用了! 您必须在脚本中添加 php 标签才能使代码正常工作,否则它只会回显到终端。

我的脚本直接调用upgrade.php的wp_install函数,完全绕过install.php(不需要修改其他文件)。

我将我的脚本命名为 script.sh,使其可执行,将其放入 wp-admin 目录,然后从终端运行它。

#!/usr/bin/php
<?php

function get_args()
{
        $args = array();
        for ($i=1; $i<count($_SERVER['argv']); $i++)
        {
                $arg = $_SERVER['argv'][$i];
                if ($arg{0} == '-' && $arg{1} != '-')
                {
                        for ($j=1; $j < strlen($arg); $j++)
                        {
                                $key = $arg{$j};
                                $value = $_SERVER['argv'][$i+1]{0} != '-' ? preg_replace(array('/^["\']/', '/["\']$/'), '', $_SERVER['argv'][++$i]) : true;
                                $args[$key] = $value;
                        }
                }
                else
                        $args[] = $arg;
        }

        return $args;
}

// read commandline arguments
$opt = get_args();

define( 'WP_INSTALLING', true );

/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );

/** Load WordPress Administration Upgrade API */
require_once( dirname( __FILE__ ) . '/includes/upgrade.php' );

/** Load wpdb */
require_once(dirname(dirname(__FILE__)) . '/wp-includes/wp-db.php');

$result = wp_install($opt[0], $opt[1], $opt[2], false, '', $opt[3]);
?>

我这样调用文件:# ./script.sh SiteName UserName email@address.com Password

【讨论】:

  • 糟糕,我忘记了 php 标签,但无论如何都不需要结束标签(只有第一个标签是强制性的) - 顺便说一句很好的解决方法 ;-)
  • 这仍然是一个有效的解决方案吗?上面的脚本有更新吗?
  • 使用最新的 wordpress 结果:PHP 致命错误:在 /var/www/html/wpsite1/wp-includes/class-phpmailer.php 中带有消息“无效地址:wordpress@”的未捕获异常 'phpmailerException' :946
【解决方案3】:

也许您需要稍微修改一下 Wordpress 原始安装程序。

首先,创建一个包装 php CLI 脚本,假设它的名字是wrapper.sh

#!/usr/bin/php -qC

function get_args()
{
        $args = array();
        for ($i=1; $i<count($_SERVER['argv']); $i++)
        {
                $arg = $_SERVER['argv'][$i];
                if ($arg{0} == '-' && $arg{1} != '-')
                {
                        for ($j=1; $j < strlen($arg); $j++)
                        {
                                $key = $arg{$j};
                                $value = $_SERVER['argv'][$i+1]{0} != '-' ? preg_replace(array('/^["\']/', '/["\']$/'), '', $_SERVER['argv'][++$i]) : true;
                                $args[$key] = $value;
                        }
                }
                else
                        $args[] = $arg;
        }

        return $args;
}

// read commandline arguments
$opt = get_args();

require "install.php";

这将允许您从命令行调用脚本,并将参数直接传递给 $opt 数字数组。

然后您可以按照您定义的严格顺序传递所需的变量,例如:

./wrapper.sh &lt;admin_email&gt; &lt;admin_password&gt; &lt;weblog_title&gt; &lt;user_name&gt;

install.php中你需要修改前面提到的vars的定义,如下:

global $opt;

$admin_email = $opt[0];
$admin_password = $opt[1];
$weblog_title = $opt[2];
$user_name = $opt[3];

然后让安装脚本完成它的工作。

这是一种未经测试的方法,并且对您需要的任何修改都非常开放。它主要是使用包装器 php/cli 脚本定义所需变量的指南,而无需通过 HTTP REQUEST / 查询字符串发送它们。也许这是一种完成工作的奇怪方式,所以请随时提供任何建设性/破坏性的反馈:-)

【讨论】:

  • 不错的详细建议。我将在一周内尝试此操作并反馈结果。谢谢。
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2017-02-04
相关资源
最近更新 更多