2013-07-19 85 views
4

如何在不包含/需要wp_load或wp_config的情況下允許獨立頁面訪問WordPress功能在獨立插件中訪問WordPress功能頁面

我正在開發一個插件,需要允許訪問獨立的PHP頁面上的WP數據庫。這個頁面是一個簡單的curl請求,它返回一個完整的HTML頁面來顯示。對於上下文來說,插件是來自API的作業列表,然後需要鏈接到完整的作業廣告(完整的HTML頁面)。

我目前擁有的代碼是這樣的(在jobad.php頁):

$root = dirname(dirname(dirname(dirname(dirname(__FILE__))))); 
if (file_exists($root.'/wp-load.php')) { 
    require_once($root.'/wp-load.php'); 
} 

這是我從每一個答案,拉着我對如何做到這一點找到的代碼。包括來自wordpress.org自己的論壇。從這個stackoverflow的答案,例如:Using WPDB in standalone script?

它工作正常,但當我試圖提交插件到WP目錄,該插件被拒絕包含wp_load.php這種方式。這是有道理的爲什麼不,但我找不到任何其他方式使文件在WordPress中工作。

結果我需要

從由簡碼生成的列表,每個項目都有一個鏈接,將返回一個完整的HTML頁面。這個HTML頁面作爲cURL響應返回 - 不是URL(或者我可以讓每個鏈接驅動一個iframe)。對於情況下,我建立了鏈接這樣

$job_ad_link = plugins_url('includes/jobad.php' , dirname(__FILE__)); 
$job_id = //id from database; 
<a href="'.$job_ad_link.'?sgjobid='.$job_id.'">link</a> 

因此呼籲jobad.php將運行正確JOB_ID捲曲功能和顯示捲曲響應。我可以運行cURL作爲AJAX並避免這個問題,但因爲它是一個完整的HTML頁面,所以我不能簡單地在一個div中返回cURL。在一個iframe是尷尬的,如果我不想使用它(並沒有嘗試成功)。

爲了清楚起見,從WordPress的響應:

包括WP-config.php文件,WP-博客 - 的header.php,WP-load.php,或幾乎任何其他的WordPress>核心文件,您必須通過include直接調用並不是一個好主意,我們不能>批准這樣做的插件,除非它有很好的理由來加載文件。它很容易失敗,因爲並非所有的WordPress安裝都具有完全相同的文件結構。

回答

7

我實現了一些提供AJAX響應的插件,所以我還需要能夠從PHP腳本訪問WordPress函數。我解決了這個問題,包括wp_config.php文件,直到核心開發人員指出,如何正確解決它。

由於這種方式不僅限於AJAX調用,我還用於爲Facebook應用程序呈現一個頁面,該頁面需要訪問WordPress功能。所以,這裏是你如何做到這一點(只需把它放到你的函數中。PHP或成小插件):

function full_job_ad_page() { 
    global $wpdb; // this is how you get access to the database 

    // do what ever you want with the ability to access WordPress functions. 
    // asuming that the one item is an option, just get it with get_option 
    $value_from_db = get_option('curl_value'); 
    // asuming that the value is in any other table, use some $wpdb function 
    $value_from_db = $wpdb->get_var('SELECT value FROM table'); 
    // include the curl file echoing the response 
    include(plugin_dir_path(__FILE__) . 'curl-script.php'); 

    die(); // this is required to return a proper result 
} 
add_action('wp_ajax_full_job_ad_page', 'full_job_ad_page'); 
add_action('wp_ajax_nopriv_full_job_ad_page', 'full_job_ad_page'); 

比你可以使用這樣的URL來從功能的響應:

http://example.com/wp-admin/admin-ajax.php?action=full_job_ad_page

注: URL中的作用有匹配動作鉤子的第一個參數(wp_ajax_和wp_ajax_nopriv_之後的字符串)的末尾。

+0

由於這是一個插件,我只是簡單地將它包含在主插件文件中,對嗎?我需要訪問的唯一東西是數據庫中的一個項目傳遞給cURL腳本。整個cURL腳本會在這裏,還是在單獨的PHP文件中?而且,如果有,那麼我如何在PHP文件中返回結果?對不起,還沒有看到兩者如何連接。 – robooneus

+0

我已經改變了一下代碼並添加了一個實例URL來調用這個函數。該功能可以包含到您的郵件插件文件中。 – 2ndkauboy

+0

謝謝,解釋和代碼確實有幫助。 – robooneus

1

我想你會找到答案的這些文章:

AJAX in Plugins

5 tips for using AJAX in Wordpress

也期待在this question WordPress的答案,我在那裏找到了聯繫。

+0

我已經實現了AJAX來運行cURL之前,但不想在同一頁面上返回cURL請求。我想要將返回的HTML顯示在其自己的頁面上。在另一頁上的AJAX中運行請求不會讓我更多地訪問WP數據庫,而不是正常運行它。 – robooneus

+0

您沒有閱讀文章。 @ Kau-Boy的答案按照我給你的鏈接描述了一個解決方案。 –

0

怎麼樣?

<?php 
// Include WordPress 
define('WP_USE_THEMES', false); 
require('path_to_wp/wp-blog-header.php'); 
query_posts('page_id=63'); 
?> 

<?php while (have_posts()): the_post(); ?> 
    <h2><?php the_title(); ?></h2> 
    <?php the_content(); ?> 
<?php endwhile; ?> 
+0

由於同樣的原因,這不是一個好的解決方案,因爲不建議在任何文件中導入wp_config或wp_load。 – 2ndkauboy

+0

這是一個將Wordpress函數包含在靜態/獨立頁面中的標準方法! – Marty

+1

用戶過多的標準方法。但是根本不推薦! – 2ndkauboy