0

我正在使用Symfony 的控制台组件编写一些命令行工具,其中一个使用 WP-CLI 来设置 WordPress 站点。特别是使用wp option update我遇到了 JSON 和引号的问题。

例如,运行类似:

shell_exec("wp option update blogdescription ''");

结果在数据库中的文字''。事实上,每当我使用该命令时,如果它成功,我尝试在数据库中设置的任何内容都包含在单引号中。

然后是这样的:

$github_updater_args = [
            'github_access_token'=>'',
            'bitbucket_username'=>'username',
            'bitbucket_password'=>'password',
            'all-in-one-seo-populate-keywords'=>'1'
];
$github_updater_args = json_encode($github_updater_args);
var_dump($github_updater_args);
shell_exec("wp option update github_updater '$github_updater_args' --format=json");

转储结果:

string(200) "{"github_access_token":"","bitbucket_username":"devs@webspecdesign.com","bitbucket_password":"xxxxxxxxx","webspec-design-wordpress-core":"1","all-in-one-seo-populate-keywords":"1","webspec-smtp":"1"}"

这是有效的 JSON,但该wp命令导致以下结果:

Error: Invalid JSON: '{github_access_token:,bitbucket_username:username,bitbucket_password:password,all-in-one-seo-populate-keywords:1}'

您会注意到引号已被删除,我认为这就是它所抱怨的?或者这就是它转储错误的方式?

无论哪种方式,然后我决定对 JSON 进行硬编码,所以只需:

shell_exec('wp option update github_updater \'{"github_access_token": "", "bitbucket_username": "username", "bitbucket_password": "password"}\' --format=json');

这给了我以下错误:

错误:位置参数太多:,bitbucket_username:用户名,bitbucket_password:密码}'

我打赌这两个问题是相关的。我想这可能是一个 WP-CLI 问题,所以我在那里打开了一个问题,但没有得到答案就关闭了。然而,我越是盯着它看,我就越觉得它可能是 Symfony 的东西。也许我肯定需要使用流程组件而不是shell_exec?这就是它的设计目的吗?

更新:尝试了 Symfony 进程组件:

$process = new Process("wp option update blogdescription ''");
$process->run();

仍然得到我的两个报价。所以那里什么也没做。

4

1 回答 1

0

您正在寻找escapeshellarg()来转义您的 json 数据。escapeshellcmd()用于清理整个命令,而不是单个参数。尝试这样的事情:

$github_updater_args = [
    'github_access_token'=>'',
    'bitbucket_username'=>'username',
    'bitbucket_password'=>'password',
    'all-in-one-seo-populate-keywords'=>'1'
];
$github_updater_args = json_encode($github_updater_args);
$cmd = sprintf("wp option update github_updater %s --format=json", escapeshellarg($github_updater_args));
shell_exec($cmd);

编辑

您的问题中缺少某些内容,或者您​​正在执行的 CLI 脚本中存在错误。我写了两个快速测试 php 脚本来说明 json 转义工作正常。

测试.php

<?php

$github_updater_args = [
    'github_access_token'=>'',
    'bitbucket_username'=>'username',
    'bitbucket_password'=>'password',
    'all-in-one-seo-populate-keywords'=>'1'
];
$github_updater_args = json_encode($github_updater_args);
$cmd = sprintf("php j.php %s", escapeshellarg($github_updater_args));
echo shell_exec($cmd);
echo PHP_EOL;

j.php

<?php

var_dump(json_decode($argv[1]));

输出

~$ php test.php
object(stdClass)#1 (4) {
  ["github_access_token"]=>
  string(0) ""
  ["bitbucket_username"]=>
  string(8) "username"
  ["bitbucket_password"]=>
  string(8) "password"
  ["all-in-one-seo-populate-keywords"]=>
  string(1) "1"
}
于 2015-11-02T14:46:05.900 回答