WordPress के बाहर एपीआई एपीआई (कमांड लाइन PHP)


13

मेरे पास एक PHP स्क्रिप्ट है जिसे मुझे क्रॉन जॉब के रूप में चलाने की आवश्यकता है। हालांकि इस स्क्रिप्ट WP एपीआई लिए उपयोग की जरूरत ( 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

वर्डप्रेस को उम्मीद है कि $ _SERVER चर को सेटअप किया जाएगा जैसे कि यह एक सामान्य वेब अनुरोध था। इसके अलावा, मैं आपको WP-blog-header.php के बजाय wp-load.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 कॉल करने के लिए सही फ़ाइल थी।
गोल्डनएपल्स

ठीक वैसा ही करने का प्रयास किया जैसा आपने सही के साथ यहाँ निर्दिष्ट किया है HTTP_HOST, SERVER_NAMEऔर REQUEST_URI। दोनों के साथ भी कोशिश की wp-blog-header.phpऔर wp-load.php। सभी उदाहरणों में मूल प्रश्न के अनुसार त्रुटि संदेश। मैं अपनी थीम डायरेक्टरी से इसे चला रहा हूं - क्या यह मायने रखता है?
ggutenberg

@goldenapples, उसे इसे लोड करने की आवश्यकता है, लेकिन उसे चलाने के लिए इसकी आवश्यकता नहीं है, जो कि wp-blog-header.php अतिरिक्त सामान है।
सुंदरबाँच

2
@dosboy, क्या आप इसे सर्वर या डेवलपमेंट कंप्यूटर पर mamp चला रहे हैं? यदि आप इसे एक ऐसे कंप्यूटर पर चला रहे हैं, जिसमें एक से अधिक इंस्टाल mysql है, तो एक मौका है कि आपका वातावरण कमांड लाइन से एक अलग php और mysql इंस्टेंस का उपयोग कर सकता है, जो सामान्य http अनुरोधों के साथ होता है।
सुंदरबाँच

हम्म ... चतुर सोच। यह एक देव बॉक्स है जो 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 स्क्रिप्ट से वर्डप्रेस तक पहुंचने के बारे में सबसे अधिक उपयोगी और अनोखी जानकारी है जो मुझे वेब पर मिली है। यह WP कोर 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');
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.