WordPress 외부에서 WordPress API에 액세스 (명령 줄 PHP)


13

cron 작업으로 실행해야하는 PHP 스크립트가 있습니다. 그러나이 스크립트는 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>

생각이나 제안이 있으십니까?

답변:


17

WordPress는 $ _SERVER 변수가 일반 웹 요청 인 것처럼 설정 될 것으로 예상합니다. 또한 wp 클래스 또는 템플릿 로더가 필요하지 않기 때문에 wp-blog-header.php 대신 wp-load.php를로드하는 것이 좋습니다. 다음은 명령 줄에서 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');

2018 업데이트 :

요즘 Wordpress에는 $ _SERVER가 전혀 필요하지 않습니다. Wordpress API 함수에 액세스해야하는 경우 (예 : 데이터베이스에 대한 읽기 / 쓰기) 필요한 것은 다음과 같습니다.

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

# your code goes here...

를 사용하려면 get_pagesWP 클래스가 필요합니다. 따라서 wp-blog-header.php가 호출 할 올바른 파일이었습니다.
goldenapples

올바른 HTTP_HOST, SERVER_NAME및으로 여기에 지정한대로 정확하게 시도했습니다 REQUEST_URI. 또한 모두 시도 wp-blog-header.php하고 wp-load.php. 모든 경우에 원래 질문에 언급 된 것과 동일한 오류 메시지. 내 테마 디렉토리에서 이것을 실행하고 있습니다-그게 중요합니까?
ggutenberg

@goldenapples는로드 할 필요가 있지만 실행할 필요는 없습니다. 이는 wp-blog-header.php가 수행하는 추가 작업입니다.
prettyboymp

2
@dosboy, 당신은 서버 또는 mamp를 실행하는 개발 컴퓨터에서 이것을 실행하고 있습니까? 하나 이상의 mysql 인스턴스가 설치된 컴퓨터에서 실행하는 경우 환경이 일반적인 http 요청과는 다른 명령 및 PHP와 mysql 인스턴스를 사용하고있을 가능성이 있습니다.
prettyboymp

흠 ... 영리한 생각. MAMP를 실행하는 개발 상자입니다. 그러나 프로덕션 상자에 SSH로 액세스 할 수 없습니다. 스크립트가 작동하는지 확인하기 위해 개발자 컴퓨터에서 MySQL 인스턴스를 지정하는 방법에 대한 아이디어가 있습니까?
ggutenberg

4

wp-cli eval-file 명령을 사용할 수 있습니다 .

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

먼저 WP 환경을로드 한 다음 파일을 실행하십시오.


1

@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;
}

0

@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');
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.