Acesso à API do WordPress fora do WordPress (PHP de linha de comando)

12

Eu tenho um script PHP que preciso executar como um cron job. No entanto, esse script precisa de acesso à API do WP ( get_pages() , get_post_meta() e get_permalink() especificamente). Eu segui as instruções em enlace , mas sem sucesso.

Código:

require_once('../../../wp-blog-header.php');
$args = array(
    'child_of' => 2083
);
$pages = get_pages($args);

No entanto, quando executo php -q this_file.php da linha de comando, recebo a seguinte saída:

<!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>

Alguém tem algum pensamento / sugestão?

    
por ggutenberg 14.12.2010 / 15:47

4 respostas

17

O WordPress espera que as variáveis $ _SERVER sejam configuradas como se fosse uma solicitação normal da web. Além disso, eu sugeriria carregar wp-load.php em vez de wp-blog-header.php, já que você provavelmente não precisa da classe WP ou do carregador de template para rodar. Aqui está como eu normalmente inicio qualquer script que eu preciso para interagir com o WP na linha de comando:

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

Atualização 2018:

Hoje em dia o Wordpress não requer $ _SERVER. Se você simplesmente precisar acessar as funções da API do Wordpress (por exemplo, para ler / gravar no banco de dados), tudo que você precisa é:

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

# your code goes here...
    
por prettyboymp 14.12.2010 / 16:21
4

Você pode usar o comando wp-cli eval-file :

@daily /usr/bin/wp --path=/path/to/wp/ eval-file /path/to/that_file.php

Primeiro, carregará o ambiente do WP e, em seguida, executará o arquivo.

    
por scribu 25.06.2012 / 12:53
1

A resposta aceita por @prettyboymp é sobre as informações mais úteis e exclusivas sobre o acesso ao wordpress de um script php que eu encontrei na web. Funcionou perfeitamente para mim com o WP core 3.7.1, depois o 3.9 quebrou.

O problema foi que wp-load.php mudou a maneira como testou o REQUEST_URI para um caminho válido. Mas, felizmente, também adicionou um novo filtro para permitir o curto-circuito do teste.

Para restaurar a funcionalidade da resposta na versão 3.9, adicionei define('SUNRISE', 'on'); a wp-config.php e criei o arquivo wp-content/sunrise.php com este conteúdo:

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;
}
    
por sootsnoot 13.05.2014 / 16:23
0

Uma variação para a resposta do @ prettyboymp poderia ser:

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');
}
    
por ewake 30.07.2016 / 03:02