เข้าถึง WordPress API นอก WordPress (PHP บรรทัดคำสั่ง)


13

ฉันมีสคริปต์ 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>

ใครมีความคิดเห็น / ข้อเสนอแนะ?

คำตอบ:


17

WordPress คาดว่าตัวแปร $ _SERVER จะตั้งค่าราวกับว่ามันเป็นคำขอเว็บปกติ นอกจากนี้ฉันขอแนะนำให้โหลด wp-load.php แทน wp-blog-header.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');

อัปเดต 2018:

ทุกวันนี้ Wordpress ไม่ต้องการ $ _SERVER เลย หากคุณต้องการเข้าถึงฟังก์ชัน Wordpress API (เช่นเพื่ออ่าน / เขียนไปยังฐานข้อมูล) สิ่งที่คุณต้องมีคือ:

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

# your code goes here...

ในการใช้get_pagesเขาต้องมีคลาส WP ดังนั้น 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 มากกว่าหนึ่งอินสแตนซ์มีโอกาสที่สภาพแวดล้อมของคุณอาจใช้อินสแตนซ์ php และ mysql อื่นจากบรรทัดคำสั่งมากกว่าที่ทำกับคำขอ HTTP ปกติ
prettyboymp

อืม ... คิดอย่างฉลาด มันเป็นกล่อง dev ที่ใช้ MAMP แต่ฉันไม่สามารถเข้าถึง SSH ในกล่องผลิตของฉันได้ มีความคิดวิธีระบุอินสแตนซ์ MySQL บนเครื่อง dev ของฉันเพียงเพื่อให้แน่ใจว่าสคริปต์ทำงานได้หรือไม่
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 ที่ฉันพบบนเว็บ มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันด้วย 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.