在WordPress外部访问WordPress API(命令行PHP)

时间:2010-12-14 作者:ggutenberg

我有一个PHP脚本,需要作为cron作业运行。但是,此脚本需要访问WP API(get_pages(), get_post_meta()get_permalink() 具体而言)。我已经按照http://codex.wordpress.org/Integrating_WordPress_with_Your_Website, 但无济于事。

代码:

require_once(\'../../../wp-blog-header.php\');
$args = array(
    \'child_of\' => 2083
);
$pages = get_pages($args);
但是当我跑步的时候php -q this_file.php 我从命令行获得以下输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Database Error</title>

</head>
<body>
    <h1>Error establishing a database connection</h1>
</body>
</html>
有人有什么想法/建议吗?

4 个回复
最合适的回答,由SO网友:prettyboymp 整理而成

WordPress希望将$\\u服务器变量设置为正常的web请求。此外,我建议加载wp-load。php代替wp博客标题。php,因为您可能不需要运行WP类或模板加载器。以下是我通常如何启动任何需要从命令行与WP交互的脚本:

define(\'DOING_AJAX\', true);
define(\'WP_USE_THEMES\', false);
$_SERVER = array(
    "HTTP_HOST" => "mysite.com",
    "SERVER_NAME" => "mysite.com",
    "REQUEST_URI" => "/",
    "REQUEST_METHOD" => "GET"
);
require_once(\'current/wp-load.php\');

Update 2018:

现在Wordpress根本不需要$\\u服务器。如果您只需要访问Wordpress API函数(例如读取/写入数据库),那么您只需要:

require_once(\'current/wp-load.php\');

# your code goes here...

SO网友:scribu

您可以使用WP-CLI eval-file 命令:

@daily /usr/bin/wp --path=/path/to/wp/ eval-file /path/to/that_file.php
这将首先加载WP环境,然后运行文件。

SO网友:sootsnoot

@prettyboymp接受的答案是关于从我在网上找到的php脚本访问wordpress的最有用和最独特的信息。WP core 3.7.1对我非常有效,然后3.9破坏了它。

问题是wp-load.php 改变了测试的方式REQUEST_URI 获取有效路径。但幸运的是,它还添加了一个新的过滤器,允许短路测试。

因此,为了恢复3.9中答案的功能,我添加了define(\'SUNRISE\', \'on\');wp-config.php, 并创建了文件wp-content/sunrise.php 使用此内容:

add_filter(\'pre_get_site_by_path\', \'my_pre_get_site_by_path\', 10, 5 /*null, $domain, $path, $segments, $paths*/ );
    function my_pre_get_site_by_path($input, $domain, $path, $segments, $paths) {
    if ($path == \'/\') {
        return get_blog_details(array(\'domain\' => $domain, \'path\' => PATH_CURRENT_SITE), false);
    }
    return $input;
}

SO网友:Frugan

@prettyboymp的答案的一个变体可能是:

if(in_array(php_sapi_name(), [\'cli\', \'cli-server\'])) {
    foreach($_SERVER as $key => $val) {
        if(!getenv($key))
             putenv($key.\'=\'.$val);
    }

    if(!getenv(\'HTTP_HOST\'))
        putenv(\'HTTP_HOST=\'.gethostname());

    if(!getenv(\'SERVER_ADDR\'))
        putenv(\'SERVER_ADDR=\'.gethostbyname(gethostname()));

    if(!getenv(\'REQUEST_URI\'))
        putenv(\'REQUEST_URI=/\');

    if(!getenv(\'REQUEST_METHOD\'))
        putenv(\'REQUEST_METHOD=GET\');
}

结束