WordPress API'sine WordPress Dışından Erişme (komut satırı PHP)


13

Bir cron işi olarak çalıştırmak için gereken bir PHP komut dosyası var. Ancak bu komut dosyası WP API erişmesi gerektiği ( get_pages(), get_post_meta()ve get_permalink()özellikle). Http://codex.wordpress.org/Integrating_WordPress_with_Your_Website adresindeki talimatları uyguladım , ancak boşuna.

Kod:

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

Ancak php -q this_file.phpkomut satırından çalıştırdığınızda aşağıdaki çıktıyı alıyorum:

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

Kimse herhangi bir düşünce / öneriniz var mı?

Yanıtlar:


17

WordPress $ _SERVER değişkenlerinin normal bir web isteğiymiş gibi kurulmasını bekler. Ayrıca, muhtemelen çalıştırmak için WP sınıfına veya şablon yükleyiciye ihtiyacınız olmadığından wp-blog-header.php yerine wp-load.php yüklemenizi öneririm. Normalde komut satırından WP ile etkileşime girmem gereken herhangi bir komut dosyasını nasıl başlatacağım:

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

Güncelleme 2018:

Günümüzde Wordpress için $ _SERVER gerekmez. Wordpress API işlevlerine erişmeniz gerekiyorsa (örn. Veritabanına okuma / yazma), tek ihtiyacınız olan şey:

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

# your code goes here...

Kullanmak get_pagesiçin WP sınıfına ihtiyacı var. wp-blog-header.php çağrılacak doğru dosyaydı.
goldenapples

Doğru burada belirttiğiniz tam olarak yapıyor çalıştı HTTP_HOST, SERVER_NAMEve REQUEST_URI. Ayrıca hem ile çalıştı wp-blog-header.phpve wp-load.php. Her durumda orijinal soruda belirtilen hata mesajı. Bunu tema dizinimden çalıştırıyorum - önemli mi?
ggutenberg

@goldenapples, yüklemek için ihtiyacı var, ama çalıştırmak için ihtiyacı yok, bu wp-blog-header.php yaptığı ekstra şeyler.
prettyboymp

2
@dosboy, bunu bir sunucuda mı yoksa mamp çalışan bir geliştirme bilgisayarında mı çalıştırıyorsunuz? Birden fazla mysql örneği yüklü bir bilgisayarda çalıştırıyorsanız, ortamınızın komut satırından normal http isteklerinde olduğundan farklı bir php ve mysql örneği kullanıyor olma olasılığı vardır.
prettyboymp

Hmm ... akıllıca düşünme. MAMP çalıştıran bir geliştirici kutusudur. Ancak üretim kutusuna SSH erişimim yok. Herhangi bir fikir nasıl sadece script çalıştığından emin olmak için benim dev makinede bir MySQL örneği belirtmek için?
ggutenberg

4

Sen kullanabilirsiniz wp-cli eval-file komutu:

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

Bu önce WP ortamını yükler, ardından dosyanızı çalıştırır.


1

@Prettyboymp tarafından kabul edilen cevap, web'de bulduğum bir php betiğinden wordpress'e erişme hakkında en yararlı ve benzersiz bilgilerle ilgilidir. WP core 3.7.1 ile mükemmel çalıştı, sonra 3.9 kırdı.

Sorun, geçerli bir yolu wp-load.phptest etme biçimini değiştirmesiydi REQUEST_URI. Ancak neyse ki, testin kısa devre yapmasına izin vermek için yeni bir filtre de ekledi.

Bu nedenle, 3.9'daki yanıtın işlevselliğini geri yüklemek define('SUNRISE', 'on');için wp-config.php, wp-content/sunrise.phpbu içeriğe ekledim ve bu içerikle dosya oluşturdum :

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 cevabının bir varyasyonu şunlar olabilir:

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');
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.